Flutter Engine
The Flutter Engine
third_party
skia
src
core
SkCpu.h
Go to the documentation of this file.
1
/*
2
* Copyright 2016 Google Inc.
3
*
4
* Use of this source code is governed by a BSD-style license that can be
5
* found in the LICENSE file.
6
*/
7
8
#ifndef SkCpu_DEFINED
9
#define SkCpu_DEFINED
10
11
#include "
include/core/SkTypes.h
"
12
13
#include <cstdint>
14
15
struct
SkCpu
{
16
enum
{
17
SSE1
= 1 << 0,
18
SSE2
= 1 << 1,
19
SSE3
= 1 << 2,
20
SSSE3
= 1 << 3,
21
SSE41
= 1 << 4,
22
SSE42
= 1 << 5,
23
AVX
= 1 << 6,
24
F16C
= 1 << 7,
25
FMA
= 1 << 8,
26
AVX2
= 1 << 9,
27
BMI1
= 1 << 10,
28
BMI2
= 1 << 11,
29
// Handy alias for all the cool Haswell+ instructions.
30
HSW
=
AVX2
|
BMI1
|
BMI2
|
F16C
|
FMA
,
31
32
AVX512F
= 1 << 12,
33
AVX512DQ
= 1 << 13,
34
AVX512IFMA
= 1 << 14,
35
AVX512PF
= 1 << 15,
36
AVX512ER
= 1 << 16,
37
AVX512CD
= 1 << 17,
38
AVX512BW
= 1 << 18,
39
AVX512VL
= 1 << 19,
40
41
// Handy alias for all the cool Skylake Xeon+ instructions.
42
SKX
=
AVX512F
|
AVX512DQ
|
AVX512CD
|
AVX512BW
|
AVX512VL
,
43
44
ERMS
= 1 << 20,
45
};
46
47
enum
{
48
LOONGARCH_SX
= 1 << 0,
49
LOONGARCH_ASX
= 1 << 1,
50
};
51
52
static
void
CacheRuntimeFeatures
();
53
static
bool
Supports
(uint32_t);
54
private
:
55
static
uint32_t gCachedFeatures;
56
};
57
58
inline
bool
SkCpu::Supports
(uint32_t mask) {
59
uint32_t features = gCachedFeatures;
60
61
// If we mask in compile-time known lower limits, the compiler can
62
// often compile away this entire function.
63
#if SK_CPU_X86
64
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1
65
features |=
SSE1
;
66
#endif
67
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
68
features |=
SSE2
;
69
#endif
70
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE3
71
features |=
SSE3
;
72
#endif
73
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3
74
features |=
SSSE3
;
75
#endif
76
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41
77
features |=
SSE41
;
78
#endif
79
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE42
80
features |=
SSE42
;
81
#endif
82
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX
83
features |=
AVX
;
84
#endif
85
// F16C goes here if we add SK_CPU_SSE_LEVEL_F16C
86
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2
87
features |=
AVX2
;
88
#endif
89
#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SKX
90
features |= (
AVX512F
|
AVX512DQ
|
AVX512CD
|
AVX512BW
|
AVX512VL
);
91
#endif
92
// FMA doesn't fit neatly into this total ordering.
93
// It's available on Haswell+ just like AVX2, but it's technically a different bit.
94
// TODO: circle back on this if we find ourselves limited by lack of compile-time FMA
95
96
#if defined(SK_CPU_LIMIT_AVX)
97
features &= (
SSE1
|
SSE2
|
SSE3
|
SSSE3
|
SSE41
|
SSE42
|
AVX
);
98
#elif defined(SK_CPU_LIMIT_SSE41)
99
features &= (
SSE1
|
SSE2
|
SSE3
|
SSSE3
|
SSE41
);
100
#elif defined(SK_CPU_LIMIT_SSE2)
101
features &= (
SSE1
|
SSE2
);
102
#endif
103
104
#elif SK_CPU_LOONGARCH
105
#if SK_CPU_LSX_LEVEL >= SK_CPU_LSX_LEVEL_LSX
106
features |=
LOONGARCH_SX
;
107
#endif
108
#if SK_CPU_LSX_LEVEL >= SK_CPU_LSX_LEVEL_LASX
109
features |=
LOONGARCH_ASX
;
110
#endif
111
112
#endif
113
return
(features & mask) == mask;
114
}
115
116
#endif
//SkCpu_DEFINED
SkTypes.h
SkCpu
Definition:
SkCpu.h:15
SkCpu::CacheRuntimeFeatures
static void CacheRuntimeFeatures()
Definition:
SkCpu.cpp:94
SkCpu::Supports
static bool Supports(uint32_t)
Definition:
SkCpu.h:58
SkCpu::LOONGARCH_ASX
@ LOONGARCH_ASX
Definition:
SkCpu.h:49
SkCpu::LOONGARCH_SX
@ LOONGARCH_SX
Definition:
SkCpu.h:48
SkCpu::AVX512CD
@ AVX512CD
Definition:
SkCpu.h:37
SkCpu::AVX512VL
@ AVX512VL
Definition:
SkCpu.h:39
SkCpu::AVX
@ AVX
Definition:
SkCpu.h:23
SkCpu::ERMS
@ ERMS
Definition:
SkCpu.h:44
SkCpu::AVX512ER
@ AVX512ER
Definition:
SkCpu.h:36
SkCpu::AVX512F
@ AVX512F
Definition:
SkCpu.h:32
SkCpu::AVX512PF
@ AVX512PF
Definition:
SkCpu.h:35
SkCpu::HSW
@ HSW
Definition:
SkCpu.h:30
SkCpu::AVX512IFMA
@ AVX512IFMA
Definition:
SkCpu.h:34
SkCpu::SSE1
@ SSE1
Definition:
SkCpu.h:17
SkCpu::AVX512BW
@ AVX512BW
Definition:
SkCpu.h:38
SkCpu::FMA
@ FMA
Definition:
SkCpu.h:25
SkCpu::SSE2
@ SSE2
Definition:
SkCpu.h:18
SkCpu::AVX2
@ AVX2
Definition:
SkCpu.h:26
SkCpu::SSE3
@ SSE3
Definition:
SkCpu.h:19
SkCpu::AVX512DQ
@ AVX512DQ
Definition:
SkCpu.h:33
SkCpu::SKX
@ SKX
Definition:
SkCpu.h:42
SkCpu::F16C
@ F16C
Definition:
SkCpu.h:24
SkCpu::SSE41
@ SSE41
Definition:
SkCpu.h:21
SkCpu::BMI2
@ BMI2
Definition:
SkCpu.h:28
SkCpu::SSE42
@ SSE42
Definition:
SkCpu.h:22
SkCpu::SSSE3
@ SSSE3
Definition:
SkCpu.h:20
SkCpu::BMI1
@ BMI1
Definition:
SkCpu.h:27
Generated on Sun Jun 23 2024 21:56:11 for Flutter Engine by
1.9.4