From 799e021894a0e23e3017bf0cbb8780190f3e5646 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sun, 11 Nov 2018 10:55:55 -0500 Subject: [PATCH] nv50/ir/ra: improve condition for short regs, unify with cond for 16-bit Instead of the size restriction existing in two places, and potentially being applied twice, we move this together. Ops with 16-bit register addresses can only take a short reg, and ops with immediates can only take a short reg. Of course we leave the immediate 0 in place since we know that it will be replaced by r63/r127 down the line, so don't treat zeroes as an immediate. Signed-off-by: Ilia Mirkin Reviewed-by: Karol Herbst --- src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp index 87a39de99d6..8639c149b5a 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp @@ -66,10 +66,8 @@ public: inline int getMaxAssigned(DataFile f) const { return fill[f]; } - inline unsigned int getFileSize(DataFile f, uint8_t regSize) const + inline unsigned int getFileSize(DataFile f) const { - if (restrictedGPR16Range && f == FILE_GPR && regSize == 2) - return (last[f] + 1) / 2; return last[f] + 1; } @@ -846,9 +844,11 @@ GCRA::printNodeInfo() const static bool isShortRegOp(Instruction *insn) { - // Immediates are always in src1. Every other situation can be resolved by + // Immediates are always in src1 (except zeroes, which end up getting + // replaced with a zero reg). Every other situation can be resolved by // using a long encoding. - return insn->srcExists(1) && insn->src(1).getFile() == FILE_IMMEDIATE; + return insn->srcExists(1) && insn->src(1).getFile() == FILE_IMMEDIATE && + insn->getSrc(1)->reg.data.u64; } // Check if this LValue is ever used in an instruction that can't be encoded @@ -884,10 +884,10 @@ GCRA::RIG_Node::init(const RegisterSet& regs, LValue *lval) weight = std::numeric_limits::infinity(); degree = 0; - int size = regs.getFileSize(f, lval->reg.size); + int size = regs.getFileSize(f); // On nv50, we lose a bit of gpr encoding when there's an embedded // immediate. - if (regs.restrictedGPR16Range && f == FILE_GPR && isShortRegVal(lval)) + if (regs.restrictedGPR16Range && f == FILE_GPR && (lval->reg.size == 2 || isShortRegVal(lval))) size /= 2; degreeLimit = size; degreeLimit -= relDegree[1][colors] - 1; -- 2.30.2