11c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <stdlib.h> 21c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <string.h> 31c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include <sys/types.h> 41c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 51c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_compiler_util.h" 61c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "radeon_program.h" 71c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 8edf33079771d61b093c6bffd98094b197915d758Tom Stellard#include "r300_compiler_tests.h" 91c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "rc_test_helpers.h" 101c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák#include "unit_test.h" 111c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 121c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void test_rc_inst_can_use_presub( 131c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct test_result * result, 141c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int expected, 151c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const char * add_str, 161c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák const char * replace_str) 171c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 181c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct rc_instruction add_inst, replace_inst; 191c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák int ret; 201c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 211c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák test_begin(result); 221c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák init_rc_normal_instruction(&add_inst, add_str); 231c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák init_rc_normal_instruction(&replace_inst, replace_str); 241c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 251c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák ret = rc_inst_can_use_presub(&replace_inst, RC_PRESUB_ADD, 0, 261c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák &replace_inst.U.I.SrcReg[0], 271c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák &add_inst.U.I.SrcReg[0], &add_inst.U.I.SrcReg[1]); 281c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 291c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák test_check(result, ret == expected); 301c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 311c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 321c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšákstatic void test_runner_rc_inst_can_use_presub(struct test_result * result) 331c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 341c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 351c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* This tests the case where the source being replace has the same 361c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * register file and register index as another source register in the 371c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * CMP instruction. A previous version of this function was ignoring 381c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * all registers that shared the same file and index as the replacement 391c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * register when counting the number of source selects. 401c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 411c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * https://bugs.freedesktop.org/show_bug.cgi?id=36527 421c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 431c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák test_rc_inst_can_use_presub(result, 0, 441c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "ADD temp[0].z, temp[6].__x_, const[1].__x_;", 451c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "CMP temp[0].y, temp[0]._z__, const[0]._z__, temp[0]._y__;"); 461c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 471c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 481c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* Testing a random case that should fail 491c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 501c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * https://bugs.freedesktop.org/show_bug.cgi?id=36527 511c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 521c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák test_rc_inst_can_use_presub(result, 0, 531c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "ADD temp[3], temp[1], temp[2];", 541c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "MAD temp[1], temp[0], const[0].xxxx, -temp[3];"); 551c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 561c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák /* This tests the case where the arguments of the ADD 571c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * instruction share the same register file and index. Normally, we 581c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * would need only one source select for these two arguments, but since 591c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * they will be part of a presubtract operation we need to use the two 601c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * source selects that the presubtract instruction expects 611c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * (src0 and src1). 621c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * 631c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák * https://bugs.freedesktop.org/show_bug.cgi?id=36527 641c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák */ 651c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák test_rc_inst_can_use_presub(result, 0, 661c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "ADD temp[3].x, temp[0].x___, temp[0].x___;", 671c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák "MAD temp[0].xyz, temp[2].xyz_, -temp[3].xxx_, input[5].xyz_;"); 681c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 691c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák 70edf33079771d61b093c6bffd98094b197915d758Tom Stellardvoid radeon_compiler_util_run_tests() 711c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák{ 721c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák struct test tests[] = { 731c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák {"rc_inst_can_use_presub()", test_runner_rc_inst_can_use_presub}, 741c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák {NULL, NULL} 751c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák }; 761c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák run_tests(tests); 771c2c4ddbd1e97bfd13430521e5c09cb5ce8e36e6Marek Olšák} 78