Path: blob/21.2-virgl/src/amd/compiler/tests/test_hard_clause.cpp
7097 views
/*1* Copyright © 2020 Valve Corporation2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*22*/23#include "helpers.h"24#include "sid.h"2526using namespace aco;2728static void create_mubuf(Temp desc=Temp(0, s8), unsigned vtx_binding=0)29{30Operand desc_op(desc);31desc_op.setFixed(PhysReg(0));32bld.mubuf(aco_opcode::buffer_load_dword, Definition(PhysReg(256), v1), desc_op,33Operand(PhysReg(256), v1), Operand::zero(), 0, false)34.instr->mubuf()35.vtx_binding = vtx_binding;36}3738static void create_mubuf_store()39{40bld.mubuf(aco_opcode::buffer_store_dword, Operand(PhysReg(0), s4), Operand(PhysReg(256), v1),41Operand(PhysReg(256), v1), Operand::zero(), 0, false);42}4344static void create_mtbuf(Temp desc=Temp(0, s8), unsigned vtx_binding=0)45{46Operand desc_op(desc);47desc_op.setFixed(PhysReg(0));48bld.mtbuf(aco_opcode::tbuffer_load_format_x, Definition(PhysReg(256), v1), desc_op,49Operand(PhysReg(256), v1), Operand::zero(), V_008F0C_BUF_DATA_FORMAT_32,50V_008F0C_BUF_NUM_FORMAT_FLOAT, 0, false)51.instr->mtbuf()52.vtx_binding = vtx_binding;53}5455static void create_flat()56{57bld.flat(aco_opcode::flat_load_dword, Definition(PhysReg(256), v1),58Operand(PhysReg(256), v2), Operand(s2));59}6061static void create_global()62{63bld.global(aco_opcode::global_load_dword, Definition(PhysReg(256), v1),64Operand(PhysReg(256), v2), Operand(s2));65}6667static void create_mimg(bool nsa, Temp desc=Temp(0, s8))68{69aco_ptr<MIMG_instruction> mimg{create_instruction<MIMG_instruction>(70aco_opcode::image_sample, Format::MIMG, 5, 1)};71mimg->definitions[0] = Definition(PhysReg(256), v1);72mimg->operands[0] = Operand(desc);73mimg->operands[0].setFixed(PhysReg(0));74mimg->operands[1] = Operand(PhysReg(0), s4);75mimg->operands[2] = Operand(v1);76for (unsigned i = 0; i < 2; i++)77mimg->operands[3 + i] = Operand(PhysReg(256 + (nsa ? i * 2 : i)), v1);78mimg->dmask = 0x1;79mimg->dim = ac_image_2d;8081bld.insert(std::move(mimg));82}8384static void create_smem()85{86bld.smem(aco_opcode::s_load_dword, Definition(PhysReg(0), s1), Operand(PhysReg(0), s2),87Operand::zero());88}8990static void create_smem_buffer(Temp desc=Temp(0, s4))91{92Operand desc_op(desc);93desc_op.setFixed(PhysReg(0));94bld.smem(aco_opcode::s_buffer_load_dword, Definition(PhysReg(0), s1), desc_op, Operand::zero());95}9697BEGIN_TEST(form_hard_clauses.type_restrictions)98if (!setup_cs(NULL, GFX10))99return;100101//>> p_unit_test 0102//! s_clause imm:1103//; search_re('image_sample')104//; search_re('image_sample')105bld.pseudo(aco_opcode::p_unit_test, Operand::zero());106create_mimg(false);107create_mimg(false);108109//>> p_unit_test 1110//! s_clause imm:1111//; search_re('buffer_load_dword')112//; search_re('buffer_load_dword')113bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));114create_mubuf();115create_mubuf();116117//>> p_unit_test 2118//! s_clause imm:1119//; search_re('global_load_dword')120//; search_re('global_load_dword')121bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));122create_global();123create_global();124125//>> p_unit_test 3126//! s_clause imm:1127//; search_re('flat_load_dword')128//; search_re('flat_load_dword')129bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));130create_flat();131create_flat();132133//>> p_unit_test 4134//! s_clause imm:1135//; search_re('s_load_dword')136//; search_re('s_load_dword')137bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));138create_smem();139create_smem();140141//>> p_unit_test 5142//; search_re('buffer_load_dword')143//; search_re('flat_load_dword')144bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));145create_mubuf();146create_flat();147148//>> p_unit_test 6149//; search_re('buffer_load_dword')150//; search_re('s_load_dword')151bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));152create_mubuf();153create_smem();154155//>> p_unit_test 7156//; search_re('flat_load_dword')157//; search_re('s_load_dword')158bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));159create_flat();160create_smem();161162finish_form_hard_clause_test();163END_TEST164165BEGIN_TEST(form_hard_clauses.size)166if (!setup_cs(NULL, GFX10))167return;168169//>> p_unit_test 0170//; search_re('s_load_dword')171bld.pseudo(aco_opcode::p_unit_test, Operand::zero());172create_smem();173174//>> p_unit_test 1175//! s_clause imm:63176//; for i in range(64):177//; search_re('s_load_dword')178bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));179for (unsigned i = 0; i < 64; i++)180create_smem();181182//>> p_unit_test 2183//! s_clause imm:63184//; for i in range(65):185//; search_re('s_load_dword')186bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));187for (unsigned i = 0; i < 65; i++)188create_smem();189190//>> p_unit_test 3191//! s_clause imm:63192//; for i in range(64):193//; search_re('s_load_dword')194//! s_clause imm:1195//; search_re('s_load_dword')196//; search_re('s_load_dword')197bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));198for (unsigned i = 0; i < 66; i++)199create_smem();200201finish_form_hard_clause_test();202END_TEST203204BEGIN_TEST(form_hard_clauses.nsa)205for (unsigned i = GFX10; i <= GFX10_3; i++) {206if (!setup_cs(NULL, (chip_class)i))207continue;208209//>> p_unit_test 0210//! s_clause imm:1211//; search_re('image_sample .* %0:v\[0\], %0:v\[1\]')212//; search_re('image_sample .* %0:v\[0\], %0:v\[1\]')213bld.pseudo(aco_opcode::p_unit_test, Operand::zero());214create_mimg(false);215create_mimg(false);216217//>> p_unit_test 1218//~gfx10_3! s_clause imm:1219//; search_re('image_sample .* %0:v\[0\], %0:v\[1\]')220//; search_re('image_sample .* %0:v\[0\], %0:v\[2\]')221bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));222create_mimg(false);223create_mimg(true);224225//>> p_unit_test 2226//~gfx10_3! s_clause imm:1227//; search_re('image_sample .* %0:v\[0\], %0:v\[2\]')228//; search_re('image_sample .* %0:v\[0\], %0:v\[2\]')229bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));230create_mimg(true);231create_mimg(true);232233finish_form_hard_clause_test();234}235END_TEST236237BEGIN_TEST(form_hard_clauses.heuristic)238if (!setup_cs(NULL, GFX10))239return;240241Temp img_desc0 = bld.tmp(s8);242Temp img_desc1 = bld.tmp(s8);243Temp buf_desc0 = bld.tmp(s4);244Temp buf_desc1 = bld.tmp(s4);245246/* Don't form clause with different descriptors */247//>> p_unit_test 0248//! s_clause imm:1249//; search_re('image_sample')250//; search_re('image_sample')251bld.pseudo(aco_opcode::p_unit_test, Operand::zero());252create_mimg(false, img_desc0);253create_mimg(false, img_desc0);254255//>> p_unit_test 1256//; search_re('image_sample')257//; search_re('image_sample')258bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));259create_mimg(false, img_desc0);260create_mimg(false, img_desc1);261262//>> p_unit_test 2263//! s_clause imm:1264//; search_re('buffer_load_dword')265//; search_re('buffer_load_dword')266bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));267create_mubuf(buf_desc0);268create_mubuf(buf_desc0);269270//>> p_unit_test 3271//; search_re('buffer_load_dword')272//; search_re('buffer_load_dword')273bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));274create_mubuf(buf_desc0);275create_mubuf(buf_desc1);276277//>> p_unit_test 4278//! s_clause imm:1279//; search_re('s_buffer_load_dword')280//; search_re('s_buffer_load_dword')281bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));282create_smem_buffer(buf_desc0);283create_smem_buffer(buf_desc0);284285//>> p_unit_test 5286//; search_re('s_buffer_load_dword')287//; search_re('s_buffer_load_dword')288bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));289create_smem_buffer(buf_desc0);290create_smem_buffer(buf_desc1);291292//>> p_unit_test 6293//; search_re('s_buffer_load_dword')294//; search_re('s_load_dword')295bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));296create_smem_buffer(buf_desc0);297create_smem();298299/* Only form clause between MUBUF and MTBUF if they load from the same binding. Ignore descriptor300* if they're te same binding.301*/302//>> p_unit_test 7303//; search_re('buffer_load_dword')304//; search_re('tbuffer_load_format_x')305bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));306create_mubuf(buf_desc0);307create_mtbuf(buf_desc0);308309//>> p_unit_test 8310//! s_clause imm:1311//; search_re('buffer_load_dword')312//; search_re('tbuffer_load_format_x')313bld.pseudo(aco_opcode::p_unit_test, Operand::c32(8u));314create_mubuf(buf_desc0, 1);315create_mtbuf(buf_desc0, 1);316317//>> p_unit_test 9318//! s_clause imm:1319//; search_re('buffer_load_dword')320//; search_re('tbuffer_load_format_x')321bld.pseudo(aco_opcode::p_unit_test, Operand::c32(9u));322create_mubuf(buf_desc0, 1);323create_mtbuf(buf_desc1, 1);324325finish_form_hard_clause_test();326END_TEST327328BEGIN_TEST(form_hard_clauses.stores)329if (!setup_cs(NULL, GFX10))330return;331332//>> p_unit_test 0333//; search_re('buffer_store_dword')334//; search_re('buffer_store_dword')335bld.pseudo(aco_opcode::p_unit_test, Operand::zero());336create_mubuf_store();337create_mubuf_store();338339//>> p_unit_test 1340//! s_clause imm:1341//; search_re('buffer_load_dword')342//; search_re('buffer_load_dword')343//; search_re('buffer_store_dword')344bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));345create_mubuf();346create_mubuf();347create_mubuf_store();348349//>> p_unit_test 2350//; search_re('buffer_store_dword')351//! s_clause imm:1352//; search_re('buffer_load_dword')353//; search_re('buffer_load_dword')354bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));355create_mubuf_store();356create_mubuf();357create_mubuf();358359/* Unclear whether this is the best behaviour */360//>> p_unit_test 3361//; search_re('buffer_load_dword')362//; search_re('buffer_store_dword')363//; search_re('buffer_load_dword')364bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));365create_mubuf();366create_mubuf_store();367create_mubuf();368369/* Unimportant pass limitations */370//>> p_unit_test 4371//; search_re('buffer_store_dword')372//! s_clause imm:62373//; for i in range(63):374//; search_re('buffer_load_dword')375//; search_re('buffer_load_dword')376bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));377create_mubuf_store();378for (unsigned i = 0; i < 64; i++)379create_mubuf();380381//>> p_unit_test 5382//! s_clause imm:63383//; for i in range(64):384//; search_re('buffer_load_dword')385//; search_re('buffer_store_dword')386bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));387for (unsigned i = 0; i < 64; i++)388create_mubuf();389create_mubuf_store();390391finish_form_hard_clause_test();392END_TEST393394395