From 2a4e4477fc3ce3e3a914dad98b1129e90cbdf0b0 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 5 May 2020 17:58:16 -0400 Subject: [PATCH] pan/bi: Add bi_layout.c for clause layout helpers Figuring out what "shapes" of clauses are kosher happens during scheduling, not packing, but shouldn't distract the scheduler. So let's add a new file for these sorts of questions. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/Makefile.sources | 1 + src/panfrost/bifrost/bi_layout.c | 51 ++++++++++++++++++++++++++++++++ src/panfrost/bifrost/compiler.h | 4 +++ src/panfrost/bifrost/meson.build | 1 + 4 files changed, 57 insertions(+) create mode 100644 src/panfrost/bifrost/bi_layout.c diff --git a/src/panfrost/Makefile.sources b/src/panfrost/Makefile.sources index 083bd8d91af..865812e82a9 100644 --- a/src/panfrost/Makefile.sources +++ b/src/panfrost/Makefile.sources @@ -2,6 +2,7 @@ bifrost_FILES := \ bifrost/bifrost.h \ bifrost/bifrost_compile.c \ bifrost/bifrost_compile.h \ + bifrost/bi_layout.c \ bifrost/bi_liveness.c \ bifrost/bi_lower_combine.c \ bifrost/bi_tables.c \ diff --git a/src/panfrost/bifrost/bi_layout.c b/src/panfrost/bifrost/bi_layout.c new file mode 100644 index 00000000000..cc40d0398f9 --- /dev/null +++ b/src/panfrost/bifrost/bi_layout.c @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2020 Collabora, Ltd. + * + * 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 (including the next + * paragraph) 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. + */ + +#include "compiler.h" + +/* The scheduler packs multiple instructions into a clause (grouped as bundle), + * and the packing code takes in a clause and emits it to the wire. During + * scheduling, we need to lay out the instructions (bundles) and constants + * within the clause so constraints can be resolved during scheduling instead + * of failing packing. These routines will help building clauses from + * instructions so the scheduler can focus on the high-level algorithm, and + * manipulating clause layouts. + */ + +/* Helper to see if a bundle can be inserted. We must satisfy the invariant: + * + * constant_count + bundle_count <= 13 + * + * ...which is equivalent to the clause ending up with 8 or fewer quardwords. + * Inserting a bundle increases bundle_count by one, and if it reads a unique + * constant, it increases constant_count by one. + */ + +bool +bi_can_insert_bundle(bi_clause *clause, bool constant) +{ + unsigned constant_count = clause->constant_count + (constant ? 1 : 0); + unsigned bundle_count = clause->bundle_count + 1; + + return (constant_count + bundle_count) <= 13; +} diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 3ac958e51a9..eda8694079f 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -581,6 +581,10 @@ void bi_liveness_ins_update(uint16_t *live, bi_instruction *ins, unsigned max); void bi_invalidate_liveness(bi_context *ctx); bool bi_is_live_after(bi_context *ctx, bi_block *block, bi_instruction *start, int src); +/* Layout */ + +bool bi_can_insert_bundle(bi_clause *clause, bool constant); + /* Code emit */ void bi_pack(bi_context *ctx, struct util_dynarray *emission); diff --git a/src/panfrost/bifrost/meson.build b/src/panfrost/bifrost/meson.build index 775db12f975..6978fddca57 100644 --- a/src/panfrost/bifrost/meson.build +++ b/src/panfrost/bifrost/meson.build @@ -21,6 +21,7 @@ libpanfrost_bifrost_files = files( 'disassemble.c', + 'bi_layout.c', 'bi_liveness.c', 'bi_lower_combine.c', 'bi_print.c', -- 2.30.2