diff options
Diffstat (limited to 'erts/emulator/beam/jit/beam_jit_common.hpp')
-rw-r--r-- | erts/emulator/beam/jit/beam_jit_common.hpp | 89 |
1 files changed, 63 insertions, 26 deletions
diff --git a/erts/emulator/beam/jit/beam_jit_common.hpp b/erts/emulator/beam/jit/beam_jit_common.hpp index 7d32f71dcd..8dbacb6026 100644 --- a/erts/emulator/beam/jit/beam_jit_common.hpp +++ b/erts/emulator/beam/jit/beam_jit_common.hpp @@ -235,32 +235,69 @@ public: } }; -static const int BSC_OP_BINARY = 0; -static const int BSC_OP_FLOAT = 1; -static const int BSC_OP_INTEGER = 2; -static const int BSC_OP_UTF8 = 3; -static const int BSC_OP_UTF16 = 4; -static const int BSC_OP_UTF32 = 5; - -static const int BSC_INFO_FVALUE = 0; -static const int BSC_INFO_TYPE = 1; -static const int BSC_INFO_SIZE = 2; -static const int BSC_INFO_NEGATIVE = 3; -static const int BSC_INFO_UNIT = 4; -static const int BSC_INFO_DEPENDS = 5; - -static const int BSC_REASON_FREASON = 0; -static const int BSC_REASON_BADARG = 1; -static const int BSC_REASON_SYSTEM_LIMIT = 2; -static const int BSC_REASON_DEPENDS = 3; - -#define BSC_SET_SEGMENT_OP(Seg, Op) (((Seg) << 8) | ((Op) << 5)) -#define BSC_SET_REASON_INFO(Reason, Info) (((Info) << 2) | Reason) - -#define BSC_GET_SEGMENT(PackedInfo) ((PackedInfo) >> 8) -#define BSC_GET_OP(PackedInfo) (((PackedInfo) >> 5) & 0x007) -#define BSC_GET_INFO(PackedInfo) (((PackedInfo) >> 2) & 0x07); -#define BSC_GET_REASON(PackedInfo) ((PackedInfo)&0x03); +static const Uint BSC_SEGMENT_OFFSET = 8; + +typedef enum : Uint { + BSC_OP_BINARY = 0, + BSC_OP_FLOAT = 1, + BSC_OP_INTEGER = 2, + BSC_OP_UTF8 = 3, + BSC_OP_UTF16 = 4, + BSC_OP_UTF32 = 5, + BSC_OP_LAST = 5, + BSC_OP_MASK = 0x07, + BSC_OP_OFFSET = 5 +} JitBSCOp; + +typedef enum : Uint { + BSC_INFO_FVALUE = 0, + BSC_INFO_TYPE = 1, + BSC_INFO_SIZE = 2, + BSC_INFO_NEGATIVE = 3, + BSC_INFO_UNIT = 4, + BSC_INFO_DEPENDS = 5, + BSC_INFO_LAST = 5, + BSC_INFO_MASK = 0x07, + BSC_INFO_OFFSET = 2, +} JitBSCInfo; + +typedef enum : Uint { + BSC_REASON_FREASON = 0, + BSC_REASON_BADARG = 1, + BSC_REASON_SYSTEM_LIMIT = 2, + BSC_REASON_DEPENDS = 3, + BSC_REASON_LAST = 3, + BSC_REASON_MASK = 0x03 +} JitBSCReason; + +static constexpr Uint beam_jit_set_bsc_segment_op(Uint segment, JitBSCOp op) { + return (segment << BSC_SEGMENT_OFFSET) | (op << BSC_OP_OFFSET); +} + +static constexpr Uint beam_jit_update_bsc_reason_info(Uint packed_info, + JitBSCReason reason, + JitBSCInfo info) { + return packed_info | (info << BSC_INFO_OFFSET) | reason; +} + +static constexpr Uint beam_jit_get_bsc_segment(Uint packed_info) { + return packed_info >> BSC_SEGMENT_OFFSET; +} + +static constexpr JitBSCOp beam_jit_get_bsc_op(Uint packed_info) { + ERTS_CT_ASSERT((BSC_OP_LAST & ~BSC_OP_MASK) == 0); + return (JitBSCOp)((packed_info >> BSC_OP_OFFSET) & BSC_OP_MASK); +} + +static constexpr JitBSCInfo beam_jit_get_bsc_info(Uint packed_info) { + ERTS_CT_ASSERT((BSC_INFO_LAST & ~BSC_INFO_MASK) == 0); + return (JitBSCInfo)((packed_info >> BSC_INFO_OFFSET) & BSC_INFO_MASK); +} + +static constexpr JitBSCReason beam_jit_get_bsc_reason(Uint packed_info) { + ERTS_CT_ASSERT((BSC_REASON_LAST & ~BSC_REASON_MASK) == 0); + return (JitBSCReason)(packed_info & BSC_REASON_MASK); +} /* ** */ |