ir3.c revision 4317c4e6e05f84a985ff76a7f66e506681d8e37f
12855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* 24317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark * Copyright (c) 2012 Rob Clark <robdclark@gmail.com> 32855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 42855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Permission is hereby granted, free of charge, to any person obtaining a 52855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * copy of this software and associated documentation files (the "Software"), 62855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * to deal in the Software without restriction, including without limitation 72855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * and/or sell copies of the Software, and to permit persons to whom the 92855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software is furnished to do so, subject to the following conditions: 102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * The above copyright notice and this permission notice (including the next 122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * paragraph) shall be included in all copies or substantial portions of the 132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software. 142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * SOFTWARE. 222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "ir-a3xx.h" 252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdlib.h> 272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdio.h> 282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <string.h> 292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <assert.h> 302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdbool.h> 312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <errno.h> 322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "freedreno_util.h" 342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include "instr-a3xx.h" 352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* simple allocator to carve allocations out of an up-front allocated heap, 372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * so that we can free everything easily in one shot. 382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void * ir3_alloc(struct ir3_shader *shader, int sz) 402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark void *ptr = &shader->heap[shader->heap_idx]; 422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark shader->heap_idx += align(sz, 4); 432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return ptr; 442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstruct ir3_shader * ir3_shader_create(void) 472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return calloc(1, sizeof(struct ir3_shader)); 492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkvoid ir3_shader_destroy(struct ir3_shader *shader) 522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark free(shader); 542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define iassert(cond) do { \ 572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (!(cond)) { \ 582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(cond); \ 592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return -1; \ 602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } } while (0) 612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic uint32_t reg(struct ir3_register *reg, struct ir3_shader_info *info, 632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat, uint32_t valid_flags) 642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark reg_t val = { .dummy32 = 0 }; 662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(!(reg->flags & ~valid_flags)); 682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (!(reg->flags & IR3_REG_R)) 702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark repeat = 0; 712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (reg->flags & IR3_REG_IMMED) { 732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark val.iim_val = reg->iim_val; 742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int8_t max = (reg->num + repeat) >> 2; 762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark val.comp = reg->num & 0x3; 782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark val.num = reg->num >> 2; 792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (reg->flags & IR3_REG_CONST) { 812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_const = MAX2(info->max_const, max); 822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if ((max != REG_A0) && (max != REG_P0)) { 832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (reg->flags & IR3_REG_HALF) { 842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_half_reg = MAX2(info->max_half_reg, max); 852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_reg = MAX2(info->max_reg, max); 872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return val.dummy32; 922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat0(struct ir3_instruction *instr, void *ptr, 952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t *cat0 = ptr; 982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->immed = instr->cat0.immed; 1002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->repeat = instr->repeat; 1012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->ss = !!(instr->flags & IR3_INSTR_SS); 1022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->inv = instr->cat0.inv; 1032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->comp = instr->cat0.comp; 1042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->opc = instr->opc; 1052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 1062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->sync = !!(instr->flags & IR3_INSTR_SY); 1072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat0->opc_cat = 0; 1082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 1102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic uint32_t type_flags(type_t type) 1132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (type_size(type) == 32) ? 0 : IR3_REG_HALF; 1152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat1(struct ir3_instruction *instr, void *ptr, 1182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 1192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 1212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src = instr->regs[1]; 1222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t *cat1 = ptr; 1232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(instr->regs_count == 2); 1252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((dst->flags ^ type_flags(instr->cat1.dst_type)) & IR3_REG_HALF)); 1262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert((src->flags & IR3_REG_IMMED) || 1272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark !((src->flags ^ type_flags(instr->cat1.src_type)) & IR3_REG_HALF)); 1282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src->flags & IR3_REG_IMMED) { 1302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->iim_val = src->iim_val; 1312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src_im = 1; 1322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else if (src->flags & IR3_REG_RELATIV) { 1332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->off = src->offset; 1342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src_rel = 1; 1354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat1->src_rel_c = !!(src->flags & IR3_REG_CONST); 1362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 1372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src = reg(src, info, instr->repeat, 1384317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_IMMED | IR3_REG_R | 1394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_HALF); 1404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat1->src_c = !!(src->flags & IR3_REG_CONST); 1412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 1422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->dst = reg(dst, info, instr->repeat, 1442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark IR3_REG_RELATIV | IR3_REG_EVEN | 1452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark IR3_REG_R | IR3_REG_POS_INF | IR3_REG_HALF); 1462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->repeat = instr->repeat; 1472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src_r = !!(src->flags & IR3_REG_R); 1482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->ss = !!(instr->flags & IR3_INSTR_SS); 1494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat1->ul = !!(instr->flags & IR3_INSTR_UL); 1502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->dst_type = instr->cat1.dst_type; 1512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->dst_rel = !!(dst->flags & IR3_REG_RELATIV); 1522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->src_type = instr->cat1.src_type; 1532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->even = !!(dst->flags & IR3_REG_EVEN); 1542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->pos_inf = !!(dst->flags & IR3_REG_POS_INF); 1552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 1562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->sync = !!(instr->flags & IR3_INSTR_SY); 1572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat1->opc_cat = 1; 1582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 1602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 1612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat2(struct ir3_instruction *instr, void *ptr, 1632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 1642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 1652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 1662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src1 = instr->regs[1]; 1672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src2 = instr->regs[2]; 1682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t *cat2 = ptr; 1692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert((instr->regs_count == 2) || (instr->regs_count == 3)); 1712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (src1->flags & IR3_REG_RELATIV) { 1734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 10)); 1744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel1.src1 = reg(src1, info, instr->repeat, 1754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_RELATIV | IR3_REG_CONST | IR3_REG_NEGATE | 1764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_ABS | IR3_REG_R | IR3_REG_HALF); 1774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel1.src1_c = !!(src1->flags & IR3_REG_CONST); 1784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel1.src1_rel = 1; 1794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (src1->flags & IR3_REG_CONST) { 1804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 12)); 1814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c1.src1 = reg(src1, info, instr->repeat, 1824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | IR3_REG_ABS | 1834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 1844317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c1.src1_c = 1; 1854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 1864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 11)); 1874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src1 = reg(src1, info, instr->repeat, 1884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_IMMED | IR3_REG_NEGATE | IR3_REG_ABS | 1894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 1904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 1912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src1_im = !!(src1->flags & IR3_REG_IMMED); 1922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src1_neg = !!(src1->flags & IR3_REG_NEGATE); 1932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src1_abs = !!(src1->flags & IR3_REG_ABS); 1942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src1_r = !!(src1->flags & IR3_REG_R); 1952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src2) { 1972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert((src2->flags & IR3_REG_IMMED) || 1982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark !((src1->flags ^ src2->flags) & IR3_REG_HALF)); 1994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 2004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (src2->flags & IR3_REG_RELATIV) { 2014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src2->num < (1 << 10)); 2024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel2.src2 = reg(src2, info, instr->repeat, 2034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_RELATIV | IR3_REG_CONST | IR3_REG_NEGATE | 2044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_ABS | IR3_REG_R | IR3_REG_HALF); 2054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel2.src2_c = !!(src2->flags & IR3_REG_CONST); 2064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->rel2.src2_rel = 1; 2074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (src2->flags & IR3_REG_CONST) { 2084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src2->num < (1 << 12)); 2094317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c2.src2 = reg(src2, info, instr->repeat, 2104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | IR3_REG_ABS | 2114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 2124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->c2.src2_c = 1; 2134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 2144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src2->num < (1 << 11)); 2154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat2->src2 = reg(src2, info, instr->repeat, 2164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_IMMED | IR3_REG_NEGATE | IR3_REG_ABS | 2174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 2184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 2194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 2202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src2_im = !!(src2->flags & IR3_REG_IMMED); 2212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src2_neg = !!(src2->flags & IR3_REG_NEGATE); 2222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src2_abs = !!(src2->flags & IR3_REG_ABS); 2232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->src2_r = !!(src2->flags & IR3_REG_R); 2242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->dst = reg(dst, info, instr->repeat, 2272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark IR3_REG_R | IR3_REG_EI | IR3_REG_HALF); 2282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->repeat = instr->repeat; 2292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->ss = !!(instr->flags & IR3_INSTR_SS); 2302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->ul = !!(instr->flags & IR3_INSTR_UL); 2312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->dst_half = !!((src1->flags ^ dst->flags) & IR3_REG_HALF); 2322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->ei = !!(dst->flags & IR3_REG_EI); 2332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->cond = instr->cat2.condition; 2342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->full = ! (src1->flags & IR3_REG_HALF); 2352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->opc = instr->opc; 2362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 2372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->sync = !!(instr->flags & IR3_INSTR_SY); 2382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat2->opc_cat = 2; 2392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 2412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat3(struct ir3_instruction *instr, void *ptr, 2442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 2452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 2472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src1 = instr->regs[1]; 2482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src2 = instr->regs[2]; 2492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src3 = instr->regs[3]; 2502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t *cat3 = ptr; 2512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_flags = 0; 2522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (instr->opc) { 2542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_MAD_F16: 2552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_MAD_U16: 2562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_MAD_S16: 2572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SEL_B16: 2582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SEL_S16: 2592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SEL_F16: 2602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SAD_S16: 2612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_SAD_S32: // really?? 2622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark src_flags |= IR3_REG_HALF; 2632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 2642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 2652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 2662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(instr->regs_count == 4); 2692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src1->flags ^ src_flags) & IR3_REG_HALF)); 2702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src2->flags ^ src_flags) & IR3_REG_HALF)); 2712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src3->flags ^ src_flags) & IR3_REG_HALF)); 2722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (src1->flags & IR3_REG_RELATIV) { 2744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 10)); 2754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel1.src1 = reg(src1, info, instr->repeat, 2764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_RELATIV | IR3_REG_CONST | IR3_REG_NEGATE | 2774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 2784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel1.src1_c = !!(src1->flags & IR3_REG_CONST); 2794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel1.src1_rel = 1; 2804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (src1->flags & IR3_REG_CONST) { 2814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 12)); 2824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->c1.src1 = reg(src1, info, instr->repeat, 2834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | IR3_REG_R | 2844317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_HALF); 2854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->c1.src1_c = 1; 2864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 2874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src1->num < (1 << 11)); 2884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src1 = reg(src1, info, instr->repeat, 2894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_NEGATE | IR3_REG_R | IR3_REG_HALF); 2904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 2914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 2922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src1_neg = !!(src1->flags & IR3_REG_NEGATE); 2932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src1_r = !!(src1->flags & IR3_REG_R); 2942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src2 = reg(src2, info, instr->repeat, 2962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | 2972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark IR3_REG_R | IR3_REG_HALF); 2982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src2_c = !!(src2->flags & IR3_REG_CONST); 2992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src2_neg = !!(src2->flags & IR3_REG_NEGATE); 3002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src2_r = !!(src2->flags & IR3_REG_R); 3012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 3034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (src3->flags & IR3_REG_RELATIV) { 3044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src3->num < (1 << 10)); 3054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel2.src3 = reg(src3, info, instr->repeat, 3064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_RELATIV | IR3_REG_CONST | IR3_REG_NEGATE | 3074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 3084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel2.src3_c = !!(src3->flags & IR3_REG_CONST); 3094317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->rel2.src3_rel = 1; 3104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (src3->flags & IR3_REG_CONST) { 3114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src3->num < (1 << 12)); 3124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->c2.src3 = reg(src3, info, instr->repeat, 3134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | IR3_REG_R | 3144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_HALF); 3154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->c2.src3_c = 1; 3164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src3->num < (1 << 11)); 3184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat3->src3 = reg(src3, info, instr->repeat, 3194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_NEGATE | IR3_REG_R | IR3_REG_HALF); 3204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 3222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src3_neg = !!(src3->flags & IR3_REG_NEGATE); 3232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->src3_r = !!(src3->flags & IR3_REG_R); 3242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF); 3262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->repeat = instr->repeat; 3272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->ss = !!(instr->flags & IR3_INSTR_SS); 3282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->ul = !!(instr->flags & IR3_INSTR_UL); 3292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->dst_half = !!((src_flags ^ dst->flags) & IR3_REG_HALF); 3302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->opc = instr->opc; 3312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 3322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->sync = !!(instr->flags & IR3_INSTR_SY); 3332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat3->opc_cat = 3; 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 3362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 3372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat4(struct ir3_instruction *instr, void *ptr, 3392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 3402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 3412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 3422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src = instr->regs[1]; 3432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t *cat4 = ptr; 3442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(instr->regs_count == 2); 3462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark if (src->flags & IR3_REG_RELATIV) { 3484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src->num < (1 << 10)); 3494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->rel.src = reg(src, info, instr->repeat, 3504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_RELATIV | IR3_REG_CONST | IR3_REG_NEGATE | 3514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_ABS | IR3_REG_R | IR3_REG_HALF); 3524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->rel.src_c = !!(src->flags & IR3_REG_CONST); 3534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->rel.src_rel = 1; 3544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else if (src->flags & IR3_REG_CONST) { 3554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src->num < (1 << 12)); 3564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->c.src = reg(src, info, instr->repeat, 3574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_CONST | IR3_REG_NEGATE | IR3_REG_ABS | 3584317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 3594317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->c.src_c = 1; 3604317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } else { 3614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark iassert(src->num < (1 << 11)); 3624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark cat4->src = reg(src, info, instr->repeat, 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_IMMED | IR3_REG_NEGATE | IR3_REG_ABS | 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark IR3_REG_R | IR3_REG_HALF); 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 3672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->src_im = !!(src->flags & IR3_REG_IMMED); 3682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->src_neg = !!(src->flags & IR3_REG_NEGATE); 3692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->src_abs = !!(src->flags & IR3_REG_ABS); 3702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->src_r = !!(src->flags & IR3_REG_R); 3712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF); 3732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->repeat = instr->repeat; 3742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->ss = !!(instr->flags & IR3_INSTR_SS); 3752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->ul = !!(instr->flags & IR3_INSTR_UL); 3762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->dst_half = !!((src->flags ^ dst->flags) & IR3_REG_HALF); 3772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->full = ! (src->flags & IR3_REG_HALF); 3782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->opc = instr->opc; 3792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 3802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->sync = !!(instr->flags & IR3_INSTR_SY); 3812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat4->opc_cat = 4; 3822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 3842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 3852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat5(struct ir3_instruction *instr, void *ptr, 3872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 3882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 3892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 3902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src1 = instr->regs[1]; 3912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src2 = instr->regs[2]; 3922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src3 = instr->regs[3]; 3932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t *cat5 = ptr; 3942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((dst->flags ^ type_flags(instr->cat5.type)) & IR3_REG_HALF)); 3962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src1) { 3982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->full = ! (src1->flags & IR3_REG_HALF); 3992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->src1 = reg(src1, info, instr->repeat, IR3_REG_HALF); 4002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (instr->flags & IR3_INSTR_S2EN) { 4042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src2) { 4052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src1->flags ^ src2->flags) & IR3_REG_HALF)); 4062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->s2en.src2 = reg(src2, info, instr->repeat, IR3_REG_HALF); 4072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src3) { 4092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(src3->flags & IR3_REG_HALF); 4102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->s2en.src3 = reg(src3, info, instr->repeat, IR3_REG_HALF); 4112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!(instr->cat5.samp | instr->cat5.tex)); 4132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } else { 4142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!src3); 4152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (src2) { 4162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src1->flags ^ src2->flags) & IR3_REG_HALF)); 4172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->norm.src2 = reg(src2, info, instr->repeat, IR3_REG_HALF); 4182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->norm.samp = instr->cat5.samp; 4202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->norm.tex = instr->cat5.tex; 4212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF); 4242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->wrmask = dst->wrmask; 4252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->type = instr->cat5.type; 4262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_3d = !!(instr->flags & IR3_INSTR_3D); 4272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_a = !!(instr->flags & IR3_INSTR_A); 4282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_s = !!(instr->flags & IR3_INSTR_S); 4292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_s2en = !!(instr->flags & IR3_INSTR_S2EN); 4302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_o = !!(instr->flags & IR3_INSTR_O); 4312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->is_p = !!(instr->flags & IR3_INSTR_P); 4322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->opc = instr->opc; 4332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 4342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->sync = !!(instr->flags & IR3_INSTR_SY); 4352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat5->opc_cat = 5; 4362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 4382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 4392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int emit_cat6(struct ir3_instruction *instr, void *ptr, 4412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) 4422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 4432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *dst = instr->regs[0]; 4442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *src = instr->regs[1]; 4452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t *cat6 = ptr; 4462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(instr->regs_count == 2); 4482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (instr->opc) { 4502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* load instructions: */ 4512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDG: 4522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDP: 4532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDL: 4542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDLW: 4552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_LDLV: 4562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_PREFETCH: { 4572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6a_t *cat6a = ptr; 4582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((dst->flags ^ type_flags(instr->cat6.type)) & IR3_REG_HALF)); 4602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6a->must_be_one1 = 1; 4622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6a->must_be_one2 = 1; 4632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6a->off = instr->cat6.offset; 4642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6a->src = reg(src, info, instr->repeat, 0); 4652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6a->dst = reg(dst, info, instr->repeat, IR3_REG_R | IR3_REG_HALF); 4662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 4672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* store instructions: */ 4692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STG: 4702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STP: 4712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STL: 4722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STLW: 4732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case OPC_STI: { 4742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6b_t *cat6b = ptr; 4752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_flags = type_flags(instr->cat6.type); 4762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_flags = (instr->opc == OPC_STI) ? IR3_REG_HALF : 0; 4772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark iassert(!((src->flags ^ src_flags) & IR3_REG_HALF)); 4792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->must_be_one1 = 1; 4812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->must_be_one2 = 1; 4822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->src = reg(src, info, instr->repeat, src_flags); 4832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->off_hi = instr->cat6.offset >> 8; 4842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->off = instr->cat6.offset; 4852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6b->dst = reg(dst, info, instr->repeat, IR3_REG_R | dst_flags); 4862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 4882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 4902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // TODO 4912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark break; 4922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 4932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->iim_val = instr->cat6.iim_val; 4952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->type = instr->cat6.type; 4962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->opc = instr->opc; 4972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->jmp_tgt = !!(instr->flags & IR3_INSTR_JP); 4982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->sync = !!(instr->flags & IR3_INSTR_SY); 4992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark cat6->opc_cat = 6; 5002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 5022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic int (*emit[])(struct ir3_instruction *instr, void *ptr, 5052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_shader_info *info) = { 5062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark emit_cat0, emit_cat1, emit_cat2, emit_cat3, emit_cat4, emit_cat5, emit_cat6, 5072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark}; 5082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkvoid * ir3_shader_assemble(struct ir3_shader *shader, struct ir3_shader_info *info) 5102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t *ptr, *dwords; 5122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t i; 5132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_reg = -1; 5152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_half_reg = -1; 5162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->max_const = -1; 5172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* need a integer number of instruction "groups" (sets of four 5192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * instructions), so pad out w/ NOPs if needed: 5202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 5212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark while (shader->instrs_count != align(shader->instrs_count, 4)) 5222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ir3_instr_create(shader, 0, OPC_NOP); 5232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* each instruction is 64bits: */ 5252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark info->sizedwords = 2 * shader->instrs_count; 5262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ptr = dwords = calloc(1, 4 * info->sizedwords); 5282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark for (i = 0; i < shader->instrs_count; i++) { 5302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_instruction *instr = shader->instrs[i]; 5312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int ret = emit[instr->category](instr, dwords, info); 5322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark if (ret) 5332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark goto fail; 5342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark dwords += 2; 5352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 5362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return ptr; 5382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkfail: 5402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark free(ptr); 5412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return NULL; 5422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic struct ir3_register * reg_create(struct ir3_shader *shader, 5452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int num, int flags) 5462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *reg = 5482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ir3_alloc(shader, sizeof(struct ir3_register)); 5492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark reg->flags = flags; 5502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark reg->num = num; 5512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return reg; 5522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic void insert_instr(struct ir3_shader *shader, 5552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_instruction *instr) 5562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(shader->instrs_count < ARRAY_SIZE(shader->instrs)); 5582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark shader->instrs[shader->instrs_count++] = instr; 5592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstruct ir3_instruction * ir3_instr_create(struct ir3_shader *shader, 5622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int category, opc_t opc) 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_instruction *instr = 5652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ir3_alloc(shader, sizeof(struct ir3_instruction)); 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr->shader = shader; 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr->category = category; 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr->opc = opc; 5692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark insert_instr(shader, instr); 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return instr; 5712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstruct ir3_instruction * ir3_instr_clone(struct ir3_instruction *instr) 5742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_instruction *new_instr = 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ir3_alloc(instr->shader, sizeof(struct ir3_instruction)); 5772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark unsigned i; 5782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *new_instr = *instr; 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark insert_instr(instr->shader, new_instr); 5812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* clone registers: */ 5832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark new_instr->regs_count = 0; 5842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark for (i = 0; i < instr->regs_count; i++) { 5852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *reg = instr->regs[i]; 5862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *new_reg = 5872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark ir3_reg_create(new_instr, reg->num, reg->flags); 5882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark *new_reg = *reg; 5892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 5902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return new_instr; 5922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 5932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstruct ir3_register * ir3_reg_create(struct ir3_instruction *instr, 5952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int num, int flags) 5962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 5972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct ir3_register *reg = reg_create(instr->shader, num, flags); 5982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(instr->regs_count < ARRAY_SIZE(instr->regs)); 5992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr->regs[instr->regs_count++] = reg; 6002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return reg; 6012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 602