1#!/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", 26 "x86-32": "XNN_ARCH_X86", 27 "x86-64": "XNN_ARCH_X86_64", 28 "wasm": "XNN_ARCH_WASM", 29 "wasmsimd": "XNN_ARCH_WASMSIMD", 30 "wasmrelaxedsimd": "XNN_ARCH_WASMRELAXEDSIMD", 31} 32 33_ISA_TO_ARCH_MAP = { 34 "neon": ["aarch32", "aarch64"], 35 "neonfp16": ["aarch32", "aarch64"], 36 "neonfma": ["aarch32", "aarch64"], 37 "neonv8": ["aarch32", "aarch64"], 38 "neonfp16arith": ["aarch32", "aarch64"], 39 "neondot": ["aarch32", "aarch64"], 40 "sse": ["x86-32", "x86-64"], 41 "sse2": ["x86-32", "x86-64"], 42 "ssse3": ["x86-32", "x86-64"], 43 "sse41": ["x86-32", "x86-64"], 44 "avx": ["x86-32", "x86-64"], 45 "f16c": ["x86-32", "x86-64"], 46 "xop": ["x86-32", "x86-64"], 47 "fma3": ["x86-32", "x86-64"], 48 "avx2": ["x86-32", "x86-64"], 49 "avx512f": ["x86-32", "x86-64"], 50 "avx512skx": ["x86-32", "x86-64"], 51 "wasm32": ["wasm", "wasmsimd"], 52 "wasm": ["wasm", "wasmsimd", "wasmrelaxedsimd"], 53 "wasmsimd": ["wasmsimd", "wasmrelaxedsimd"], 54 "wasmrelaxedsimd": ["wasmrelaxedsimd"], 55} 56 57_ISA_TO_CHECK_MAP = { 58 "neon": "TEST_REQUIRES_ARM_NEON", 59 "neonfp16": "TEST_REQUIRES_ARM_NEON_FP16", 60 "neonfma": "TEST_REQUIRES_ARM_NEON_FMA", 61 "neonv8": "TEST_REQUIRES_ARM_NEON_V8", 62 "neonfp16arith": "TEST_REQUIRES_ARM_NEON_FP16_ARITH", 63 "neondot": "TEST_REQUIRES_ARM_NEON_DOT", 64 "sse": "TEST_REQUIRES_X86_SSE", 65 "sse2": "TEST_REQUIRES_X86_SSE2", 66 "ssse3": "TEST_REQUIRES_X86_SSSE3", 67 "sse41": "TEST_REQUIRES_X86_SSE41", 68 "avx": "TEST_REQUIRES_X86_AVX", 69 "f16c": "TEST_REQUIRES_X86_F16C", 70 "xop": "TEST_REQUIRES_X86_XOP", 71 "avx2": "TEST_REQUIRES_X86_AVX2", 72 "fma3": "TEST_REQUIRES_X86_FMA3", 73 "avx512f": "TEST_REQUIRES_X86_AVX512F", 74 "avx512skx": "TEST_REQUIRES_X86_AVX512SKX", 75} 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: 83 if target_part in _ISA_TO_ARCH_MAP: 84 arch = _ISA_TO_ARCH_MAP[target_part] 85 isa = target_part 86 else: 87 arch = [target_part] 88 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 100def 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 107def postprocess_test_case(test_case, arch, isa, assembly=False, jit=False): 108 test_case = _remove_duplicate_newlines(test_case) 109 if arch: 110 guard = " || ".join(arch_to_macro(a, isa) for a in arch) 111 if assembly: 112 guard += " && XNN_ENABLE_ASSEMBLY" 113 if jit: 114 guard += " && XNN_PLATFORM_JIT" 115 return "#if %s\n" % guard + _indent(test_case) + "\n" + \ 116 "#endif // %s\n" % guard 117 else: 118 return test_case 119