diff options
author | Alyssa Rosenzweig <[email protected]> | 2020-04-13 17:32:58 -0400 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-04-13 22:32:40 +0000 |
commit | 640d69d1662b03f2d28319ede50be0bf3f6e9c4b (patch) | |
tree | dc59d9a0bf7f2296930f494715a4888cae1bf728 /src/panfrost | |
parent | 8cfe660326a2fb455bed0499c80f38f6f17f8f0e (diff) |
pan/bi: ADD packing for CONVERT
Signed-off-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4539>
Diffstat (limited to 'src/panfrost')
-rw-r--r-- | src/panfrost/bifrost/bi_pack.c | 25 | ||||
-rw-r--r-- | src/panfrost/bifrost/bifrost.h | 2 |
2 files changed, 22 insertions, 5 deletions
diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c index dc304f3d7d9..d42b6d9fbd8 100644 --- a/src/panfrost/bifrost/bi_pack.c +++ b/src/panfrost/bifrost/bi_pack.c @@ -740,7 +740,7 @@ bi_pack_fma_csel(bi_instruction *ins, struct bi_registers *regs) */ static unsigned -bi_pack_fma_convert(bi_instruction *ins, struct bi_registers *regs) +bi_pack_convert(bi_instruction *ins, struct bi_registers *regs, bool FMA) { nir_alu_type from_base = nir_alu_type_get_base_type(ins->src_types[0]); unsigned from_size = nir_alu_type_get_type_size(ins->src_types[0]); @@ -758,13 +758,23 @@ bi_pack_fma_convert(bi_instruction *ins, struct bi_registers *regs) /* f32 to f16 is special */ if (from_size == 32 && to_size == 16 && from_base == nir_type_float && to_base == from_base) { /* TODO: second vectorized source? */ - struct bifrost_fma_2src pack = { + struct bifrost_fma_2src pfma = { .src0 = bi_get_src(ins, regs, 0, true), .src1 = BIFROST_SRC_STAGE, /* 0 */ .op = BIFROST_FMA_FLOAT32_TO_16 }; - RETURN_PACKED(pack); + struct bifrost_add_2src padd = { + .src0 = bi_get_src(ins, regs, 0, true), + .src1 = BIFROST_SRC_STAGE, /* 0 */ + .op = BIFROST_ADD_FLOAT32_TO_16 + }; + + if (FMA) { + RETURN_PACKED(pfma); + } else { + RETURN_PACKED(padd); + } } /* Otherwise, figure out the mode */ @@ -822,7 +832,10 @@ bi_pack_fma_convert(bi_instruction *ins, struct bi_registers *regs) op |= 0x100; } - return bi_pack_fma_1src(ins, regs, BIFROST_FMA_CONVERT | op); + if (FMA) + return bi_pack_fma_1src(ins, regs, BIFROST_FMA_CONVERT | op); + else + return bi_pack_add_1src(ins, regs, BIFROST_ADD_CONVERT | op); } static unsigned @@ -838,7 +851,7 @@ bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs) case BI_BITWISE: return BIFROST_FMA_NOP; case BI_CONVERT: - return bi_pack_fma_convert(bundle.fma, regs); + return bi_pack_convert(bundle.fma, regs, true); case BI_CSEL: return bi_pack_fma_csel(bundle.fma, regs); case BI_FMA: @@ -1101,7 +1114,9 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs) case BI_BLEND: return bi_pack_add_blend(clause, bundle.add, regs); case BI_BITWISE: + return BIFROST_ADD_NOP; case BI_CONVERT: + return bi_pack_convert(bundle.add, regs, false); case BI_DISCARD: case BI_FREXP: case BI_ISUB: diff --git a/src/panfrost/bifrost/bifrost.h b/src/panfrost/bifrost/bifrost.h index 8700b18d436..5552dd92585 100644 --- a/src/panfrost/bifrost/bifrost.h +++ b/src/panfrost/bifrost/bifrost.h @@ -335,6 +335,7 @@ struct bifrost_shift_add { /* Two sources for vectorization */ #define BIFROST_FMA_FLOAT32_TO_16 (0xdd000 >> 3) +#define BIFROST_ADD_FLOAT32_TO_16 (0x0EC00 >> 3) enum bifrost_convert_mode { BIFROST_CONV_UNK0 = 0, @@ -361,6 +362,7 @@ enum bifrost_convert_mode { ((is_unsigned & 1) | ((roundmode & 3) << 1) | ((swizzle & 3) << 3) | ((mode & 7) << 5)) #define BIFROST_FMA_CONVERT (0xe0000) +#define BIFROST_ADD_CONVERT (0x07800) enum bifrost_ldst_type { BIFROST_LDST_F16 = 0, |