|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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", |
|
"hexagon": "XNN_ARCH_HEXAGON", |
|
"riscv": "XNN_ARCH_RISCV", |
|
"wasm": "XNN_ARCH_WASM", |
|
"wasmsimd": "XNN_ARCH_WASMSIMD", |
|
"wasmrelaxedsimd": "XNN_ARCH_WASMRELAXEDSIMD", |
|
"wasm32": "XNN_ARCH_WASM", |
|
"wasmsimd32": "XNN_ARCH_WASMSIMD", |
|
"wasmrelaxedsimd32": "XNN_ARCH_WASMRELAXEDSIMD", |
|
} |
|
|
|
|
|
|
|
_ISA_TO_MACRO_MAP = { |
|
"fp16arith": "XNN_ENABLE_ARM_FP16_SCALAR", |
|
"neonfp16arith": "XNN_ENABLE_ARM_FP16_VECTOR", |
|
"neonbf16": "XNN_ENABLE_ARM_BF16", |
|
"neondot": "XNN_ENABLE_ARM_DOTPROD", |
|
"rvv": "XNN_ENABLE_RISCV_VECTOR", |
|
} |
|
|
|
_ISA_TO_ARCH_MAP = { |
|
"armsimd32": ["aarch32"], |
|
"fp16arith": ["aarch32", "aarch64"], |
|
"neon": ["aarch32", "aarch64"], |
|
"neonfp16": ["aarch32", "aarch64"], |
|
"neonfma": ["aarch32", "aarch64"], |
|
"neonv8": ["aarch32", "aarch64"], |
|
"neonfp16arith": ["aarch32", "aarch64"], |
|
"neonbf16": ["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"], |
|
"f16c": ["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"], |
|
"avx512vbmi": ["x86-32", "x86-64"], |
|
"rvv": ["riscv"], |
|
"wasm32": ["wasm", "wasmsimd"], |
|
"wasm": ["wasm", "wasmsimd", "wasmrelaxedsimd"], |
|
"wasmsimd": ["wasmsimd", "wasmrelaxedsimd"], |
|
"wasmrelaxedsimd": ["wasmrelaxedsimd"], |
|
"wasmpshufb": ["wasmrelaxedsimd"], |
|
"wasmsdot": ["wasmrelaxedsimd"], |
|
"wasmblendvps": ["wasmrelaxedsimd"], |
|
} |
|
|
|
_ISA_TO_CHECK_MAP = { |
|
"armsimd32": "TEST_REQUIRES_ARM_SIMD32", |
|
"fp16arith": "TEST_REQUIRES_ARM_FP16_ARITH", |
|
"neon": "TEST_REQUIRES_ARM_NEON", |
|
"neonfp16": "TEST_REQUIRES_ARM_NEON_FP16", |
|
"neonfma": "TEST_REQUIRES_ARM_NEON_FMA", |
|
"neonv8": "TEST_REQUIRES_ARM_NEON_V8", |
|
"neonfp16arith": "TEST_REQUIRES_ARM_NEON_FP16_ARITH", |
|
"neonbf16": "TEST_REQUIRES_ARM_NEON_BF16", |
|
"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", |
|
"f16c": "TEST_REQUIRES_X86_F16C", |
|
"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", |
|
"avx512vbmi": "TEST_REQUIRES_X86_AVX512VBMI", |
|
"rvv": "TEST_REQUIRES_RISCV_VECTOR", |
|
"wasmpshufb": "TEST_REQUIRES_WASM_PSHUFB", |
|
"wasmsdot": "TEST_REQUIRES_WASM_SDOT", |
|
"wasmblendvps": "TEST_REQUIRES_WASM_BLENDVPS", |
|
} |
|
|
|
|
|
def parse_target_name(target_name): |
|
arch = list() |
|
isa = None |
|
assembly = False |
|
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 |
|
elif target_part == "asm": |
|
assembly = True |
|
if isa and not arch: |
|
arch = _ISA_TO_ARCH_MAP[isa] |
|
|
|
return arch, isa, assembly |
|
|
|
|
|
def generate_isa_check_macro(isa): |
|
return _ISA_TO_CHECK_MAP.get(isa, "") |
|
|
|
|
|
def arch_to_macro(arch, isa): |
|
return _ARCH_TO_MACRO_MAP[arch] |
|
|
|
def postprocess_test_case(test_case, arch, isa, assembly=False, jit=False): |
|
test_case = _remove_duplicate_newlines(test_case) |
|
if arch: |
|
guard = " || ".join(arch_to_macro(a, isa) for a in arch) |
|
if isa in _ISA_TO_MACRO_MAP: |
|
if len(arch) > 1: |
|
guard = "%s && (%s)" % (_ISA_TO_MACRO_MAP[isa], guard) |
|
else: |
|
guard = "%s && %s" % (_ISA_TO_MACRO_MAP[isa], guard) |
|
if (assembly or jit) and "||" in guard: |
|
guard = '(' + guard + ')' |
|
if assembly: |
|
guard += " && XNN_ENABLE_ASSEMBLY" |
|
if jit: |
|
guard += " && XNN_PLATFORM_JIT" |
|
return "#if %s\n" % guard + _indent(test_case) + "\n" + \ |
|
"#endif // %s\n" % guard |
|
else: |
|
return test_case |
|
|