blob: 77255b03e62784f612ae95f44450c6ae9997b962 [file] [log] [blame]
Marat Dukhan918a4a62019-10-27 19:49:49 -07001#!/usr/bin/env python
2# Copyright 2019 Google LLC
3#
4# This source code is licensed under the BSD-style license found in the
5# LICENSE file in the root directory of this source tree.
6
7
8def _indent(text):
9 return "\n".join(map(lambda t: " " + t if t else t, text.splitlines()))
10
11
12def _remove_duplicate_newlines(text):
13 filtered_lines = list()
14 last_newline = False
15 for line in text.splitlines():
16 is_newline = len(line.strip()) == 0
17 if not is_newline or not last_newline:
18 filtered_lines.append(line)
19 last_newline = is_newline
20 return "\n".join(filtered_lines)
21
22
23_ARCH_TO_MACRO_MAP = {
24 "aarch32": "XNN_ARCH_ARM",
25 "aarch64": "XNN_ARCH_ARM64",
Marat Dukhan1bbf96b2020-06-15 23:01:20 -070026 "x86-32": "XNN_ARCH_X86",
Marat Dukhan918a4a62019-10-27 19:49:49 -070027 "x86-64": "XNN_ARCH_X86_64",
Marat Dukhan436ebe62019-12-04 15:10:12 -080028 "wasm": "XNN_ARCH_WASM",
Marat Dukhan1bbf96b2020-06-15 23:01:20 -070029 "wasmsimd": "XNN_ARCH_WASMSIMD",
Marat Dukhan4c617792021-12-21 15:47:58 -080030 "wasmrelaxedsimd": "XNN_ARCH_WASMRELAXEDSIMD",
Marat Dukhan918a4a62019-10-27 19:49:49 -070031}
32
33_ISA_TO_ARCH_MAP = {
34 "neon": ["aarch32", "aarch64"],
Marat Dukhan8ff372c2021-09-28 14:43:17 -070035 "neonfp16": ["aarch32", "aarch64"],
Marat Dukhan918a4a62019-10-27 19:49:49 -070036 "neonfma": ["aarch32", "aarch64"],
Marat Dukhaneecf8fd2020-06-09 08:59:37 -070037 "neonv8": ["aarch32", "aarch64"],
Marat Dukhan918a4a62019-10-27 19:49:49 -070038 "neonfp16arith": ["aarch32", "aarch64"],
Benoit Jacoba9644732020-08-13 12:48:55 -070039 "neondot": ["aarch32", "aarch64"],
Marat Dukhan1bbf96b2020-06-15 23:01:20 -070040 "sse": ["x86-32", "x86-64"],
41 "sse2": ["x86-32", "x86-64"],
Marat Dukhan595e1702020-07-31 10:12:52 -070042 "ssse3": ["x86-32", "x86-64"],
Marat Dukhan1bbf96b2020-06-15 23:01:20 -070043 "sse41": ["x86-32", "x86-64"],
44 "avx": ["x86-32", "x86-64"],
Marat Dukhanf1a6ed32021-09-26 13:40:19 -070045 "f16c": ["x86-32", "x86-64"],
Marat Dukhan1566fee2020-08-02 21:55:41 -070046 "xop": ["x86-32", "x86-64"],
Marat Dukhan1bbf96b2020-06-15 23:01:20 -070047 "fma3": ["x86-32", "x86-64"],
48 "avx2": ["x86-32", "x86-64"],
49 "avx512f": ["x86-32", "x86-64"],
Marat Dukhanbb00b1d2020-08-10 11:37:23 -070050 "avx512skx": ["x86-32", "x86-64"],
Frank Barcharda635a292020-08-31 09:36:05 -070051 "wasm32": ["wasm", "wasmsimd"],
Marat Dukhan4c617792021-12-21 15:47:58 -080052 "wasm": ["wasm", "wasmsimd", "wasmrelaxedsimd"],
53 "wasmsimd": ["wasmsimd", "wasmrelaxedsimd"],
54 "wasmrelaxedsimd": ["wasmrelaxedsimd"],
Marat Dukhan918a4a62019-10-27 19:49:49 -070055}
56
57_ISA_TO_CHECK_MAP = {
58 "neon": "TEST_REQUIRES_ARM_NEON",
Marat Dukhan8ff372c2021-09-28 14:43:17 -070059 "neonfp16": "TEST_REQUIRES_ARM_NEON_FP16",
Marat Dukhan918a4a62019-10-27 19:49:49 -070060 "neonfma": "TEST_REQUIRES_ARM_NEON_FMA",
Marat Dukhaneecf8fd2020-06-09 08:59:37 -070061 "neonv8": "TEST_REQUIRES_ARM_NEON_V8",
Marat Dukhan918a4a62019-10-27 19:49:49 -070062 "neonfp16arith": "TEST_REQUIRES_ARM_NEON_FP16_ARITH",
Benoit Jacoba9644732020-08-13 12:48:55 -070063 "neondot": "TEST_REQUIRES_ARM_NEON_DOT",
Marat Dukhan918a4a62019-10-27 19:49:49 -070064 "sse": "TEST_REQUIRES_X86_SSE",
65 "sse2": "TEST_REQUIRES_X86_SSE2",
Marat Dukhan595e1702020-07-31 10:12:52 -070066 "ssse3": "TEST_REQUIRES_X86_SSSE3",
Marat Dukhan69c3f2c2019-11-06 12:30:01 -080067 "sse41": "TEST_REQUIRES_X86_SSE41",
Marat Dukhan918a4a62019-10-27 19:49:49 -070068 "avx": "TEST_REQUIRES_X86_AVX",
Marat Dukhanf1a6ed32021-09-26 13:40:19 -070069 "f16c": "TEST_REQUIRES_X86_F16C",
Marat Dukhan1566fee2020-08-02 21:55:41 -070070 "xop": "TEST_REQUIRES_X86_XOP",
Marat Dukhan918a4a62019-10-27 19:49:49 -070071 "avx2": "TEST_REQUIRES_X86_AVX2",
Marat Dukhanfda12b82019-11-21 12:27:59 -080072 "fma3": "TEST_REQUIRES_X86_FMA3",
Marat Dukhan918a4a62019-10-27 19:49:49 -070073 "avx512f": "TEST_REQUIRES_X86_AVX512F",
Marat Dukhanbb00b1d2020-08-10 11:37:23 -070074 "avx512skx": "TEST_REQUIRES_X86_AVX512SKX",
Marat Dukhan918a4a62019-10-27 19:49:49 -070075}
76
77
78def parse_target_name(target_name):
79 arch = list()
80 isa = None
81 for target_part in target_name.split("_"):
82 if target_part in _ARCH_TO_MACRO_MAP:
Marat Dukhanfb5b20a2020-06-26 13:14:50 -070083 if target_part in _ISA_TO_ARCH_MAP:
84 arch = _ISA_TO_ARCH_MAP[target_part]
Marat Dukhan47387d62020-06-29 12:53:20 -070085 isa = target_part
Marat Dukhanfb5b20a2020-06-26 13:14:50 -070086 else:
87 arch = [target_part]
Marat Dukhan918a4a62019-10-27 19:49:49 -070088 elif target_part in _ISA_TO_ARCH_MAP:
89 isa = target_part
90 if isa and not arch:
91 arch = _ISA_TO_ARCH_MAP[isa]
92
93 return arch, isa
94
95
96def generate_isa_check_macro(isa):
97 return _ISA_TO_CHECK_MAP.get(isa, "")
98
99
Marat Dukhan6e8c0ce2021-04-13 14:35:08 -0700100def arch_to_macro(arch, isa):
101 if arch == "aarch32" and isa == "neondot":
102 return _ARCH_TO_MACRO_MAP[arch] + " && !XNN_PLATFORM_IOS"
103 else:
104 return _ARCH_TO_MACRO_MAP[arch]
105
106
Zhi An Ngb43b47a2021-12-23 16:27:22 -0800107def postprocess_test_case(test_case, arch, isa, assembly=False, jit=False):
Marat Dukhan918a4a62019-10-27 19:49:49 -0700108 test_case = _remove_duplicate_newlines(test_case)
109 if arch:
Marat Dukhan6e8c0ce2021-04-13 14:35:08 -0700110 guard = " || ".join(arch_to_macro(a, isa) for a in arch)
Marat Dukhan918a4a62019-10-27 19:49:49 -0700111 if assembly:
112 guard += " && XNN_ENABLE_ASSEMBLY"
Zhi An Ngb43b47a2021-12-23 16:27:22 -0800113 if jit:
114 guard += " && XNN_PLATFORM_JIT"
Marat Dukhan3de5dfa2020-12-10 11:19:47 -0800115 return "#if %s\n" % guard + _indent(test_case) + "\n" + \
Marat Dukhan918a4a62019-10-27 19:49:49 -0700116 "#endif // %s\n" % guard
117 else:
118 return test_case