freedreno/ir3/group: fix for half-regs
authorRob Clark <robdclark@chromium.org>
Fri, 15 May 2020 22:48:06 +0000 (15:48 -0700)
committerMarge Bot <eric+marge@anholt.net>
Tue, 19 May 2020 16:06:17 +0000 (16:06 +0000)
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 <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5048>

src/freedreno/ir3/ir3.h
src/freedreno/ir3/ir3_group.c

index 79a40a122932bb099e18ceca979b08b5faf2b4ec..d039a4191a8055d57e8ee6f9e8521257ec7a7f39 100644 (file)
@@ -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;
index 35f63b79b243dd5752f77e178086e798312baad0..182afde222adf50e761cbeef0f5bff32519d65e6 100644 (file)
@@ -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