1//===-- Compile time cpu feature detection ----------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8// This file lists target cpu features by introspecting compiler enabled
9// preprocessor definitions.
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H
13#define LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H
14
15#include "architectures.h"
16
17#if defined(__ARM_FEATURE_FP16_SCALAR_ARITHMETIC)
18#define LIBC_TARGET_CPU_HAS_FULLFP16
19#endif
20
21#if defined(__ARM_FEATURE_SVE)
22#define LIBC_TARGET_CPU_HAS_SVE
23#endif
24
25#if defined(__ARM_FEATURE_SVE2)
26#define LIBC_TARGET_CPU_HAS_SVE2
27#endif
28
29#if defined(__ARM_FEATURE_MOPS)
30#define LIBC_TARGET_CPU_HAS_MOPS
31#endif
32
33#if defined(__SSE2__)
34#define LIBC_TARGET_CPU_HAS_SSE2
35#define LIBC_TARGET_CPU_HAS_FPU_FLOAT
36#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE
37#endif
38
39#if defined(__SSE4_2__)
40#define LIBC_TARGET_CPU_HAS_SSE4_2
41#endif
42
43#if defined(__AVX__)
44#define LIBC_TARGET_CPU_HAS_AVX
45#endif
46
47#if defined(__AVX2__)
48#define LIBC_TARGET_CPU_HAS_AVX2
49#endif
50
51#if defined(__AVX512F__)
52#define LIBC_TARGET_CPU_HAS_AVX512F
53#endif
54
55#if defined(__AVX512BW__)
56#define LIBC_TARGET_CPU_HAS_AVX512BW
57#endif
58
59#if defined(__AVX512F__) || defined(__AVX2__)
60#define LIBC_TARGET_CPU_HAS_GATHER
61#endif
62
63#if defined(__ARM_FP)
64#if (__ARM_FP & 0x2)
65#define LIBC_TARGET_CPU_HAS_ARM_FPU_HALF
66#define LIBC_TARGET_CPU_HAS_FPU_HALF
67#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_HALF
68#if (__ARM_FP & 0x4)
69#define LIBC_TARGET_CPU_HAS_ARM_FPU_FLOAT
70#define LIBC_TARGET_CPU_HAS_FPU_FLOAT
71#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_FLOAT
72#if (__ARM_FP & 0x8)
73#define LIBC_TARGET_CPU_HAS_ARM_FPU_DOUBLE
74#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE
75#endif // LIBC_TARGET_CPU_HAS_ARM_FPU_DOUBLE
76#endif // __ARM_FP
77
78#if defined(__ARM_NEON)
79#define LIBC_TARGET_CPU_HAS_ARM_NEON
80#endif
81
82#if defined(__riscv_flen)
83// https://github.com/riscv-non-isa/riscv-c-api-doc/blob/main/src/c-api.adoc
84#if defined(__riscv_zfhmin)
85#define LIBC_TARGET_CPU_HAS_RISCV_FPU_HALF
86#define LIBC_TARGET_CPU_HAS_FPU_HALF
87#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_HALF
88#if (__riscv_flen >= 32)
89#define LIBC_TARGET_CPU_HAS_RISCV_FPU_FLOAT
90#define LIBC_TARGET_CPU_HAS_FPU_FLOAT
91#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_FLOAT
92#if (__riscv_flen >= 64)
93#define LIBC_TARGET_CPU_HAS_RISCV_FPU_DOUBLE
94#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE
95#endif // LIBC_TARGET_CPU_HAS_RISCV_FPU_DOUBLE
96#endif // __riscv_flen
97
98#if defined(__NVPTX__) || defined(__AMDGPU__) || defined(__SPIRV__)
99#define LIBC_TARGET_CPU_HAS_FPU_FLOAT
100#define LIBC_TARGET_CPU_HAS_FPU_DOUBLE
101#endif
102
103#if defined(__ARM_FEATURE_FMA) || (defined(__AVX2__) && defined(__FMA__)) || \
104 defined(__NVPTX__) || defined(__AMDGPU__) || defined(__riscv_flen) || \
105 defined(__SPIRV__)
106#define LIBC_TARGET_CPU_HAS_FMA
107// Provide a more fine-grained control of FMA instruction for ARM targets.
108#if defined(LIBC_TARGET_CPU_HAS_FPU_HALF)
109#define LIBC_TARGET_CPU_HAS_FMA_HALF
110#endif // LIBC_TARGET_CPU_HAS_FMA_HALF
111#if defined(LIBC_TARGET_CPU_HAS_FPU_FLOAT)
112#define LIBC_TARGET_CPU_HAS_FMA_FLOAT
113#endif // LIBC_TARGET_CPU_HAS_FMA_FLOAT
114#if defined(LIBC_TARGET_CPU_HAS_FPU_DOUBLE)
115#define LIBC_TARGET_CPU_HAS_FMA_DOUBLE
116#endif // LIBC_TARGET_CPU_HAS_FMA_DOUBLE
117#endif
118
119#if defined(LIBC_TARGET_ARCH_IS_AARCH64) || \
120 (defined(LIBC_TARGET_ARCH_IS_X86_64) && \
121 defined(LIBC_TARGET_CPU_HAS_SSE4_2))
122#define LIBC_TARGET_CPU_HAS_NEAREST_INT
123#endif
124
125#if defined(LIBC_TARGET_ARCH_IS_AARCH64) || defined(LIBC_TARGET_ARCH_IS_GPU)
126#define LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS
127#endif
128
129#endif // LLVM_LIBC_SRC___SUPPORT_MACROS_PROPERTIES_CPU_FEATURES_H
130