You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.9 KiB
104 lines
2.9 KiB
#!/usr/bin/env python
|
|
# Copyright 2019 Google LLC
|
|
#
|
|
# This source code is licensed under the BSD-style license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
|
|
def _indent(text):
|
|
return "\n".join(map(lambda t: " " + t if t else t, text.splitlines()))
|
|
|
|
|
|
def _remove_duplicate_newlines(text):
|
|
filtered_lines = list()
|
|
last_newline = False
|
|
for line in text.splitlines():
|
|
is_newline = len(line.strip()) == 0
|
|
if not is_newline or not last_newline:
|
|
filtered_lines.append(line)
|
|
last_newline = is_newline
|
|
return "\n".join(filtered_lines)
|
|
|
|
|
|
_ARCH_TO_MACRO_MAP = {
|
|
"aarch32": "XNN_ARCH_ARM",
|
|
"aarch64": "XNN_ARCH_ARM64",
|
|
"x86-32": "XNN_ARCH_X86",
|
|
"x86-64": "XNN_ARCH_X86_64",
|
|
"wasm": "XNN_ARCH_WASM",
|
|
"wasmsimd": "XNN_ARCH_WASMSIMD",
|
|
}
|
|
|
|
_ISA_TO_ARCH_MAP = {
|
|
"neon": ["aarch32", "aarch64"],
|
|
"neonfma": ["aarch32", "aarch64"],
|
|
"neonv8": ["aarch32", "aarch64"],
|
|
"neonfp16arith": ["aarch32", "aarch64"],
|
|
"neondot": ["aarch32", "aarch64"],
|
|
"sse": ["x86-32", "x86-64"],
|
|
"sse2": ["x86-32", "x86-64"],
|
|
"ssse3": ["x86-32", "x86-64"],
|
|
"sse41": ["x86-32", "x86-64"],
|
|
"avx": ["x86-32", "x86-64"],
|
|
"xop": ["x86-32", "x86-64"],
|
|
"fma3": ["x86-32", "x86-64"],
|
|
"avx2": ["x86-32", "x86-64"],
|
|
"avx512f": ["x86-32", "x86-64"],
|
|
"avx512skx": ["x86-32", "x86-64"],
|
|
"wasm32": ["wasm", "wasmsimd"],
|
|
"wasm": ["wasm", "wasmsimd"],
|
|
"wasmsimd": ["wasmsimd"],
|
|
}
|
|
|
|
_ISA_TO_CHECK_MAP = {
|
|
"neon": "TEST_REQUIRES_ARM_NEON",
|
|
"neonfma": "TEST_REQUIRES_ARM_NEON_FMA",
|
|
"neonv8": "TEST_REQUIRES_ARM_NEON_V8",
|
|
"neonfp16arith": "TEST_REQUIRES_ARM_NEON_FP16_ARITH",
|
|
"neondot": "TEST_REQUIRES_ARM_NEON_DOT",
|
|
"sse": "TEST_REQUIRES_X86_SSE",
|
|
"sse2": "TEST_REQUIRES_X86_SSE2",
|
|
"ssse3": "TEST_REQUIRES_X86_SSSE3",
|
|
"sse41": "TEST_REQUIRES_X86_SSE41",
|
|
"avx": "TEST_REQUIRES_X86_AVX",
|
|
"xop": "TEST_REQUIRES_X86_XOP",
|
|
"avx2": "TEST_REQUIRES_X86_AVX2",
|
|
"fma3": "TEST_REQUIRES_X86_FMA3",
|
|
"avx512f": "TEST_REQUIRES_X86_AVX512F",
|
|
"avx512skx": "TEST_REQUIRES_X86_AVX512SKX",
|
|
}
|
|
|
|
|
|
def parse_target_name(target_name):
|
|
arch = list()
|
|
isa = None
|
|
for target_part in target_name.split("_"):
|
|
if target_part in _ARCH_TO_MACRO_MAP:
|
|
if target_part in _ISA_TO_ARCH_MAP:
|
|
arch = _ISA_TO_ARCH_MAP[target_part]
|
|
isa = target_part
|
|
else:
|
|
arch = [target_part]
|
|
elif target_part in _ISA_TO_ARCH_MAP:
|
|
isa = target_part
|
|
if isa and not arch:
|
|
arch = _ISA_TO_ARCH_MAP[isa]
|
|
|
|
return arch, isa
|
|
|
|
|
|
def generate_isa_check_macro(isa):
|
|
return _ISA_TO_CHECK_MAP.get(isa, "")
|
|
|
|
|
|
def postprocess_test_case(test_case, arch, isa, assembly=False):
|
|
test_case = _remove_duplicate_newlines(test_case)
|
|
if arch:
|
|
guard = " || ".join(map(_ARCH_TO_MACRO_MAP.get, arch))
|
|
if assembly:
|
|
guard += " && XNN_ENABLE_ASSEMBLY"
|
|
return "#if %s\n" % guard + _indent(test_case) + "\n" + \
|
|
"#endif // %s\n" % guard
|
|
else:
|
|
return test_case
|