mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-46841: Move the cache for LOAD_GLOBAL
inline. (GH-31575)
This commit is contained in:
parent
da7d99a4de
commit
4558af5a8f
10 changed files with 284 additions and 232 deletions
|
@ -26,11 +26,6 @@ typedef struct {
|
|||
uint32_t dk_version;
|
||||
} _PyAttrCache;
|
||||
|
||||
typedef struct {
|
||||
uint32_t module_keys_version;
|
||||
uint32_t builtin_keys_version;
|
||||
} _PyLoadGlobalCache;
|
||||
|
||||
typedef struct {
|
||||
/* Borrowed ref in LOAD_METHOD */
|
||||
PyObject *obj;
|
||||
|
@ -57,23 +52,35 @@ typedef union {
|
|||
_PyEntryZero zero;
|
||||
_PyAdaptiveEntry adaptive;
|
||||
_PyAttrCache attr;
|
||||
_PyLoadGlobalCache load_global;
|
||||
_PyObjectCache obj;
|
||||
_PyCallCache call;
|
||||
} SpecializedCacheEntry;
|
||||
|
||||
#define INSTRUCTIONS_PER_ENTRY (sizeof(SpecializedCacheEntry)/sizeof(_Py_CODEUNIT))
|
||||
|
||||
/* Inline caches */
|
||||
|
||||
#define CACHE_ENTRIES(cache) (sizeof(cache)/sizeof(_Py_CODEUNIT))
|
||||
|
||||
typedef struct {
|
||||
_Py_CODEUNIT counter;
|
||||
_Py_CODEUNIT index;
|
||||
_Py_CODEUNIT module_keys_version;
|
||||
_Py_CODEUNIT _m1;
|
||||
_Py_CODEUNIT builtin_keys_version;
|
||||
} _PyLoadGlobalCache;
|
||||
|
||||
#define INLINE_CACHE_ENTRIES_LOAD_GLOBAL CACHE_ENTRIES(_PyLoadGlobalCache)
|
||||
|
||||
typedef struct {
|
||||
_Py_CODEUNIT counter;
|
||||
} _PyBinaryOpCache;
|
||||
|
||||
#define INLINE_CACHE_ENTRIES_BINARY_OP CACHE_ENTRIES(_PyBinaryOpCache)
|
||||
typedef struct {
|
||||
_Py_CODEUNIT counter;
|
||||
} _PyUnpackSequenceCache;
|
||||
|
||||
#define INLINE_CACHE_ENTRIES_BINARY_OP \
|
||||
(sizeof(_PyBinaryOpCache) / sizeof(_Py_CODEUNIT))
|
||||
|
||||
#define INLINE_CACHE_ENTRIES_UNPACK_SEQUENCE \
|
||||
(sizeof(_PyUnpackSequenceCache) / sizeof(_Py_CODEUNIT))
|
||||
|
@ -307,7 +314,7 @@ cache_backoff(_PyAdaptiveEntry *entry) {
|
|||
|
||||
extern int _Py_Specialize_LoadAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache);
|
||||
extern int _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache);
|
||||
extern int _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache);
|
||||
extern int _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins, _Py_CODEUNIT *instr, PyObject *name);
|
||||
extern int _Py_Specialize_LoadMethod(PyObject *owner, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache);
|
||||
extern int _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, _Py_CODEUNIT *instr, SpecializedCacheEntry *cache);
|
||||
extern int _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *instr);
|
||||
|
@ -388,6 +395,38 @@ extern PyObject* _Py_GetSpecializationStats(void);
|
|||
#define OBJECT_STAT_INC(name) ((void)0)
|
||||
#endif
|
||||
|
||||
// Cache values are only valid in memory, so use native endianness.
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
|
||||
static inline void
|
||||
write32(uint16_t *p, uint32_t val)
|
||||
{
|
||||
p[0] = val >> 16;
|
||||
p[1] = (uint16_t)val;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
read32(uint16_t *p)
|
||||
{
|
||||
return (p[0] << 16) | p[1];
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void
|
||||
write32(uint16_t *p, uint32_t val)
|
||||
{
|
||||
p[0] = (uint16_t)val;
|
||||
p[1] = val >> 16;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
read32(uint16_t *p)
|
||||
{
|
||||
return p[0] | (p[1] << 16);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue