freedreno/ir3: add helper to create immed of specified size
authorRob Clark <robdclark@gmail.com>
Sat, 31 Mar 2018 18:14:31 +0000 (14:14 -0400)
committerRob Clark <robdclark@gmail.com>
Sat, 31 Mar 2018 19:13:11 +0000 (15:13 -0400)
We'll also need to be able to create a half-precision immediate.  So
re-work create_immed().  Prep work for following patch.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index 337054cd1100597e223daa099d11cc82e6550d7f..1481510a5dd337e4a27fd92f1b3e01e9e8963d40 100644 (file)
@@ -505,19 +505,26 @@ put_dst(struct ir3_context *ctx, nir_dest *dst)
 }
 
 static struct ir3_instruction *
-create_immed(struct ir3_block *block, uint32_t val)
+create_immed_typed(struct ir3_block *block, uint32_t val, type_t type)
 {
        struct ir3_instruction *mov;
+       unsigned flags = (type_size(type) < 32) ? IR3_REG_HALF : 0;
 
        mov = ir3_instr_create(block, OPC_MOV);
-       mov->cat1.src_type = TYPE_U32;
-       mov->cat1.dst_type = TYPE_U32;
-       ir3_reg_create(mov, 0, 0);
+       mov->cat1.src_type = type;
+       mov->cat1.dst_type = type;
+       ir3_reg_create(mov, 0, flags);
        ir3_reg_create(mov, 0, IR3_REG_IMMED)->uim_val = val;
 
        return mov;
 }
 
+static struct ir3_instruction *
+create_immed(struct ir3_block *block, uint32_t val)
+{
+       return create_immed_typed(block, val, TYPE_U32);
+}
+
 static struct ir3_instruction *
 create_addr(struct ir3_block *block, struct ir3_instruction *src, int align)
 {