1*f5c631daSSadaf Ebrahimi // Copyright 2014, VIXL authors 2*f5c631daSSadaf Ebrahimi // All rights reserved. 3*f5c631daSSadaf Ebrahimi // 4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi // 7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright notice, 10*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer in the documentation 11*f5c631daSSadaf Ebrahimi // and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may be 13*f5c631daSSadaf Ebrahimi // used to endorse or promote products derived from this software without 14*f5c631daSSadaf Ebrahimi // specific prior written permission. 15*f5c631daSSadaf Ebrahimi // 16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*f5c631daSSadaf Ebrahimi // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*f5c631daSSadaf Ebrahimi // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20*f5c631daSSadaf Ebrahimi // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f5c631daSSadaf Ebrahimi // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22*f5c631daSSadaf Ebrahimi // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23*f5c631daSSadaf Ebrahimi // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*f5c631daSSadaf Ebrahimi // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*f5c631daSSadaf Ebrahimi // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf Ebrahimi #ifndef TEST_TEST_H_ 28*f5c631daSSadaf Ebrahimi #define TEST_TEST_H_ 29*f5c631daSSadaf Ebrahimi 30*f5c631daSSadaf Ebrahimi #include "utils-vixl.h" 31*f5c631daSSadaf Ebrahimi #include "aarch64/instructions-aarch64.h" 32*f5c631daSSadaf Ebrahimi 33*f5c631daSSadaf Ebrahimi namespace vixl { 34*f5c631daSSadaf Ebrahimi 35*f5c631daSSadaf Ebrahimi // Each test is represented by a Test instance. 36*f5c631daSSadaf Ebrahimi // Tests are appended to a static linked list upon creation. 37*f5c631daSSadaf Ebrahimi class Test { 38*f5c631daSSadaf Ebrahimi typedef void(TestFunction)(); 39*f5c631daSSadaf Ebrahimi typedef void(TestFunctionWithConfig)(Test* config); 40*f5c631daSSadaf Ebrahimi 41*f5c631daSSadaf Ebrahimi public: 42*f5c631daSSadaf Ebrahimi // Most tests require no per-test configuration, and so take no arguments. A 43*f5c631daSSadaf Ebrahimi // few tests require dynamic configuration, and are passed a `Test` object. 44*f5c631daSSadaf Ebrahimi template <typename Fn> Test(const char * name,Fn * callback)45*f5c631daSSadaf Ebrahimi Test(const char* name, Fn* callback) 46*f5c631daSSadaf Ebrahimi : name_(name), sve_vl_(aarch64::kZRegMinSize), next_(NULL) { 47*f5c631daSSadaf Ebrahimi set_callback(callback); 48*f5c631daSSadaf Ebrahimi // Append this test to the linked list. 49*f5c631daSSadaf Ebrahimi if (first_ == NULL) { 50*f5c631daSSadaf Ebrahimi VIXL_ASSERT(last_ == NULL); 51*f5c631daSSadaf Ebrahimi first_ = this; 52*f5c631daSSadaf Ebrahimi } else { 53*f5c631daSSadaf Ebrahimi last_->next_ = this; 54*f5c631daSSadaf Ebrahimi } 55*f5c631daSSadaf Ebrahimi last_ = this; 56*f5c631daSSadaf Ebrahimi } 57*f5c631daSSadaf Ebrahimi MakeSVETest(int vl,const char * name,TestFunctionWithConfig * fn)58*f5c631daSSadaf Ebrahimi static Test* MakeSVETest(int vl, 59*f5c631daSSadaf Ebrahimi const char* name, 60*f5c631daSSadaf Ebrahimi TestFunctionWithConfig* fn) { 61*f5c631daSSadaf Ebrahimi // We never free this memory, but we need it to live for as long as the 62*f5c631daSSadaf Ebrahimi // static 63*f5c631daSSadaf Ebrahimi // linked list of tests, and this is the easiest way to do it. 64*f5c631daSSadaf Ebrahimi Test* test = new Test(name, fn); 65*f5c631daSSadaf Ebrahimi test->set_sve_vl_in_bits(vl); 66*f5c631daSSadaf Ebrahimi return test; 67*f5c631daSSadaf Ebrahimi } 68*f5c631daSSadaf Ebrahimi name()69*f5c631daSSadaf Ebrahimi const char* name() { return name_; } 70*f5c631daSSadaf Ebrahimi void run(); 71*f5c631daSSadaf Ebrahimi 72*f5c631daSSadaf Ebrahimi // The SVE vector length can be configured by each test, based on either 73*f5c631daSSadaf Ebrahimi // hardware feature detection (in the test itself) or Simulator configuration. sve_vl_in_bits()74*f5c631daSSadaf Ebrahimi int sve_vl_in_bits() const { return sve_vl_; } set_sve_vl_in_bits(unsigned sve_vl)75*f5c631daSSadaf Ebrahimi void set_sve_vl_in_bits(unsigned sve_vl) { 76*f5c631daSSadaf Ebrahimi VIXL_ASSERT(sve_vl >= aarch64::kZRegMinSize); 77*f5c631daSSadaf Ebrahimi VIXL_ASSERT(sve_vl <= aarch64::kZRegMaxSize); 78*f5c631daSSadaf Ebrahimi VIXL_ASSERT((sve_vl % aarch64::kZRegMinSize) == 0); 79*f5c631daSSadaf Ebrahimi sve_vl_ = sve_vl; 80*f5c631daSSadaf Ebrahimi } 81*f5c631daSSadaf Ebrahimi sve_vl_in_bytes()82*f5c631daSSadaf Ebrahimi int sve_vl_in_bytes() const { 83*f5c631daSSadaf Ebrahimi VIXL_ASSERT((sve_vl_ % kBitsPerByte) == 0); 84*f5c631daSSadaf Ebrahimi return sve_vl_ / kBitsPerByte; 85*f5c631daSSadaf Ebrahimi } 86*f5c631daSSadaf Ebrahimi first()87*f5c631daSSadaf Ebrahimi static Test* first() { return first_; } last()88*f5c631daSSadaf Ebrahimi static Test* last() { return last_; } next()89*f5c631daSSadaf Ebrahimi Test* next() { return next_; } verbose()90*f5c631daSSadaf Ebrahimi static bool verbose() { return verbose_; } set_verbose(bool value)91*f5c631daSSadaf Ebrahimi static void set_verbose(bool value) { verbose_ = value; } trace_sim()92*f5c631daSSadaf Ebrahimi static bool trace_sim() { return trace_sim_; } set_trace_sim(bool value)93*f5c631daSSadaf Ebrahimi static void set_trace_sim(bool value) { trace_sim_ = value; } trace_reg()94*f5c631daSSadaf Ebrahimi static bool trace_reg() { return trace_reg_; } set_trace_reg(bool value)95*f5c631daSSadaf Ebrahimi static void set_trace_reg(bool value) { trace_reg_ = value; } trace_write()96*f5c631daSSadaf Ebrahimi static bool trace_write() { return trace_write_; } set_trace_write(bool value)97*f5c631daSSadaf Ebrahimi static void set_trace_write(bool value) { trace_write_ = value; } trace_branch()98*f5c631daSSadaf Ebrahimi static bool trace_branch() { return trace_branch_; } set_trace_branch(bool value)99*f5c631daSSadaf Ebrahimi static void set_trace_branch(bool value) { trace_branch_ = value; } disassemble()100*f5c631daSSadaf Ebrahimi static bool disassemble() { return disassemble_; } set_disassemble(bool value)101*f5c631daSSadaf Ebrahimi static void set_disassemble(bool value) { disassemble_ = value; } disassemble_infrastructure()102*f5c631daSSadaf Ebrahimi static bool disassemble_infrastructure() { 103*f5c631daSSadaf Ebrahimi return disassemble_infrastructure_; 104*f5c631daSSadaf Ebrahimi } set_disassemble_infrastructure(bool value)105*f5c631daSSadaf Ebrahimi static void set_disassemble_infrastructure(bool value) { 106*f5c631daSSadaf Ebrahimi disassemble_infrastructure_ = value; 107*f5c631daSSadaf Ebrahimi } coloured_trace()108*f5c631daSSadaf Ebrahimi static bool coloured_trace() { return coloured_trace_; } set_coloured_trace(bool value)109*f5c631daSSadaf Ebrahimi static void set_coloured_trace(bool value) { coloured_trace_ = value; } generate_test_trace()110*f5c631daSSadaf Ebrahimi static bool generate_test_trace() { return generate_test_trace_; } set_generate_test_trace(bool value)111*f5c631daSSadaf Ebrahimi static void set_generate_test_trace(bool value) { 112*f5c631daSSadaf Ebrahimi generate_test_trace_ = value; 113*f5c631daSSadaf Ebrahimi } 114*f5c631daSSadaf Ebrahimi 115*f5c631daSSadaf Ebrahimi private: 116*f5c631daSSadaf Ebrahimi const char* name_; 117*f5c631daSSadaf Ebrahimi 118*f5c631daSSadaf Ebrahimi TestFunction* callback_; 119*f5c631daSSadaf Ebrahimi TestFunctionWithConfig* callback_with_config_; 120*f5c631daSSadaf Ebrahimi 121*f5c631daSSadaf Ebrahimi void set_callback(TestFunction* callback); 122*f5c631daSSadaf Ebrahimi void set_callback(TestFunctionWithConfig* callback); 123*f5c631daSSadaf Ebrahimi 124*f5c631daSSadaf Ebrahimi int sve_vl_; 125*f5c631daSSadaf Ebrahimi 126*f5c631daSSadaf Ebrahimi static Test* first_; 127*f5c631daSSadaf Ebrahimi static Test* last_; 128*f5c631daSSadaf Ebrahimi Test* next_; 129*f5c631daSSadaf Ebrahimi static bool verbose_; 130*f5c631daSSadaf Ebrahimi static bool trace_sim_; 131*f5c631daSSadaf Ebrahimi static bool trace_reg_; 132*f5c631daSSadaf Ebrahimi static bool trace_write_; 133*f5c631daSSadaf Ebrahimi static bool trace_branch_; 134*f5c631daSSadaf Ebrahimi static bool disassemble_; 135*f5c631daSSadaf Ebrahimi static bool disassemble_infrastructure_; 136*f5c631daSSadaf Ebrahimi static bool coloured_trace_; 137*f5c631daSSadaf Ebrahimi static bool generate_test_trace_; 138*f5c631daSSadaf Ebrahimi }; 139*f5c631daSSadaf Ebrahimi 140*f5c631daSSadaf Ebrahimi // Define helper macros for test files. 141*f5c631daSSadaf Ebrahimi 142*f5c631daSSadaf Ebrahimi // Macro to register a test. It instantiates a Test and registers its 143*f5c631daSSadaf Ebrahimi // callback function. 144*f5c631daSSadaf Ebrahimi #define TEST_(Name) \ 145*f5c631daSSadaf Ebrahimi void Test##Name(); \ 146*f5c631daSSadaf Ebrahimi Test test_##Name(#Name, &Test##Name); \ 147*f5c631daSSadaf Ebrahimi void Test##Name() 148*f5c631daSSadaf Ebrahimi } // namespace vixl 149*f5c631daSSadaf Ebrahimi 150*f5c631daSSadaf Ebrahimi #endif // TEST_TEST_H_ 151