From db879b034a131694a819da16ddcb680cd81597a8 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 31 Dec 2019 21:39:23 -0500 Subject: [PATCH] pan/midgard: Generalize IS_ALU and quadword_size There are more ALU tags, let's do some cleanup while we're at it. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/compiler.h | 3 +- src/panfrost/midgard/disassemble.c | 1 - src/panfrost/midgard/helpers.h | 23 +------- src/panfrost/midgard/midgard-parse.h | 70 ------------------------- src/panfrost/midgard/midgard_ops.c | 41 +++++++++++++++ src/panfrost/midgard/midgard_ops.h | 7 ++- src/panfrost/midgard/midgard_schedule.c | 2 +- src/panfrost/midgard/mir.c | 4 +- 8 files changed, 53 insertions(+), 98 deletions(-) delete mode 100644 src/panfrost/midgard/midgard-parse.h diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index 024aaf93f64..1ab0d4dd0d1 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -27,6 +27,7 @@ #include "midgard.h" #include "helpers.h" #include "midgard_compile.h" +#include "midgard_ops.h" #include "lcra.h" #include "util/hash_table.h" @@ -462,7 +463,7 @@ mir_exit_block(struct compiler_context *ctx) static inline bool mir_is_alu_bundle(midgard_bundle *bundle) { - return IS_ALU(bundle->tag); + return midgard_word_types[bundle->tag] == midgard_word_type_alu; } /* Registers/SSA are distinguish in the backend by the bottom-most bit */ diff --git a/src/panfrost/midgard/disassemble.c b/src/panfrost/midgard/disassemble.c index 115dfc5e676..eb0471bc90c 100644 --- a/src/panfrost/midgard/disassemble.c +++ b/src/panfrost/midgard/disassemble.c @@ -32,7 +32,6 @@ #include #include #include "midgard.h" -#include "midgard-parse.h" #include "midgard_ops.h" #include "midgard_quirks.h" #include "disassemble.h" diff --git a/src/panfrost/midgard/helpers.h b/src/panfrost/midgard/helpers.h index c41b6ed23c5..d2bfc18273e 100644 --- a/src/panfrost/midgard/helpers.h +++ b/src/panfrost/midgard/helpers.h @@ -136,28 +136,7 @@ #define TAG_ALU_12 0xA #define TAG_ALU_16 0xB -static inline int -quadword_size(int tag) -{ - switch (tag) { - case TAG_ALU_4: - case TAG_LOAD_STORE_4: - case TAG_TEXTURE_4: - case TAG_TEXTURE_4_VTX: - return 1; - case TAG_ALU_8: - return 2; - case TAG_ALU_12: - return 3; - case TAG_ALU_16: - return 4; - default: - unreachable("Unknown tag"); - } -} - -#define IS_ALU(tag) (tag == TAG_ALU_4 || tag == TAG_ALU_8 || \ - tag == TAG_ALU_12 || tag == TAG_ALU_16) +#define IS_ALU(tag) (tag >= TAG_ALU_4) /* Special register aliases */ diff --git a/src/panfrost/midgard/midgard-parse.h b/src/panfrost/midgard/midgard-parse.h deleted file mode 100644 index 5d134839406..00000000000 --- a/src/panfrost/midgard/midgard-parse.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Author(s): - * Connor Abbott - * Alyssa Rosenzweig - * - * Copyright (c) 2013 Connor Abbott (connor@abbott.cx) - * Copyright (c) 2018 Alyssa Rosenzweig (alyssa@rosenzweig.io) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef __midgard_parse_h__ -#define __midgard_parse_h__ - -/* Additional metadata for parsing Midgard binaries, not needed for compilation */ - -static midgard_word_type midgard_word_types[16] = { - midgard_word_type_unknown, /* 0x0 */ - midgard_word_type_unknown, /* 0x1 */ - midgard_word_type_texture, /* 0x2 */ - midgard_word_type_texture, /* 0x3 */ - midgard_word_type_unknown, /* 0x4 */ - midgard_word_type_load_store, /* 0x5 */ - midgard_word_type_unknown, /* 0x6 */ - midgard_word_type_unknown, /* 0x7 */ - midgard_word_type_alu, /* 0x8 */ - midgard_word_type_alu, /* 0x9 */ - midgard_word_type_alu, /* 0xA */ - midgard_word_type_alu, /* 0xB */ - midgard_word_type_alu, /* 0xC */ - midgard_word_type_alu, /* 0xD */ - midgard_word_type_alu, /* 0xE */ - midgard_word_type_alu, /* 0xF */ -}; - -static unsigned midgard_word_size[16] = { - 0, /* 0x0 */ - 0, /* 0x1 */ - 1, /* 0x2 */ - 1, /* 0x3 */ - 0, /* 0x4 */ - 1, /* 0x5 */ - 0, /* 0x6 */ - 0, /* 0x7 */ - 1, /* 0x8 */ - 2, /* 0x9 */ - 3, /* 0xA */ - 4, /* 0xB */ - 1, /* 0xC */ - 2, /* 0xD */ - 3, /* 0xE */ - 4, /* 0xF */ -}; - -#endif diff --git a/src/panfrost/midgard/midgard_ops.c b/src/panfrost/midgard/midgard_ops.c index 14c74f7433c..098a330887c 100644 --- a/src/panfrost/midgard/midgard_ops.c +++ b/src/panfrost/midgard/midgard_ops.c @@ -252,3 +252,44 @@ struct mir_ldst_op_props load_store_opcode_props[256] = { #undef M16 #undef M32 #undef M64 + +midgard_word_type midgard_word_types[16] = { + midgard_word_type_unknown, /* 0x0 */ + midgard_word_type_unknown, /* 0x1 */ + midgard_word_type_texture, /* 0x2 */ + midgard_word_type_texture, /* 0x3 */ + midgard_word_type_unknown, /* 0x4 */ + midgard_word_type_load_store, /* 0x5 */ + midgard_word_type_unknown, /* 0x6 */ + midgard_word_type_unknown, /* 0x7 */ + midgard_word_type_alu, /* 0x8 */ + midgard_word_type_alu, /* 0x9 */ + midgard_word_type_alu, /* 0xA */ + midgard_word_type_alu, /* 0xB */ + midgard_word_type_alu, /* 0xC */ + midgard_word_type_alu, /* 0xD */ + midgard_word_type_alu, /* 0xE */ + midgard_word_type_alu, /* 0xF */ +}; + +unsigned midgard_word_size[16] = { + 0, /* 0x0 */ + 0, /* 0x1 */ + 1, /* 0x2 */ + 1, /* 0x3 */ + 0, /* 0x4 */ + 1, /* 0x5 */ + 0, /* 0x6 */ + 0, /* 0x7 */ + 1, /* 0x8 */ + 2, /* 0x9 */ + 3, /* 0xA */ + 4, /* 0xB */ + 1, /* 0xC */ + 2, /* 0xD */ + 3, /* 0xE */ + 4, /* 0xF */ +}; + + + diff --git a/src/panfrost/midgard/midgard_ops.h b/src/panfrost/midgard/midgard_ops.h index 2befc374ee2..205ac968a8c 100644 --- a/src/panfrost/midgard/midgard_ops.h +++ b/src/panfrost/midgard/midgard_ops.h @@ -19,12 +19,17 @@ * THE SOFTWARE. */ +#ifndef __MIDGARD_OPS +#define __MIDGARD_OPS + #include "helpers.h" /* Forward declare */ extern struct mir_op_props alu_opcode_props[256]; extern struct mir_ldst_op_props load_store_opcode_props[256]; +extern midgard_word_type midgard_word_types[16]; +extern unsigned midgard_word_size[16]; #define OP_IS_STORE(op) (load_store_opcode_props[op].props & LDST_STORE) @@ -72,4 +77,4 @@ effective_writemask(midgard_vector_alu *alu, unsigned existing_mask) return existing_mask; }; - +#endif diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index a78bb901b43..e0425fd0578 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -1101,7 +1101,7 @@ schedule_block(compiler_context *ctx, midgard_block *block) if (bundle.has_blend_constant) blend_offset = block->quadword_count; - block->quadword_count += quadword_size(bundle.tag); + block->quadword_count += midgard_word_size[bundle.tag]; } /* We emitted bundles backwards; copy into the block in reverse-order */ diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index f892094afce..506bcabe656 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -574,7 +574,7 @@ mir_insert_instruction_before_scheduled( memcpy(bundles + before, &new, sizeof(new)); list_addtail(&new.instructions[0]->link, &before_bundle->instructions[0]->link); - block->quadword_count += quadword_size(new.tag); + block->quadword_count += midgard_word_size[new.tag]; } void @@ -599,7 +599,7 @@ mir_insert_instruction_after_scheduled( midgard_bundle new = mir_bundle_for_op(ctx, ins); memcpy(bundles + after + 1, &new, sizeof(new)); list_add(&new.instructions[0]->link, &after_bundle->instructions[after_bundle->instruction_count - 1]->link); - block->quadword_count += quadword_size(new.tag); + block->quadword_count += midgard_word_size[new.tag]; } /* Flip the first-two arguments of a (binary) op. Currently ALU -- 2.30.2