aboutsummaryrefslogtreecommitdiffstats
path: root/src/panfrost
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2020-04-13 17:32:58 -0400
committerMarge Bot <[email protected]>2020-04-13 22:32:40 +0000
commit640d69d1662b03f2d28319ede50be0bf3f6e9c4b (patch)
treedc59d9a0bf7f2296930f494715a4888cae1bf728 /src/panfrost
parent8cfe660326a2fb455bed0499c80f38f6f17f8f0e (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.c25
-rw-r--r--src/panfrost/bifrost/bifrost.h2
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,