Refactor templates to use a single strategy. Change-Id: I7157a8a66f2fd784f99148e41a91ed9ca9d36b95
diff --git a/.gitignore b/.gitignore index 378eac2..6f97ca1 100644 --- a/.gitignore +++ b/.gitignore
@@ -1 +1,2 @@ build +*.pyc
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ba1680..5f2c4bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -30,8 +30,6 @@ include(vec_cc_binary) include(vec_cc_test) include(vec_cc_generated_test) -include(softrvv_vec_cc_generated_test) - add_subdirectory(springbok) add_subdirectory(hello_vec)
diff --git a/cmake/softrvv_vec_cc_generated_test.cmake b/cmake/softrvv_vec_cc_generated_test.cmake deleted file mode 100644 index 38893b7..0000000 --- a/cmake/softrvv_vec_cc_generated_test.cmake +++ /dev/null
@@ -1,42 +0,0 @@ -function(softrvv_vec_cc_generated_test) - cmake_parse_arguments( - _RULE - "" - "NAME" - "TEMPLATE;LINKOPTS;TIMEOUT" - ${ARGN} - ) - -set(_TEST_NAME "softrvv_${_RULE_NAME}_test") -set(_OP_CODE ${_RULE_NAME}) -string(REPLACE ".tpl" "" _TEST_SRC_FILENAME ${_RULE_TEMPLATE}) - -set(_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/generated/${_TEST_SRC_FILENAME}) -find_file(_SOFTRVV_GEN_VEC_SCRIPT generate_softrvv_vector_tests.py ${CMAKE_SOURCE_DIR}/scripts) -add_custom_command( - OUTPUT - ${_TEST_SRC} - DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/templates/${_RULE_TEMPLATE} - ${CMAKE_CURRENT_SOURCE_DIR}/templates/base.tpl.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/templates/opivv_opivx_test.tpl.cpp - COMMAND python3 ${_SOFTRVV_GEN_VEC_SCRIPT} - --template-path=${CMAKE_CURRENT_SOURCE_DIR}/templates/ - --template=${_RULE_TEMPLATE} - --out-path=${CMAKE_CURRENT_BINARY_DIR}/generated/ - --op=${_OP_CODE} -) - -vec_cc_test( - NAME - ${_TEST_NAME} - SRCS - ${_TEST_SRC} - DEPS - softrvv - LINKOPTS - ${_RULE_LINKOPTS} - TIMEOUT - ${_RULE_TIMEOUT} -) -endfunction()
diff --git a/cmake/vec_cc_generated_test.cmake b/cmake/vec_cc_generated_test.cmake index b51f974..5e21a70 100644 --- a/cmake/vec_cc_generated_test.cmake +++ b/cmake/vec_cc_generated_test.cmake
@@ -1,40 +1,81 @@ +# vec_cc_generated_test() +# +# CMake function to generate vector test from a given template. +# +# Parameters: +# NAME: Name of the op_code the test will verify +# TEMPLATE: mako template to use in generating the CPP file +# PREFIX: prefix to add to the target +# LINKOPTS: additional link options +# TIMEOUT: test specific timeout +# +# Note: +# This will generate an elf file that can be executed on target +# It also adds a test that can be run via CTest + function(vec_cc_generated_test) cmake_parse_arguments( _RULE "" "NAME" - "OPFMT;LINKOPTS;TIMEOUT" + "TEMPLATE;PREFIX;LINKOPTS;TIMEOUT" ${ARGN} ) -set(_OPCODE "${_RULE_NAME}") +set(_TEST_NAME "${_RULE_PREFIX}${_RULE_NAME}_test") +set(_OP_CODE ${_RULE_NAME}) +string(REPLACE ".tpl" "" _TEST_SRC_FILENAME ${_RULE_TEMPLATE}) -foreach(_OPFMT ${_RULE_OPFMT}) -string(TOLOWER ${_OPFMT} _LOWER_OPFMT) -set(_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/generated/${_OPCODE}/${_OPCODE}_${_LOWER_OPFMT}_test.cpp) +set(_TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/generated/${_OP_CODE}/${_TEST_SRC_FILENAME}) find_file(_GEN_VEC_SCRIPT generate_vector_tests.py ${CMAKE_SOURCE_DIR}/scripts) +file(GLOB_RECURSE TEMPLATES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.tpl") add_custom_command( OUTPUT ${_TEST_SRC} DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/templates/${_LOWER_OPFMT}_test.tpl.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/templates/${_RULE_TEMPLATE} + ${TEMPLATES} COMMAND python3 ${_GEN_VEC_SCRIPT} --template-path=${CMAKE_CURRENT_SOURCE_DIR}/templates/ - --instruction-format ${_OPFMT} - --op-code ${_OPCODE} - --out-path=${CMAKE_CURRENT_BINARY_DIR}/generated/${_OPCODE} + --template=${_RULE_TEMPLATE} + --out-path=${CMAKE_CURRENT_BINARY_DIR}/generated/${_OP_CODE} + --op=${_OP_CODE} ) -list (APPEND _TEST_SRCS "${_TEST_SRC}") -endforeach() vec_cc_test( NAME - ${_OPCODE}_test + ${_TEST_NAME} SRCS - ${_TEST_SRCS} + ${_TEST_SRC} + DEPS + softrvv LINKOPTS ${_RULE_LINKOPTS} TIMEOUT ${_RULE_TIMEOUT} ) endfunction() + +function(softrvv_vec_cc_generated_test) + cmake_parse_arguments( + _RULE + "" + "NAME" + "TEMPLATE;LINKOPTS;TIMEOUT" + ${ARGN} + ) + +vec_cc_generated_test( + NAME + ${_RULE_NAME} + PREFIX + softrvv_ + TEMPLATE + ${_RULE_TEMPLATE} + LINKOPTS + ${_RULE_LINKOPTS} + TIMEOUT + ${_RULE_TIMEOUT} +) + +endfunction()
diff --git a/scripts/generate_softrvv_vector_tests.py b/scripts/generate_softrvv_vector_tests.py deleted file mode 100644 index 9e337bd..0000000 --- a/scripts/generate_softrvv_vector_tests.py +++ /dev/null
@@ -1,50 +0,0 @@ -#!/usr/bin/env python3 -""" -Generate tests for softrvv -TODO(henryherman) Look into combining the different template workflows -""" -import os -import logging -import argparse -from collections import namedtuple -from pathlib import Path - -from mako.lookup import TemplateLookup -import mako.exceptions - -parser = argparse.ArgumentParser( - description='Generate tests for vector instructions.') - -parser.add_argument('--template-path', dest='template_path', - help='path to templates', required=True) -parser.add_argument('--template', dest='template_name', - help='template name', required=True) -parser.add_argument('-v', '--verbose', help='increase output verbosity', - action='store_true') -parser.add_argument('--out-path', dest='out_path', - help='Path to output files', default='.') -parser.add_argument('--op', dest='op', - help='op instruction', default='') - -args = parser.parse_args() - -if args.verbose: - logging.basicConfig(level=logging.DEBUG) - -def main(): - """ Main routine for generating softrvv tests from templates.""" - mylookup = TemplateLookup(directories=[args.template_path, "."]) - try: - template = mylookup.get_template(args.template_name) - except mako.exceptions.TopLevelLookupException: - parser.error("Template does not exist %s" % args.template_name) - logging.debug("Template %s found", args.template_name) - Path(args.out_path).mkdir(parents=True, exist_ok=True) - outfile_name = args.template_name.replace(".tpl", "") - full_outfile_path = os.path.join(args.out_path, outfile_name) - logging.debug("Generating file %s", full_outfile_path) - with open(full_outfile_path, "w+") as outfile: - outfile.write(template.render(op=args.op)) - -if __name__ == "__main__": - main()
diff --git a/scripts/generate_vector_tests.py b/scripts/generate_vector_tests.py index 47f39fd..f6fcf07 100644 --- a/scripts/generate_vector_tests.py +++ b/scripts/generate_vector_tests.py
@@ -1,6 +1,7 @@ #!/usr/bin/env python3 """ -Generate tests for Vector Instructions +Generate tests for softrvv +TODO(henryherman) Look into combining the different template workflows """ import os import logging @@ -16,49 +17,36 @@ parser.add_argument('--template-path', dest='template_path', help='path to templates', required=True) +parser.add_argument('--template', dest='template_name', + help='template name', required=True) parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true') -parser.add_argument('--op-code', dest='op_code', - help='Op-code', required=True) parser.add_argument('--out-path', dest='out_path', help='Path to output files', default='.') +parser.add_argument('--op', dest='op', + help='op instruction', default='') -template_name_lookup = { - 'OPIVV':'opivv_test.tpl.cpp', - 'OPIVI':'opivi_test.tpl.cpp', - 'OPIVX':'opivx_test.tpl.cpp', - 'VXUNARY0':'vxunary0_test.tpl.cpp' -} - -parser.add_argument('--instruction-format', - action='append', choices=template_name_lookup.keys(), required=True) args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG) def main(): - """ Main routine for generating tests from templates.""" + """ Main routine for generating softrvv tests from templates.""" mylookup = TemplateLookup(directories=[args.template_path, "."]) - template_names = [template_name_lookup.get(fmt, None) for fmt in args.instruction_format] - template_names = [template for template in template_names if template is not None] - template_jobs = [] - TemplateJob = namedtuple("TemplateJob", "template outfile") + try: + template = mylookup.get_template(args.template_name) + except mako.exceptions.TopLevelLookupException: + parser.error("Template does not exist %s" % args.template_name) + logging.debug("Template %s found", args.template_name) Path(args.out_path).mkdir(parents=True, exist_ok=True) - for opfmt, template_name in template_name_lookup.items(): - if not opfmt in args.instruction_format: - continue - try: - template = mylookup.get_template(template_name) - except mako.exceptions.TopLevelLookupException: - parser.error("Template does not exist %s" % template_name) - outfile_name = "%s_%s" % (args.op_code, template_name.replace(".tpl", "")) - template_jobs.append(TemplateJob(template, outfile_name)) - - for template_job in template_jobs: - full_outfile_path = os.path.join(args.out_path, template_job.outfile) - with open(full_outfile_path, "w+") as outfile: - outfile.write(template_job.template.render(op_code=args.op_code)) + outfile_name = args.template_name.replace(".tpl", "") + full_outfile_path = os.path.join(args.out_path, outfile_name) + logging.debug("Generating file %s", full_outfile_path) + with open(full_outfile_path, "w+") as outfile: + outfile.write(template.render(op=args.op)) if __name__ == "__main__": main() + +
diff --git a/scripts/vec_test_helpers/__init__.py b/scripts/vec_test_helpers/__init__.py new file mode 100644 index 0000000..77cb7ff --- /dev/null +++ b/scripts/vec_test_helpers/__init__.py
@@ -0,0 +1,37 @@ +""" vec_test_helpers + +This module is for reusable helper functions used by the templates. +""" + +def is_widening(op_code): + """Check if a particular op_code is a widening type.""" + return op_code[1] == 'w' + +def is_unsigned(op_code): + """Check if a particular op_code is a unsigned type.""" + return op_code[-1] == 'u' + +def get_sews(op_code): + """Given an op_code return a list of valid element widths.""" + return [8, 16] if is_widening(op_code) else [8, 16, 32] + +def get_lmuls(op_code): + """Given an op_code return an iterable if valid lmuls.""" + return [1, 2, 4] if is_widening(op_code) else [1, 2, 4, 8] + +def get_dest_type(op_code, sew): + """Return a destination type for a op_code and element width.""" + type_fmt = "%sint%d_t" + sign_type = "u" if is_unsigned(op_code) else "" + dest_sew = sew * 2 if is_widening(op_code) else sew + return type_fmt % (sign_type, dest_sew) + +def get_src_type(op_code, sew): + """Return a source type for an op_code and element width.""" + type_fmt = "%sint%d_t" + sign_type = "u" if is_unsigned(op_code) else "" + return type_fmt % (sign_type, sew) + +def get_ref_opcode(op_code): + """Return the name of the reference code in the softrvv library.""" + return op_code[:-1] if is_unsigned(op_code) else op_code
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 710743b..646c272 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt
@@ -14,9 +14,8 @@ vec_cc_generated_test( NAME vsub - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -24,9 +23,8 @@ vec_cc_generated_test( NAME vrsub - OPFMT - OPIVI - OPIVX + TEMPLATE + opivx_opivi_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=256K ) @@ -34,10 +32,8 @@ vec_cc_generated_test( NAME vadd - OPFMT - OPIVV - OPIVX - OPIVI + TEMPLATE + opivv_opivx_opivi_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=256K ) @@ -45,10 +41,8 @@ vec_cc_generated_test( NAME vor - OPFMT - OPIVV - OPIVX - OPIVI + TEMPLATE + opivv_opivx_opivi_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=256K ) @@ -56,10 +50,8 @@ vec_cc_generated_test( NAME vxor - OPFMT - OPIVV - OPIVX - OPIVI + TEMPLATE + opivv_opivx_opivi_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=256K ) @@ -67,9 +59,8 @@ vec_cc_generated_test( NAME vmin - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -77,9 +68,8 @@ vec_cc_generated_test( NAME vminu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -87,9 +77,8 @@ vec_cc_generated_test( NAME vmul - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -97,9 +86,8 @@ vec_cc_generated_test( NAME vmulh - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -107,9 +95,8 @@ vec_cc_generated_test( NAME vmulhu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -117,9 +104,8 @@ vec_cc_generated_test( NAME vdiv - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -127,9 +113,8 @@ vec_cc_generated_test( NAME vdivu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -137,9 +122,8 @@ vec_cc_generated_test( NAME vrem - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -147,9 +131,8 @@ vec_cc_generated_test( NAME vremu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -157,9 +140,8 @@ vec_cc_generated_test( NAME vwadd - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -167,9 +149,8 @@ vec_cc_generated_test( NAME vwaddu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -177,9 +158,8 @@ vec_cc_generated_test( NAME vwsub - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -187,9 +167,8 @@ vec_cc_generated_test( NAME vwsubu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -197,9 +176,8 @@ vec_cc_generated_test( NAME vmax - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -208,10 +186,8 @@ vec_cc_generated_test( NAME vand - OPFMT - OPIVV - OPIVX - OPIVI + TEMPLATE + opivv_opivx_opivi_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=200K ) @@ -219,9 +195,8 @@ vec_cc_generated_test( NAME vmaxu - OPFMT - OPIVV - OPIVX + TEMPLATE + opivv_opivx_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -229,8 +204,8 @@ vec_cc_generated_test( NAME vsext - OPFMT - VXUNARY0 + TEMPLATE + vxunary0_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K ) @@ -238,8 +213,8 @@ vec_cc_generated_test( NAME vzext - OPFMT - VXUNARY0 + TEMPLATE + vxunary0_test.tpl.cpp LINKOPTS -Xlinker --defsym=__itcm_length__=128K )
diff --git a/tests/templates/base.tpl.cpp b/tests/templates/base.tpl.cpp index f6047a1..df861ff 100644 --- a/tests/templates/base.tpl.cpp +++ b/tests/templates/base.tpl.cpp
@@ -1,32 +1,3 @@ -<%! - -def is_widening(op_code): - return op_code[1] == 'w' - -def is_unsigned(op_code): - return op_code[-1] == 'u' - -def get_sews(op_code): - return [8, 16] if is_widening(op_code) else [8, 16, 32] - -def get_lmuls(op_code): - return [1, 2, 4] if is_widening(op_code) else [1, 2, 4, 8] - -def get_dest_type(op_code, sew): - type_fmt = "%sint%d_t" - sign_type = "u" if is_unsigned(op_code) else "" - dest_sew = sew * 2 if is_widening(op_code) else sew - return type_fmt % (sign_type, dest_sew) - -def get_src_type(op_code, sew): - type_fmt = "%sint%d_t" - sign_type = "u" if is_unsigned(op_code) else "" - return type_fmt % (sign_type, sew) - -def get_ref_opcode(op_code): - return op_code[:-1] if is_unsigned(op_code) else op_code - -%> /* Automatically generated file */ #include <limits.h> #include <riscv_vector.h>
diff --git a/tests/templates/opivi_test.tpl.cpp b/tests/templates/base_opivi_test.tpl.cpp similarity index 97% rename from tests/templates/opivi_test.tpl.cpp rename to tests/templates/base_opivi_test.tpl.cpp index a831c1e..39343cb 100644 --- a/tests/templates/opivi_test.tpl.cpp +++ b/tests/templates/base_opivi_test.tpl.cpp
@@ -1,5 +1,4 @@ -<%inherit file="base.tpl.cpp"/>\ - +<%def name="test_opivi(op_code)"> namespace ${op_code}_vi_test { namespace { @@ -64,3 +63,5 @@ } // namespace } // namespace ${op_code}_vi_test +</%def> +
diff --git a/tests/templates/opivv_test.tpl.cpp b/tests/templates/base_opivv_test.tpl.cpp similarity index 86% rename from tests/templates/opivv_test.tpl.cpp rename to tests/templates/base_opivv_test.tpl.cpp index 2075de2..35b92b8 100644 --- a/tests/templates/opivv_test.tpl.cpp +++ b/tests/templates/base_opivv_test.tpl.cpp
@@ -1,5 +1,4 @@ -<%inherit file="base.tpl.cpp"/>\ - +<%def name="test_opivv(op_code)"> namespace ${op_code}_vv_test { namespace { @@ -16,18 +15,18 @@ void TearDown() override { zero_vector_registers(); } }; <% -widening = parent.module.is_widening(op_code) -sews = parent.module.get_sews(op_code) -lmuls = parent.module.get_lmuls(op_code) -ref_opcode = parent.module.get_ref_opcode(op_code) +import vec_test_helpers +sews = vec_test_helpers.get_sews(op_code) +lmuls = vec_test_helpers.get_lmuls(op_code) %>\ % for sew in sews: % for lmul in lmuls: <% -dest_type = parent.module.get_dest_type(op_code, sew) -src_type = parent.module.get_src_type(op_code, sew) +dest_type = vec_test_helpers.get_dest_type(op_code, sew) +src_type = vec_test_helpers.get_src_type(op_code, sew) +ref_opcode = vec_test_helpers.get_ref_opcode(op_code) +widening = vec_test_helpers.is_widening(op_code) %>\ - TEST_F(${op_code.capitalize()}Test, ${op_code.lower()}_vv${sew}m${lmul}) { for (int i = 0; i < AVL_COUNT; i++) { int32_t avl = AVLS[i]; @@ -78,3 +77,5 @@ } // namespace } // namespace ${op_code}_vv_test +</%def> +
diff --git a/tests/templates/opivx_test.tpl.cpp b/tests/templates/base_opivx_test.tpl.cpp similarity index 85% rename from tests/templates/opivx_test.tpl.cpp rename to tests/templates/base_opivx_test.tpl.cpp index c10f9c7..8feaeb4 100644 --- a/tests/templates/opivx_test.tpl.cpp +++ b/tests/templates/base_opivx_test.tpl.cpp
@@ -1,5 +1,4 @@ -<%inherit file="base.tpl.cpp"/>\ - +<%def name="test_opivx(op_code)"> namespace ${op_code}_vx_test { namespace { @@ -15,18 +14,18 @@ void TearDown() override { zero_vector_registers(); } }; <% -widening = parent.module.is_widening(op_code) -sews = parent.module.get_sews(op_code) -lmuls = parent.module.get_lmuls(op_code) +import vec_test_helpers +sews = vec_test_helpers.get_sews(op_code) +lmuls = vec_test_helpers.get_lmuls(op_code) %>\ % for sew in sews: % for lmul in lmuls: <% -dest_type = parent.module.get_dest_type(op_code, sew) -src_type = parent.module.get_src_type(op_code, sew) -ref_opcode = parent.module.get_ref_opcode(op_code) +dest_type = vec_test_helpers.get_dest_type(op_code, sew) +src_type = vec_test_helpers.get_src_type(op_code, sew) +ref_opcode = vec_test_helpers.get_ref_opcode(op_code) +widening = vec_test_helpers.is_widening(op_code) %>\ - TEST_F(${op_code.capitalize()}Test, ${op_code.lower()}_vx${sew}m${lmul}) { for (int i = 0; i < AVL_COUNT; i++) { int32_t avl = AVLS[i]; @@ -74,3 +73,5 @@ } // namespace } // namespace ${op_code}_vx_test +</%def> +
diff --git a/tests/templates/base_vxunary0_test.tpl.cpp b/tests/templates/base_vxunary0_test.tpl.cpp new file mode 100644 index 0000000..438571b --- /dev/null +++ b/tests/templates/base_vxunary0_test.tpl.cpp
@@ -0,0 +1,59 @@ +<%def name="test_vxunary0(op_code)"> +namespace ${op_code}_test { +namespace { + +using namespace test_v_helpers; + +uint8_t src_vector_1[MAXVL_BYTES]; +uint8_t dest_vector[MAXVL_BYTES]; +uint8_t ref_dest_vector[MAXVL_BYTES]; + +class ${op_code.capitalize()}Test : public ::testing::Test { + protected: + void SetUp() override { zero_vector_registers(); } + void TearDown() override { zero_vector_registers(); } +}; +% for fraction, sew in [(4, 32), (2, 16)]: +% for lmul in [1, 2, 4, 8]: +<% +sign_type = "u" if "z" in op_code else "" +src_type = "%sint%d_t" % (sign_type, sew/fraction) +dest_type = "%sint%d_t" % (sign_type, sew) +%>\ +TEST_F(${op_code.capitalize()}Test, VF${fraction}e${sew}m${lmul}) { + for (int i = 0; i < AVL_COUNT; i++) { + int32_t avl = AVLS[i]; + int vlmax; + int vl; + std::tie(vlmax, vl) = vector_test_setup<${dest_type}>( + VLMUL::LMUL_M${lmul}, avl, + {src_vector_1, dest_vector, ref_dest_vector}); + if (avl > vlmax) { + continue; + } + ${src_type} *ptr_vec_1 = reinterpret_cast<${src_type} *>(src_vector_1); + ${dest_type} *ptr_dest_vec = reinterpret_cast<${dest_type} *>(dest_vector); + ${dest_type} *ptr_ref_dest_vec = reinterpret_cast<${dest_type} *>(ref_dest_vector); + fill_random_vector<${src_type}>(ptr_vec_1, avl); + memset(dest_vector, 0, sizeof(dest_vector)); + memset(ref_dest_vector, 0, sizeof(ref_dest_vector)); + softrvv::${op_code}_v<${dest_type}, ${src_type}>(ptr_ref_dest_vec, ptr_vec_1, avl); + // Load vector registers + __asm__ volatile("vle${sew//fraction}.v v8, (%0)" : : "r"(ptr_vec_1)); + + // Run target instruction + __asm__ volatile("${op_code}.vf${fraction} v24, v8" ::); + + // Store result vector register + __asm__ volatile("vse${sew}.v v24, (%0)" : : "r"(ptr_dest_vec)); + // Check vector elements + assert_vec_elem_eq<${dest_type}>(vlmax, dest_vector, ref_dest_vector); + } +} +%endfor +%endfor +} // namespace +} // namespace ${op_code}_test +</%def> + +
diff --git a/tests/templates/opivv_opivx_opivi_test.tpl.cpp b/tests/templates/opivv_opivx_opivi_test.tpl.cpp new file mode 100644 index 0000000..c6509c4 --- /dev/null +++ b/tests/templates/opivv_opivx_opivi_test.tpl.cpp
@@ -0,0 +1,7 @@ +<%inherit file="base.tpl.cpp"/>\ +<%namespace name="tests_vi" file="base_opivi_test.tpl.cpp"/>\ +<%namespace name="tests_vx" file="base_opivx_test.tpl.cpp"/>\ +<%namespace name="tests_vv" file="base_opivv_test.tpl.cpp"/>\ +${tests_vi.test_opivi(op)} +${tests_vx.test_opivx(op)} +${tests_vv.test_opivv(op)}
diff --git a/tests/templates/opivv_opivx_test.tpl.cpp b/tests/templates/opivv_opivx_test.tpl.cpp new file mode 100644 index 0000000..7567e3b --- /dev/null +++ b/tests/templates/opivv_opivx_test.tpl.cpp
@@ -0,0 +1,5 @@ +<%inherit file="base.tpl.cpp"/>\ +<%namespace name="tests_vx" file="base_opivx_test.tpl.cpp"/>\ +<%namespace name="tests_vv" file="base_opivv_test.tpl.cpp"/>\ +${tests_vx.test_opivx(op)} +${tests_vv.test_opivv(op)}
diff --git a/tests/templates/opivx_opivi_test.tpl.cpp b/tests/templates/opivx_opivi_test.tpl.cpp new file mode 100644 index 0000000..1b25072 --- /dev/null +++ b/tests/templates/opivx_opivi_test.tpl.cpp
@@ -0,0 +1,5 @@ +<%inherit file="base.tpl.cpp"/>\ +<%namespace name="tests_vx" file="base_opivx_test.tpl.cpp"/>\ +<%namespace name="tests_vi" file="base_opivi_test.tpl.cpp"/>\ +${tests_vx.test_opivx(op)} +${tests_vi.test_opivi(op)}
diff --git a/tests/templates/vxunary0_test.tpl.cpp b/tests/templates/vxunary0_test.tpl.cpp index b43e968..b840e21 100644 --- a/tests/templates/vxunary0_test.tpl.cpp +++ b/tests/templates/vxunary0_test.tpl.cpp
@@ -1,57 +1,4 @@ <%inherit file="base.tpl.cpp"/>\ +<%namespace name="tests_vxunary0" file="base_vxunary0_test.tpl.cpp"/>\ +${tests_vxunary0.test_vxunary0(op)} -namespace ${op_code}_test { -namespace { - -using namespace test_v_helpers; - -uint8_t src_vector_1[MAXVL_BYTES]; -uint8_t dest_vector[MAXVL_BYTES]; -uint8_t ref_dest_vector[MAXVL_BYTES]; - -class ${op_code.capitalize()}Test : public ::testing::Test { - protected: - void SetUp() override { zero_vector_registers(); } - void TearDown() override { zero_vector_registers(); } -}; -% for fraction, sew in [(4, 32), (2, 16)]: -% for lmul in [1, 2, 4, 8]: -<% -sign_type = "u" if "z" in op_code else "" -src_type = "%sint%d_t" % (sign_type, sew/fraction) -dest_type = "%sint%d_t" % (sign_type, sew) -%>\ -TEST_F(${op_code.capitalize()}Test, VF${fraction}e${sew}m${lmul}) { - for (int i = 0; i < AVL_COUNT; i++) { - int32_t avl = AVLS[i]; - int vlmax; - int vl; - std::tie(vlmax, vl) = vector_test_setup<${dest_type}>( - VLMUL::LMUL_M${lmul}, avl, - {src_vector_1, dest_vector, ref_dest_vector}); - if (avl > vlmax) { - continue; - } - ${src_type} *ptr_vec_1 = reinterpret_cast<${src_type} *>(src_vector_1); - ${dest_type} *ptr_dest_vec = reinterpret_cast<${dest_type} *>(dest_vector); - ${dest_type} *ptr_ref_dest_vec = reinterpret_cast<${dest_type} *>(ref_dest_vector); - fill_random_vector<${src_type}>(ptr_vec_1, avl); - memset(dest_vector, 0, sizeof(dest_vector)); - memset(ref_dest_vector, 0, sizeof(ref_dest_vector)); - softrvv::${op_code}_v<${dest_type}, ${src_type}>(ptr_ref_dest_vec, ptr_vec_1, avl); - // Load vector registers - __asm__ volatile("vle${sew//fraction}.v v8, (%0)" : : "r"(ptr_vec_1)); - - // Run target instruction - __asm__ volatile("${op_code}.vf${fraction} v24, v8" ::); - - // Store result vector register - __asm__ volatile("vse${sew}.v v24, (%0)" : : "r"(ptr_dest_vec)); - // Check vector elements - assert_vec_elem_eq<${dest_type}>(vlmax, dest_vector, ref_dest_vector); - } -} -%endfor -%endfor -} // namespace -} // namespace ${op_code}_test