From b24b6a83653f1b53237288215cbff94ffeb2dc56 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 15 May 2020 15:48:06 -0700 Subject: [PATCH] freedreno/ir3/group: fix for half-regs If we're inserting a mov to resolve a conflict between meta:collect's (ie. for .zyx type swizzles, etc), we should use the correct precision. Signed-off-by: Rob Clark Part-of: --- src/freedreno/ir3/ir3.h | 4 +++- src/freedreno/ir3/ir3_group.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h index 79a40a12293..d039a4191a8 100644 --- a/src/freedreno/ir3/ir3.h +++ b/src/freedreno/ir3/ir3.h @@ -1345,7 +1345,9 @@ static inline struct ir3_instruction * ir3_MOV(struct ir3_block *block, struct ir3_instruction *src, type_t type) { struct ir3_instruction *instr = ir3_instr_create(block, OPC_MOV); - __ssa_dst(instr); + unsigned flags = (type_size(type) < 32) ? IR3_REG_HALF : 0; + + __ssa_dst(instr)->flags |= flags; if (src->regs[0]->flags & IR3_REG_ARRAY) { struct ir3_register *src_reg = __ssa_src(instr, src, IR3_REG_ARRAY); src_reg->array = src->regs[0]->array; diff --git a/src/freedreno/ir3/ir3_group.c b/src/freedreno/ir3/ir3_group.c index 35f63b79b24..182afde222a 100644 --- a/src/freedreno/ir3/ir3_group.c +++ b/src/freedreno/ir3/ir3_group.c @@ -34,7 +34,9 @@ static void insert_mov(struct ir3_instruction *collect, int idx) { struct ir3_instruction *src = ssa(collect->regs[idx+1]); - struct ir3_instruction *mov = ir3_MOV(src->block, src, TYPE_F32); + struct ir3_instruction *mov = ir3_MOV(src->block, src, + (collect->regs[idx+1]->flags & IR3_REG_HALF) ? TYPE_U16 : TYPE_U32); + collect->regs[idx+1]->instr = mov; /* if collect and src are in the same block, move the inserted mov -- 2.30.2