#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 /* 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 */