summaryrefslogtreecommitdiff
path: root/src/jit/instr.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/jit/instr.h')
-rw-r--r--src/jit/instr.h301
1 files changed, 301 insertions, 0 deletions
diff --git a/src/jit/instr.h b/src/jit/instr.h
new file mode 100644
index 0000000000..c38f8d2073
--- /dev/null
+++ b/src/jit/instr.h
@@ -0,0 +1,301 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+/*****************************************************************************/
+
+#ifndef _INSTR_H_
+#define _INSTR_H_
+/*****************************************************************************/
+
+#define BAD_CODE 0x0BADC0DE // better not match a real encoding!
+
+/*****************************************************************************/
+
+// clang-format off
+DECLARE_TYPED_ENUM(instruction,unsigned)
+{
+#if defined(_TARGET_XARCH_)
+ #define INST0(id, nm, fp, um, rf, wf, mr ) INS_##id,
+ #define INST1(id, nm, fp, um, rf, wf, mr ) INS_##id,
+ #define INST2(id, nm, fp, um, rf, wf, mr, mi ) INS_##id,
+ #define INST3(id, nm, fp, um, rf, wf, mr, mi, rm ) INS_##id,
+ #define INST4(id, nm, fp, um, rf, wf, mr, mi, rm, a4 ) INS_##id,
+ #define INST5(id, nm, fp, um, rf, wf, mr, mi, rm, a4, rr) INS_##id,
+ #include "instrs.h"
+
+#elif defined(_TARGET_ARM_)
+ #define INST1(id, nm, fp, ldst, fmt, e1 ) INS_##id,
+ #define INST2(id, nm, fp, ldst, fmt, e1, e2 ) INS_##id,
+ #define INST3(id, nm, fp, ldst, fmt, e1, e2, e3 ) INS_##id,
+ #define INST4(id, nm, fp, ldst, fmt, e1, e2, e3, e4 ) INS_##id,
+ #define INST5(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5 ) INS_##id,
+ #define INST6(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5, e6 ) INS_##id,
+ #define INST8(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5, e6, e7, e8 ) INS_##id,
+ #define INST9(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5, e6, e7, e8, e9) INS_##id,
+ #include "instrs.h"
+ #include "x86_instrs.h"
+
+#elif defined(_TARGET_ARM64_)
+ #define INST1(id, nm, fp, ldst, fmt, e1 ) INS_##id,
+ #define INST2(id, nm, fp, ldst, fmt, e1, e2 ) INS_##id,
+ #define INST3(id, nm, fp, ldst, fmt, e1, e2, e3 ) INS_##id,
+ #define INST4(id, nm, fp, ldst, fmt, e1, e2, e3, e4 ) INS_##id,
+ #define INST5(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5 ) INS_##id,
+ #define INST6(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5, e6 ) INS_##id,
+ #define INST9(id, nm, fp, ldst, fmt, e1, e2, e3, e4, e5, e6, e7, e8, e9) INS_##id,
+ #include "instrs.h"
+
+ INS_lea, // Not a real instruction. It is used for load the address of stack locals
+
+#else
+#error Unsupported target architecture
+#endif
+
+ INS_none,
+ INS_count = INS_none
+}
+END_DECLARE_TYPED_ENUM(instruction,unsigned)
+
+/*****************************************************************************/
+
+enum insUpdateModes
+{
+ IUM_RD,
+ IUM_WR,
+ IUM_RW,
+};
+
+/*****************************************************************************/
+
+enum emitJumpKind
+{
+ EJ_NONE,
+
+ #define JMP_SMALL(en, rev, ins) EJ_##en,
+ #include "emitjmps.h"
+
+ EJ_COUNT
+};
+
+/*****************************************************************************/
+
+DECLARE_TYPED_ENUM(GCtype,unsigned)
+{
+ GCT_NONE,
+ GCT_GCREF,
+ GCT_BYREF
+}
+END_DECLARE_TYPED_ENUM(GCtype,unsigned)
+
+// TODO-Cleanup: Move 'insFlags' under _TARGET_ARM_
+DECLARE_TYPED_ENUM(insFlags,unsigned)
+{
+ INS_FLAGS_NOT_SET,
+ INS_FLAGS_SET,
+ INS_FLAGS_DONT_CARE
+};
+END_DECLARE_TYPED_ENUM(insFlags,unsigned)
+
+#if defined(_TARGET_ARM_)
+DECLARE_TYPED_ENUM(insOpts,unsigned)
+{
+ INS_OPTS_NONE,
+ INS_OPTS_LDST_PRE_DEC,
+ INS_OPTS_LDST_POST_INC,
+
+ INS_OPTS_RRX,
+ INS_OPTS_LSL,
+ INS_OPTS_LSR,
+ INS_OPTS_ASR,
+ INS_OPTS_ROR
+}
+END_DECLARE_TYPED_ENUM(insOpts,unsigned)
+#elif defined(_TARGET_ARM64_)
+DECLARE_TYPED_ENUM(insOpts,unsigned)
+{
+ INS_OPTS_NONE,
+
+ INS_OPTS_PRE_INDEX,
+ INS_OPTS_POST_INDEX,
+
+ INS_OPTS_LSL12,
+
+ INS_OPTS_LSL = 4,
+ INS_OPTS_LSR,
+ INS_OPTS_ASR,
+ INS_OPTS_ROR,
+
+ INS_OPTS_UXTB = 8,
+ INS_OPTS_UXTH,
+ INS_OPTS_UXTW,
+ INS_OPTS_UXTX,
+ INS_OPTS_SXTB,
+ INS_OPTS_SXTH,
+ INS_OPTS_SXTW,
+ INS_OPTS_SXTX,
+
+ INS_OPTS_8B = 16,
+ INS_OPTS_16B,
+ INS_OPTS_4H,
+ INS_OPTS_8H,
+ INS_OPTS_2S,
+ INS_OPTS_4S,
+ INS_OPTS_1D,
+ INS_OPTS_2D,
+
+ INS_OPTS_MSL, // Vector Immediate (shifting ones variant)
+
+ INS_OPTS_S_TO_4BYTE, // Single to INT32
+ INS_OPTS_D_TO_4BYTE, // Double to INT32
+
+ INS_OPTS_S_TO_8BYTE, // Single to INT64
+ INS_OPTS_D_TO_8BYTE, // Double to INT64
+
+ INS_OPTS_4BYTE_TO_S, // INT32 to Single
+ INS_OPTS_4BYTE_TO_D, // INT32 to Double
+
+ INS_OPTS_8BYTE_TO_S, // INT64 to Single
+ INS_OPTS_8BYTE_TO_D, // INT64 to Double
+
+ INS_OPTS_S_TO_D, // Single to Double
+ INS_OPTS_D_TO_S, // Double to Single
+
+ INS_OPTS_H_TO_S, // Half to Single
+ INS_OPTS_H_TO_D, // Half to Double
+
+ INS_OPTS_S_TO_H, // Single to Half
+ INS_OPTS_D_TO_H, // Double to Half
+}
+END_DECLARE_TYPED_ENUM(insOpts,unsigned)
+
+DECLARE_TYPED_ENUM(insCond,unsigned)
+{
+ INS_COND_EQ,
+ INS_COND_NE,
+ INS_COND_HS,
+ INS_COND_LO,
+
+ INS_COND_MI,
+ INS_COND_PL,
+ INS_COND_VS,
+ INS_COND_VC,
+
+ INS_COND_HI,
+ INS_COND_LS,
+ INS_COND_GE,
+ INS_COND_LT,
+
+ INS_COND_GT,
+ INS_COND_LE,
+}
+END_DECLARE_TYPED_ENUM(insCond,unsigned)
+
+DECLARE_TYPED_ENUM(insCflags,unsigned)
+{
+ INS_FLAGS_NONE,
+ INS_FLAGS_V,
+ INS_FLAGS_C,
+ INS_FLAGS_CV,
+
+ INS_FLAGS_Z,
+ INS_FLAGS_ZV,
+ INS_FLAGS_ZC,
+ INS_FLAGS_ZCV,
+
+ INS_FLAGS_N,
+ INS_FLAGS_NV,
+ INS_FLAGS_NC,
+ INS_FLAGS_NCV,
+
+ INS_FLAGS_NZ,
+ INS_FLAGS_NZV,
+ INS_FLAGS_NZC,
+ INS_FLAGS_NZCV,
+}
+END_DECLARE_TYPED_ENUM(insCFlags,unsigned)
+
+DECLARE_TYPED_ENUM(insBarrier,unsigned)
+{
+ INS_BARRIER_OSHLD = 1,
+ INS_BARRIER_OSHST = 2,
+ INS_BARRIER_OSH = 3,
+
+ INS_BARRIER_NSHLD = 5,
+ INS_BARRIER_NSHST = 6,
+ INS_BARRIER_NSH = 7,
+
+ INS_BARRIER_ISHLD = 9,
+ INS_BARRIER_ISHST = 10,
+ INS_BARRIER_ISH = 11,
+
+ INS_BARRIER_LD = 13,
+ INS_BARRIER_ST = 14,
+ INS_BARRIER_SY = 15,
+}
+END_DECLARE_TYPED_ENUM(insBarrier,unsigned)
+#endif
+
+#undef EA_UNKNOWN
+DECLARE_TYPED_ENUM(emitAttr,unsigned)
+{
+ EA_UNKNOWN = 0x000,
+ EA_1BYTE = 0x001,
+ EA_2BYTE = 0x002,
+ EA_4BYTE = 0x004,
+ EA_8BYTE = 0x008,
+ EA_16BYTE = 0x010,
+ EA_32BYTE = 0x020,
+ EA_SIZE_MASK = 0x03F,
+
+#ifdef _TARGET_64BIT_
+ EA_PTRSIZE = EA_8BYTE,
+#else
+ EA_PTRSIZE = EA_4BYTE,
+#endif
+
+ EA_OFFSET_FLG = 0x040,
+ EA_OFFSET = EA_OFFSET_FLG | EA_PTRSIZE, /* size == 0 */
+ EA_GCREF_FLG = 0x080,
+ EA_GCREF = EA_GCREF_FLG | EA_PTRSIZE, /* size == -1 */
+ EA_BYREF_FLG = 0x100,
+ EA_BYREF = EA_BYREF_FLG | EA_PTRSIZE, /* size == -2 */
+ EA_DSP_RELOC_FLG = 0x200,
+ EA_CNS_RELOC_FLG = 0x400,
+}
+END_DECLARE_TYPED_ENUM(emitAttr,unsigned)
+
+#define EA_ATTR(x) ((emitAttr)(x))
+#define EA_SIZE(x) ((emitAttr)(((unsigned)(x)) & EA_SIZE_MASK))
+#define EA_SIZE_IN_BYTES(x) ((UNATIVE_OFFSET)(EA_SIZE(x)))
+#define EA_SET_SIZE(x, sz) ((emitAttr)((((unsigned)(x)) & ~EA_SIZE_MASK) | sz))
+#define EA_SET_FLG(x, flg) ((emitAttr)(((unsigned)(x)) | flg))
+#define EA_4BYTE_DSP_RELOC (EA_SET_FLG(EA_4BYTE, EA_DSP_RELOC_FLG))
+#define EA_PTR_DSP_RELOC (EA_SET_FLG(EA_PTRSIZE, EA_DSP_RELOC_FLG))
+#define EA_HANDLE_CNS_RELOC (EA_SET_FLG(EA_PTRSIZE, EA_CNS_RELOC_FLG))
+#define EA_IS_OFFSET(x) ((((unsigned)(x)) & ((unsigned)EA_OFFSET_FLG)) != 0)
+#define EA_IS_GCREF(x) ((((unsigned)(x)) & ((unsigned)EA_GCREF_FLG)) != 0)
+#define EA_IS_BYREF(x) ((((unsigned)(x)) & ((unsigned)EA_BYREF_FLG)) != 0)
+#define EA_IS_GCREF_OR_BYREF(x) ((((unsigned)(x)) & ((unsigned)(EA_BYREF_FLG | EA_GCREF_FLG))) != 0)
+#define EA_IS_DSP_RELOC(x) ((((unsigned)(x)) & ((unsigned)EA_DSP_RELOC_FLG)) != 0)
+#define EA_IS_CNS_RELOC(x) ((((unsigned)(x)) & ((unsigned)EA_CNS_RELOC_FLG)) != 0)
+#define EA_IS_RELOC(x) (EA_IS_DSP_RELOC(x) || EA_IS_CNS_RELOC(x))
+#define EA_TYPE(x) ((emitAttr)(((unsigned)(x)) & ~(EA_OFFSET_FLG | EA_DSP_RELOC_FLG | EA_CNS_RELOC_FLG)))
+
+#define EmitSize(x) (EA_ATTR(genTypeSize(TypeGet(x))))
+
+// Enum specifying the instruction set for generating floating point or SIMD code.
+enum InstructionSet
+{
+#ifdef _TARGET_XARCH_
+ InstructionSet_SSE2,
+ InstructionSet_AVX,
+#elif defined(_TARGET_ARM_)
+ InstructionSet_NEON,
+#endif
+ InstructionSet_NONE
+};
+// clang-format on
+
+/*****************************************************************************/
+#endif //_INSTR_H_
+/*****************************************************************************/