summaryrefslogtreecommitdiff
path: root/erts/emulator/beam/jit/beam_jit_common.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/beam/jit/beam_jit_common.hpp')
-rw-r--r--erts/emulator/beam/jit/beam_jit_common.hpp89
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);
+}
/* ** */