diff options
Diffstat (limited to 'src/panfrost')
-rw-r--r-- | src/panfrost/Makefile.sources | 1 | ||||
-rw-r--r-- | src/panfrost/bifrost/bi_special.c | 99 | ||||
-rw-r--r-- | src/panfrost/bifrost/bifrost_compile.c | 11 | ||||
-rw-r--r-- | src/panfrost/bifrost/compiler.h | 4 | ||||
-rw-r--r-- | src/panfrost/bifrost/meson.build | 1 |
5 files changed, 115 insertions, 1 deletions
diff --git a/src/panfrost/Makefile.sources b/src/panfrost/Makefile.sources index a92213a21ca..e5d1f11d5d6 100644 --- a/src/panfrost/Makefile.sources +++ b/src/panfrost/Makefile.sources @@ -5,6 +5,7 @@ bifrost_FILES := \ bifrost/bi_lower_combine.c \ bifrost/bi_tables.c \ bifrost/bi_schedule.c \ + bifrost/bi_special.c \ bifrost/bi_print.c \ bifrost/bi_print.h \ bifrost/bi_quirks.h \ diff --git a/src/panfrost/bifrost/bi_special.c b/src/panfrost/bifrost/bi_special.c new file mode 100644 index 00000000000..943f03380d8 --- /dev/null +++ b/src/panfrost/bifrost/bi_special.c @@ -0,0 +1,99 @@ +/* + * 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. + * + * Authors (Collabora): + * Alyssa Rosenzweig <[email protected]> + */ + +#include "compiler.h" + +/* Bifrost requires special functions to be lowered in various machine specific + * ways. The routines in this file are used in codegen for this. */ + +/* New Bifrost has a FEXP2_FAST instruction but requires an auxiliary + * parameter. */ + +static void +bi_emit_fexp2_new(bi_context *ctx, nir_alu_instr *instr) +{ + /* FMA_MSCALE T, X, 1.0, 0, 0x18 */ + + bi_instruction mscale = { + .type = BI_FMA, + .op = { .mscale = true }, + .dest = bi_make_temp(ctx), + .dest_type = nir_type_float32, + .writemask = 0xF, + .src = { + bir_src_index(&instr->src[0].src), + BIR_INDEX_CONSTANT | 0, + BIR_INDEX_ZERO, + BIR_INDEX_CONSTANT | 32, + }, + .src_types = { + nir_type_float32, + nir_type_float32, + nir_type_float32, + nir_type_int32, + }, + .constant = { + /* 0x3f80000000 = 1.0f as fp32 + * 24 = shift to multiply by 2^24 */ + .u64 = (0x3f800000) | (24ull << 32) + } + }; + + /* F2I_RTE T, T */ + + bi_instruction f2i = { + .type = BI_CONVERT, + .dest = bi_make_temp(ctx), + .dest_type = nir_type_int32, + .writemask = 0xF, + .src = { mscale.dest }, + .src_types = { nir_type_float32 }, + .roundmode = BIFROST_RTE + }; + + /* FEXP2_FAST T, T, X */ + + bi_instruction fexp = { + .type = BI_SPECIAL, + .op = { .special = BI_SPECIAL_EXP2_LOW }, + .dest = bir_dest_index(&instr->dest.dest), + .dest_type = nir_type_float32, + .writemask = 0xF, + .src = { f2i.dest, mscale.src[0] }, + .src_types = { nir_type_int32, nir_type_float32 }, + }; + + bi_emit(ctx, mscale); + bi_emit(ctx, f2i); + bi_emit(ctx, fexp); +} + +void +bi_emit_fexp2(bi_context *ctx, nir_alu_instr *instr) +{ + /* TODO: G71 */ + bi_emit_fexp2_new(ctx, instr); +} diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 53bb703aeaa..1f67f44ce01 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -526,7 +526,16 @@ bi_fuse_csel_cond(bi_instruction *csel, nir_alu_src cond, static void emit_alu(bi_context *ctx, nir_alu_instr *instr) { - /* Assume it's something we can handle normally */ + /* Try some special functions */ + switch (instr->op) { + case nir_op_fexp2: + bi_emit_fexp2(ctx, instr); + return; + default: + break; + } + + /* Otherwise, assume it's something we can handle normally */ bi_instruction alu = { .type = bi_class_for_nir_alu(instr->op), .dest = bir_dest_index(&instr->dest.dest), diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 2d3f1a13588..ec9a4add065 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -558,6 +558,10 @@ pan_next_block(pan_block *block) return list_first_entry(&(block->link), pan_block, link); } +/* Special functions */ + +void bi_emit_fexp2(bi_context *ctx, nir_alu_instr *instr); + /* BIR manipulation */ bool bi_has_outmod(bi_instruction *ins); diff --git a/src/panfrost/bifrost/meson.build b/src/panfrost/bifrost/meson.build index 8864951a638..775db12f975 100644 --- a/src/panfrost/bifrost/meson.build +++ b/src/panfrost/bifrost/meson.build @@ -28,6 +28,7 @@ libpanfrost_bifrost_files = files( 'bi_pack.c', 'bi_ra.c', 'bi_schedule.c', + 'bi_special.c', 'bi_tables.c', 'bir.c', 'bifrost_compile.c', |