mirror of
https://github.com/python/cpython.git
synced 2026-04-15 00:00:57 +00:00
68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
#ifndef Py_CORE_UOP_H
|
|
#define Py_CORE_UOP_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef Py_BUILD_CORE
|
|
# error "this header requires Py_BUILD_CORE define"
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
/* Depending on the format,
|
|
* the 32 bits between the oparg and operand are:
|
|
* UOP_FORMAT_TARGET:
|
|
* uint32_t target;
|
|
* UOP_FORMAT_JUMP
|
|
* uint16_t jump_target;
|
|
* uint16_t error_target;
|
|
*/
|
|
typedef struct _PyUOpInstruction{
|
|
uint16_t opcode:15;
|
|
uint16_t format:1;
|
|
uint16_t oparg;
|
|
union {
|
|
uint32_t target;
|
|
struct {
|
|
uint16_t jump_target;
|
|
uint16_t error_target;
|
|
};
|
|
};
|
|
uint64_t operand0; // A cache entry
|
|
uint64_t operand1;
|
|
#ifdef Py_STATS
|
|
uint64_t execution_count;
|
|
#endif
|
|
} _PyUOpInstruction;
|
|
|
|
// This is the length of the trace we translate initially.
|
|
#if defined(Py_DEBUG) && defined(_Py_JIT)
|
|
// With asserts, the stencils are a lot larger
|
|
#define UOP_MAX_TRACE_LENGTH 1000
|
|
#else
|
|
#define UOP_MAX_TRACE_LENGTH 2500
|
|
#endif
|
|
|
|
/* Bloom filter with m = 256
|
|
* https://en.wikipedia.org/wiki/Bloom_filter */
|
|
#ifdef HAVE_GCC_UINT128_T
|
|
#define _Py_BLOOM_FILTER_WORDS 2
|
|
typedef __uint128_t _Py_bloom_filter_word_t;
|
|
#else
|
|
#define _Py_BLOOM_FILTER_WORDS 4
|
|
typedef uint64_t _Py_bloom_filter_word_t;
|
|
#endif
|
|
|
|
#define _Py_BLOOM_FILTER_BITS_PER_WORD \
|
|
((int)(sizeof(_Py_bloom_filter_word_t) * 8))
|
|
#define _Py_BLOOM_FILTER_WORD_SHIFT \
|
|
((sizeof(_Py_bloom_filter_word_t) == 16) ? 7 : 6)
|
|
|
|
typedef struct {
|
|
_Py_bloom_filter_word_t bits[_Py_BLOOM_FILTER_WORDS];
|
|
} _PyBloomFilter;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* !Py_INTERNAL_UOP_H */
|