diff --git a/src/jit/CMakeLists.txt b/src/jit/CMakeLists.txt index dd3a865..3faa39a 100644 --- a/src/jit/CMakeLists.txt +++ b/src/jit/CMakeLists.txt @@ -4,6 +4,7 @@ target_sources(jit PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/decoder/arm32.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ir/type.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ir/value.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/ir/opcode.cpp ) target_link_libraries(jit PRIVATE common host) diff --git a/src/jit/ir/opcode.cpp b/src/jit/ir/opcode.cpp new file mode 100644 index 0000000..80c204d --- /dev/null +++ b/src/jit/ir/opcode.cpp @@ -0,0 +1,29 @@ +#include "opcode.h" +#include + +#define LOG_MODULE "jit" +#include "common/logging.h" + +namespace pound::jit::ir { + +decoded_opcode_t g_opcodes[NUM_OPCODE] = { +#define OPCODE(name, type, ...) \ + decoded_opcode_t { #name, type, { __VA_ARGS__ } }, +#define A32OPC(name, type, ...) \ + decoded_opcode_t { #name, type, { __VA_ARGS__ } }, +// #define A64OPC(name, type, ...) decoded_opcode_t{#name, type, {__VA_ARGS__}}, +#include "./opcode.inc" +#undef OPCODE + // #undef A32OPC + // #undef A64OPC +}; + +void +opcode_init (void) +{ + for (size_t i = 0; i < NUM_OPCODE; ++i) + { + LOG_TRACE("Opcode Registered: %s", g_opcodes[i].name); + } +} +} // namespace pound::jit::ir diff --git a/src/jit/ir/opcode.h b/src/jit/ir/opcode.h new file mode 100644 index 0000000..832ec40 --- /dev/null +++ b/src/jit/ir/opcode.h @@ -0,0 +1,58 @@ +/** + * @file opcode.h + * + * @brief Defines JIT IR opcodes and their metadata. + * + * The actual definitions of opcodes and their metadata are generated + * by including "opcode.inc", which is processed using X-macros. + */ + +#include "type.h" + +namespace pound::jit::ir { +// The maximum number of argument types an IR opcode can have. +#define OPCODE_ARGS_TYPES_SIZE 4 + +/*! + * @brief Enumeration of all microinstructions (opcodes) in the JIT IR. + * + * Each enum value corresponds to a specific operation that can be + * performed by the JIT, such as arithmetic operations, memory accesses, + * or system register manipulations. + * + * The enum values are generated by including "opcode.inc" and using + * the OPCODE and A32OPC macros. A64OPC is currently disabled. + */ +typedef enum +{ +#define OPCODE(name, type, ...) OPCODE_##name, +#define A32OPC(name, type, ...) OPCODE_A32##name, +// #define A64OPC(name, type, ...) OPCODE_A64##name, +#include "./opcode.inc" +#undef OPCODE +#undef A32OPC +#undef A64OPC + NUM_OPCODE +} opcode_t; + +/*! + * @brief Structure holding static metadata for an IR opcode. + */ +typedef struct +{ + const char *name; + type_t type; + type_t arg_types[OPCODE_ARGS_TYPES_SIZE]; +} decoded_opcode_t; + +/*! + * @brief Global array of `decoded_opcode_t` structures for all opcodes. + * + * This array is indexed by the `opcode_t` enum values, providing a direct + * lookup for opcode metadata. For example, `g_opcodes[OPCODE_Add32].name` + * would yield "Add32". + */ +extern decoded_opcode_t g_opcodes[NUM_OPCODE]; + +void opcode_init(void); +} diff --git a/src/jit/ir/opcode.inc b/src/jit/ir/opcode.inc new file mode 100644 index 0000000..484cb4f --- /dev/null +++ b/src/jit/ir/opcode.inc @@ -0,0 +1,775 @@ +// clang-format off + +// opcode name, return type, arg1 type, arg2 type, arg3 type, arg4 type, ... + +OPCODE(Void, IR_TYPE_VOID, ) +OPCODE(Identity, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE ) +OPCODE(Breakpoint, IR_TYPE_VOID, ) +OPCODE(CallHostFunction, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE ) + +// A32 Context getters/setters +A32OPC(SetCheckBit, IR_TYPE_VOID, IR_TYPE_U1 ) +A32OPC(GetRegister, IR_TYPE_U32, IR_TYPE_A32_REGISTER ) +A32OPC(GetExtendedRegister32, IR_TYPE_U32, IR_TYPE_A32_EXTENDED_REGISTER ) +A32OPC(GetExtendedRegister64, IR_TYPE_U64, IR_TYPE_A32_EXTENDED_REGISTER ) +A32OPC(GetVector, IR_TYPE_U128, IR_TYPE_A32_EXTENDED_REGISTER ) +A32OPC(SetRegister, IR_TYPE_VOID, IR_TYPE_A32_REGISTER, IR_TYPE_U32 ) +A32OPC(SetExtendedRegister32, IR_TYPE_VOID, IR_TYPE_A32_EXTENDED_REGISTER, IR_TYPE_U32 ) +A32OPC(SetExtendedRegister64, IR_TYPE_VOID, IR_TYPE_A32_EXTENDED_REGISTER, IR_TYPE_U64 ) +A32OPC(SetVector, IR_TYPE_VOID, IR_TYPE_A32_EXTENDED_REGISTER, IR_TYPE_U128 ) +A32OPC(GetCpsr, IR_TYPE_U32, ) +A32OPC(SetCpsr, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(SetCpsrNZCV, IR_TYPE_VOID, IR_TYPE_NZCV ) +A32OPC(SetCpsrNZCVRaw, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(SetCpsrNZCVQ, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(SetCpsrNZ, IR_TYPE_VOID, IR_TYPE_NZCV ) +A32OPC(SetCpsrNZC, IR_TYPE_VOID, IR_TYPE_NZCV, IR_TYPE_U1 ) +A32OPC(GetCFlag, IR_TYPE_U1, ) +A32OPC(OrQFlag, IR_TYPE_VOID, IR_TYPE_U1 ) +A32OPC(GetGEFlags, IR_TYPE_U32, ) +A32OPC(SetGEFlags, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(SetGEFlagsCompressed, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(BXWritePC, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(UpdateUpperLocationDescriptor, IR_TYPE_VOID, ) +A32OPC(CallSupervisor, IR_TYPE_VOID, IR_TYPE_U32 ) +A32OPC(ExceptionRaised, IR_TYPE_VOID, IR_TYPE_U32, IR_TYPE_U64 ) +A32OPC(DataSynchronizationBarrier, IR_TYPE_VOID, ) +A32OPC(DataMemoryBarrier, IR_TYPE_VOID, ) +A32OPC(InstructionSynchronizationBarrier, IR_TYPE_VOID, ) +A32OPC(GetFpscr, IR_TYPE_U32, ) +A32OPC(SetFpscr, IR_TYPE_VOID, IR_TYPE_U32, ) +A32OPC(GetFpscrNZCV, IR_TYPE_U32, ) +A32OPC(SetFpscrNZCV, IR_TYPE_VOID, IR_TYPE_NZCV ) + +#if 0 +// A64 Context getters/setters +A64OPC(SetCheckBit, IR_TYPE_VOID, IR_TYPE_U1 ) +A64OPC(GetCFlag, IR_TYPE_U1, ) +A64OPC(GetNZCVRaw, IR_TYPE_U32, ) +A64OPC(SetNZCVRaw, IR_TYPE_VOID, IR_TYPE_U32 ) +A64OPC(SetNZCV, IR_TYPE_VOID, IR_TYPE_NZCV ) +A64OPC(GetW, IR_TYPE_U32, A64Reg ) +A64OPC(GetX, IR_TYPE_U64, A64Reg ) +A64OPC(GetS, IR_TYPE_U128, A64Vec ) +A64OPC(GetD, IR_TYPE_U128, A64Vec ) +A64OPC(GetQ, IR_TYPE_U128, A64Vec ) +A64OPC(GetSP, IR_TYPE_U64, ) +A64OPC(GetFPCR, IR_TYPE_U32, ) +A64OPC(GetFPSR, IR_TYPE_U32, ) +A64OPC(SetW, IR_TYPE_VOID, A64Reg, IR_TYPE_U32 ) +A64OPC(SetX, IR_TYPE_VOID, A64Reg, IR_TYPE_U64 ) +A64OPC(SetS, IR_TYPE_VOID, A64Vec, IR_TYPE_U128 ) +A64OPC(SetD, IR_TYPE_VOID, A64Vec, IR_TYPE_U128 ) +A64OPC(SetQ, IR_TYPE_VOID, A64Vec, IR_TYPE_U128 ) +A64OPC(SetSP, IR_TYPE_VOID, IR_TYPE_U64 ) +A64OPC(SetFPCR, IR_TYPE_VOID, IR_TYPE_U32 ) +A64OPC(SetFPSR, IR_TYPE_VOID, IR_TYPE_U32 ) +A64OPC(SetPC, IR_TYPE_VOID, IR_TYPE_U64 ) +A64OPC(CallSupervisor, IR_TYPE_VOID, IR_TYPE_U32 ) +A64OPC(ExceptionRaised, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64 ) +A64OPC(DataCacheOperationRaised, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +A64OPC(InstructionCacheOperationRaised, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64 ) +A64OPC(DataSynchronizationBarrier, IR_TYPE_VOID, ) +A64OPC(DataMemoryBarrier, IR_TYPE_VOID, ) +A64OPC(InstructionSynchronizationBarrier, IR_TYPE_VOID, ) +A64OPC(GetCNTFRQ, IR_TYPE_U32, ) +A64OPC(GetCNTPCT, IR_TYPE_U64, ) +A64OPC(GetCTR, IR_TYPE_U32, ) +A64OPC(GetDCZID, IR_TYPE_U32, ) +A64OPC(GetTPIDR, IR_TYPE_U64, ) +A64OPC(GetTPIDRRO, IR_TYPE_U64, ) +A64OPC(SetTPIDR, IR_TYPE_VOID, IR_TYPE_U64 ) +#endif + +// Hints +OPCODE(PushRSB, IR_TYPE_VOID, IR_TYPE_U64 ) + +// Pseudo-operation, handled specially at final emit +OPCODE(GetCarryFromOp, IR_TYPE_U1, IR_TYPE_OPAQUE ) +OPCODE(GetOverflowFromOp, IR_TYPE_U1, IR_TYPE_OPAQUE ) +OPCODE(GetGEFromOp, IR_TYPE_U32, IR_TYPE_OPAQUE ) +OPCODE(GetNZCVFromOp, IR_TYPE_NZCV, IR_TYPE_OPAQUE ) +OPCODE(GetNZFromOp, IR_TYPE_NZCV, IR_TYPE_OPAQUE ) +OPCODE(GetUpperFromOp, IR_TYPE_U128, IR_TYPE_OPAQUE ) +OPCODE(GetLowerFromOp, IR_TYPE_U128, IR_TYPE_OPAQUE ) + +OPCODE(GetCFlagFromNZCV, IR_TYPE_U1, IR_TYPE_NZCV ) +OPCODE(NZCVFromPackedFlags, IR_TYPE_NZCV, IR_TYPE_U32 ) + +// Calculations +OPCODE(Pack2x32To1x64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(Pack2x64To1x128, IR_TYPE_U128, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(LeastSignificantWord, IR_TYPE_U32, IR_TYPE_U64 ) +OPCODE(LeastSignificantHalf, IR_TYPE_U16, IR_TYPE_U32 ) +OPCODE(LeastSignificantByte, IR_TYPE_U8, IR_TYPE_U32 ) +OPCODE(MostSignificantWord, IR_TYPE_U32, IR_TYPE_U64 ) +OPCODE(MostSignificantBit, IR_TYPE_U1, IR_TYPE_U32 ) +OPCODE(IsZero32, IR_TYPE_U1, IR_TYPE_U32 ) +OPCODE(IsZero64, IR_TYPE_U1, IR_TYPE_U64 ) +OPCODE(TestBit, IR_TYPE_U1, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(ConsitionalSelect32, IR_TYPE_U32, IR_TYPE_CONDITION, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(ConditionalSelect64, IR_TYPE_U64, IR_TYPE_CONDITION, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(ConditionalSelectNZCV, IR_TYPE_NZCV, IR_TYPE_CONDITION, IR_TYPE_NZCV,IR_TYPE_NZCV ) +OPCODE(LogicalShiftLeft32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(LogicalShiftLeft64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(LogicalShiftRight32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(LogicalShiftRight64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(ArithmeticShiftRight32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(ArithmeticShiftRight64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(RotateRight32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(RotateRight64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(RotateRightExtended, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U1 ) +OPCODE(LogicalShiftLeftMasked32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(LogicalShiftLeftMasked64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(LogicalShiftRightMasked32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(LogicalShiftRightMasked64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(ArithmeticShiftRightMasked32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(ArithmeticShiftRightMasked64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(RotateRightMasked32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(RotateRightMasked64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(Add32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U1 ) +OPCODE(Add64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U1 ) +OPCODE(Sub32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U1 ) +OPCODE(Sub64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U1 ) +OPCODE(Mul32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(Mul64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(SignedMultiplyHigh64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(UnsignedMultiplyHigh64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(UnsignedDiv32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(UnsignedDiv64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(SignedDiv32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedDiv64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(And32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(And64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(AndNot32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(AndNot64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(Eor32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(Eor64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(Or32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(Or64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(Not32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(Not64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(SignExtendByteToWord, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(SignExtendHalfToWord, IR_TYPE_U32, IR_TYPE_U16 ) +OPCODE(SignExtendByteToLong, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(SignExtendHalfToLong, IR_TYPE_U64, IR_TYPE_U16 ) +OPCODE(SignExtendWordToLong, IR_TYPE_U64, IR_TYPE_U32 ) +OPCODE(ZeroExtendByteToWord, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(ZeroExtendHalfToWord, IR_TYPE_U32, IR_TYPE_U16 ) +OPCODE(ZeroExtendByteToLong, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(ZeroExtendHalfToLong, IR_TYPE_U64, IR_TYPE_U16 ) +OPCODE(ZeroExtendWordToLong, IR_TYPE_U64, IR_TYPE_U32 ) +OPCODE(ZeroExtendLongToQuad, IR_TYPE_U128, IR_TYPE_U64 ) +OPCODE(ByteReverseWord, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(ByteReverseHalf, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(ByteReverseDual, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(CountLeadingZeros32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CountLeadingZeros64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(ExtractRegister32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(ExtractRegister64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(ReplicateBit32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(ReplicateBit64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(MaxSigned32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(MaxSigned64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(MaxUnsigned32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(MaxUnsigned64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(MinSigned32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(MinSigned64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(MinUnsigned32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(MinUnsigned64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) + +// Saturated instructions +OPCODE(SignedSaturatedAddWithFlag32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedSaturatedSubWithFlag32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedSaturation, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(UnsignedSaturation, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(SignedSaturatedAdd8, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(SignedSaturatedAdd16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(SignedSaturatedAdd32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedSaturatedAdd64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(SignedSaturatedDoublingMultiplyReturnHigh16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(SignedSaturatedDoublingMultiplyReturnHigh32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedSaturatedSub8, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(SignedSaturatedSub16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(SignedSaturatedSub32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(SignedSaturatedSub64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(UnsignedSaturatedAdd8, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(UnsignedSaturatedAdd16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(UnsignedSaturatedAdd32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(UnsignedSaturatedAdd64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(UnsignedSaturatedSub8, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(UnsignedSaturatedSub16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(UnsignedSaturatedSub32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(UnsignedSaturatedSub64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) + +// Vector saturated instructions +OPCODE(VectorSignedSaturatedAdd8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedSub8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedSub16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedSub32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedSub64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAdd8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedSub8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedSub16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedSub32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedSub64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) + +// Packed instructions +OPCODE(PackedAddIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAddS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAddIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAddS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAddSubIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAddSubS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubAddIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSubAddS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddSubIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingAddSubS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubAddIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedHalvingSubAddS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedAddIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedAddS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedSubIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedSubS8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedAddIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedAddS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedSubIR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSaturatedSubS16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedAbsDiffSumIR_TYPE_U8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(PackedSelect, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) + +// CRC instructions +OPCODE(CRC32Castagnoli8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32Castagnoli16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32Castagnoli32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32Castagnoli64, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U64 ) +OPCODE(CRC32ISO8, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32ISO16, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32ISO32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(CRC32ISO64, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U64 ) + +// AES instructions +OPCODE(AESDecryptSingleRound, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(AESEncryptSingleRound, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(AESInverseMixColumns, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(AESMixColumns, IR_TYPE_U128, IR_TYPE_U128 ) + +// SM4 instructions +OPCODE(SM4AccessSubstitutionBox, IR_TYPE_U8, IR_TYPE_U8 ) + +// SHA instructions +OPCODE(SHA256Hash, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(SHA256MessageSchedule0, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(SHA256MessageSchedule1, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) + +#if 0 +// Vector instructions +OPCODE(VectorGetElement8, IR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorGetElement16, IR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorGetElement32, IR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorGetElement64, IR_TYPE_U64, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorSetElement8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(VectorSetElement16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U16 ) +OPCODE(VectorSetElement32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U32 ) +OPCODE(VectorSetElement64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U64 ) +OPCODE(VectorAbs8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAbs16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAbs32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAbs64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAdd8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAnd, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorAndNot, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorArithmeticShiftRight8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorArithmeticShiftRight16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorArithmeticShiftRight32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorArithmeticShiftRight64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorArithmeticVShift8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorArithmeticVShift16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorArithmeticVShift32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorArithmeticVShift64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorBroadcastLower8, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastLower16, IR_TYPE_U128, IR_TYPE_U16 ) +OPCODE(VectorBroadcastLower32, IR_TYPE_U128, IR_TYPE_U32 ) +OPCODE(VectorBroadcast8, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcast16, IR_TYPE_U128, IR_TYPE_U16 ) +OPCODE(VectorBroadcast32, IR_TYPE_U128, IR_TYPE_U32 ) +OPCODE(VectorBroadcast64, IR_TYPE_U128, IR_TYPE_U64 ) +OPCODE(VectorBroadcastElementLower8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElementLower16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElementLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElement8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElement16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElement32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorBroadcastElement64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorCountLeadingZeros8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorCountLeadingZeros16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorCountLeadingZeros32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEven8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEven16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEven32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEven64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEvenLower8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEvenLower16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveEvenLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOdd8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOddLower8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOddLower16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorDeinterleaveOddLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEor, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEqual8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEqual16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEqual32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEqual64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorEqual128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorExtract, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorExtractLower, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorGreaterS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorGreaterS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorGreaterS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorGreaterS64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingAddIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorHalvingSubIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveLower8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveLower16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveLower64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveUpper8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveUpper16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveUpper32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorInterleaveUpper64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorLogicalShiftLeft8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftLeft16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftLeft32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftLeft64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftRight8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftRight16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftRight32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalShiftRight64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorLogicalVShift8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorLogicalVShift16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorLogicalVShift32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorLogicalVShift64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxS64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMaxIR_TYPE_U64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinS64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMinIR_TYPE_U64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiply8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiply16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiply32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiply64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplySignedWiden8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplySignedWiden16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplySignedWiden32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplyUnsignedWiden8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplyUnsignedWiden16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorMultiplyUnsignedWiden32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorNarrow16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorNarrow32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorNarrow64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorNot, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorOr, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddLower8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddLower16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddSignedWiden8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddSignedWiden16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddSignedWiden32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddUnsignedWiden8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddUnsignedWiden16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAddUnsignedWiden32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAdd8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMaxLowerIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPairedMinLowerIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPolynomialMultiply8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPolynomialMultiplyLong8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPolynomialMultiplyLong64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorPopulationCount, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseBits, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInHalfGroups8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInWordGroups8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInWordGroups16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInLongGroups8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInLongGroups16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReverseElementsInLongGroups32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReduceAdd8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReduceAdd16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReduceAdd32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorReduceAdd64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRotateWholeVectorRight, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorRoundingHalvingAddS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingHalvingAddS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingHalvingAddS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingHalvingAddIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingHalvingAddIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingHalvingAddIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftS8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftS16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftS32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftS64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftIR_TYPE_U8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftIR_TYPE_U16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftIR_TYPE_U32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorRoundingShiftLeftIR_TYPE_U64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignExtend8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignExtend16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignExtend32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignExtend64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedAbsoluteDifference8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedAbsoluteDifference16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedAbsoluteDifference32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedMultiply16, IR_TYPE_VOID, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedMultiply32, IR_TYPE_VOID, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAbs8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAbs16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAbs32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAbs64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAccumulateUnsigned8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAccumulateUnsigned16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAccumulateUnsigned32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedAccumulateUnsigned64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyHigh16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyHigh32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyHighRounding16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyHighRounding32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyLong16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedDoublingMultiplyLong32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToSigned16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToSigned32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToSigned64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToUnsigned16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToUnsigned32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNarrowToUnsigned64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNeg8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNeg16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNeg32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedNeg64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedShiftLeft8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedShiftLeft16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedShiftLeft32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedShiftLeft64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSignedSaturatedShiftLeftUnsigned8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorSignedSaturatedShiftLeftUnsigned16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorSignedSaturatedShiftLeftUnsigned32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorSignedSaturatedShiftLeftUnsigned64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8 ) +OPCODE(VectorSub8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSub16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSub32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorSub64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorTable, Table, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE, IR_TYPE_OPAQUE ) +OPCODE(VectorTableLookup64, IR_TYPE_U64, IR_TYPE_U64, Table, IR_TYPE_U64 ) +OPCODE(VectorTableLookup128, IR_TYPE_U128, IR_TYPE_U128, Table, IR_TYPE_U128 ) +OPCODE(VectorTranspose8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(VectorTranspose16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(VectorTranspose32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(VectorTranspose64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(VectorUnsignedAbsoluteDifference8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedAbsoluteDifference16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedAbsoluteDifference32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedMultiply16, IR_TYPE_VOID, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedMultiply32, IR_TYPE_VOID, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedRecipEstimate, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedRecipSqrtEstimate, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAccumulateSigned8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAccumulateSigned16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAccumulateSigned32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedAccumulateSigned64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedNarrow16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedNarrow32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedNarrow64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedShiftLeft8, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedShiftLeft16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedShiftLeft32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorUnsignedSaturatedShiftLeft64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorZeroExtend8, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorZeroExtend16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorZeroExtend32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorZeroExtend64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(VectorZeroUpper, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(ZeroVector, IR_TYPE_U128, ) +#endif + +// Floating-point operations +OPCODE(FPAbs16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPAbs32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPAbs64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPAdd32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPAdd64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPCompare32, IR_TYPE_NZCV, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U1 ) +OPCODE(FPCompare64, IR_TYPE_NZCV, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U1 ) +OPCODE(FPDiv32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPDiv64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMax32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMax64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMaxNumeric32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMaxNumeric64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMin32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMin64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMinNumeric32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMinNumeric64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMul32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMul64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMulAdd16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPMulAdd32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMulAdd64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMulSub16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPMulSub32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMulSub64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPMulX32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPMulX64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPNeg16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPNeg32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPNeg64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPRecipEstimate16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPRecipEstimate32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPRecipEstimate64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPRecipExponent16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPRecipExponent32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPRecipExponent64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPRecipStepFused16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPRecipStepFused32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPRecipStepFused64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPRoundInt16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPRoundInt32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPRoundInt64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPRSqrtEstimate16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPRSqrtEstimate32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPRSqrtEstimate64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPRSqrtStepFused16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16 ) +OPCODE(FPRSqrtStepFused32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPRSqrtStepFused64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPSqrt32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPSqrt64, IR_TYPE_U64, IR_TYPE_U64 ) +OPCODE(FPSub32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32 ) +OPCODE(FPSub64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64 ) + +// Floating-point conversions +OPCODE(FPHalfToDouble, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_U8 ) +OPCODE(FPHalfToSingle, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_U8 ) +OPCODE(FPSingleToDouble, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(FPSingleToHalf, IR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U8 ) +OPCODE(FPDoubleToHalf, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(FPDoubleToSingle, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedS16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedS32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedS64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedIR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedIR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPDoubleToFixedIR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedS16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedS32, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedS64, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedIR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedIR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPHalfToFixedIR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedS16, IR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedS32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedS64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedIR_TYPE_U16, IR_TYPE_U16, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedIR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPSingleToFixedIR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U16ToSingle, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS16ToSingle, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U16ToDouble, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS16ToDouble, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U32ToSingle, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS32ToSingle, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U32ToDouble, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS32ToDouble, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U64ToDouble, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedIR_TYPE_U64ToSingle, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS64ToDouble, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) +OPCODE(FPFixedS64ToSingle, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_U8 ) + +// Floating-point vector instructions +OPCODE(FPVectorAbs16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorAbs32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorAbs64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorDiv32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorDiv64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorEqual16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorEqual32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorEqual64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorFromHalf32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorFromSignedFixed32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorFromSignedFixed64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorFromUnsignedFixed32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorFromUnsignedFixed64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorGreater32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorGreater64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorGreaterEqual32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorGreaterEqual64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMax32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMax64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMaxNumeric32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMaxNumeric64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMin32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMin64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMinNumeric32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMinNumeric64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMul32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMul64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMulAdd16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMulAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMulAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMulX32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorMulX64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorNeg16, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorNeg32, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorNeg64, IR_TYPE_U128, IR_TYPE_U128 ) +OPCODE(FPVectorPairedAdd32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorPairedAdd64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorPairedAddLower32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorPairedAddLower64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipEstimate16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipEstimate32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipEstimate64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipStepFused16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipStepFused32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRecipStepFused64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRoundInt16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U1, IR_TYPE_U1 ) +OPCODE(FPVectorRoundInt32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U1, IR_TYPE_U1 ) +OPCODE(FPVectorRoundInt64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U1, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtEstimate16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtEstimate32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtEstimate64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtStepFused16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtStepFused32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorRSqrtStepFused64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorSqrt32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorSqrt64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorSub32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorSub64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U1 ) +OPCODE(FPVectorToHalf32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToSignedFixed16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToSignedFixed32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToSignedFixed64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToUnsignedFixed16, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToUnsignedFixed32, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) +OPCODE(FPVectorToUnsignedFixed64, IR_TYPE_U128, IR_TYPE_U128, IR_TYPE_U8, IR_TYPE_U8, IR_TYPE_U1 ) + +// A32 Memory access +A32OPC(ClearExclusive, IR_TYPE_VOID, ) +A32OPC(ReadMemory8, IR_TYPE_U8, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ReadMemory16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ReadMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ReadMemory64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveReadMemory8, IR_TYPE_U8, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveReadMemory16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveReadMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveReadMemory64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(WriteMemory8, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_MEMORY_ACCESS ) +A32OPC(WriteMemory16, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_MEMORY_ACCESS ) +A32OPC(WriteMemory32, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(WriteMemory64, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveWriteMemory8, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U8, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveWriteMemory16, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U16, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveWriteMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A32OPC(ExclusiveWriteMemory64, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) + +#if 0 +// A64 Memory access +A64OPC(ClearExclusive, IR_TYPE_VOID, ) +A64OPC(ReadMemory8, IR_TYPE_U8, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ReadMemory16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ReadMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ReadMemory64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ReadMemory128, IR_TYPE_U128, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveReadMemory8, IR_TYPE_U8, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveReadMemory16, IR_TYPE_U16, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveReadMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveReadMemory64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveReadMemory128, IR_TYPE_U128, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(WriteMemory8, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_MEMORY_ACCESS ) +A64OPC(WriteMemory16, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_MEMORY_ACCESS ) +A64OPC(WriteMemory32, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A64OPC(WriteMemory64, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(WriteMemory128, IR_TYPE_VOID, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U128, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveWriteMemory8, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U8, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveWriteMemory16, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U16, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveWriteMemory32, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U32, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveWriteMemory64, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_MEMORY_ACCESS ) +A64OPC(ExclusiveWriteMemory128, IR_TYPE_U32, IR_TYPE_U64, IR_TYPE_U64, IR_TYPE_U128, IR_TYPE_MEMORY_ACCESS ) + +// Coprocessor +A32OPC(CoprocInternalOperation, IR_TYPE_VOID, CoprocInfo ) +A32OPC(CoprocSendOneWord, IR_TYPE_VOID, CoprocInfo, IR_TYPE_U32 ) +A32OPC(CoprocSendTwoWords, IR_TYPE_VOID, CoprocInfo, IR_TYPE_U32, IR_TYPE_U32 ) +A32OPC(CoprocGetOneWord, IR_TYPE_U32, CoprocInfo ) +A32OPC(CoprocGetTwoWords, IR_TYPE_U64, CoprocInfo ) +A32OPC(CoprocLoadWords, IR_TYPE_VOID, CoprocInfo, IR_TYPE_U32 ) +A32OPC(CoprocStoreWords, IR_TYPE_VOID, CoprocInfo, IR_TYPE_U32 ) +#endif +// clang-format on diff --git a/src/jit/ir/type.h b/src/jit/ir/type.h index 427c511..8d02944 100644 --- a/src/jit/ir/type.h +++ b/src/jit/ir/type.h @@ -26,15 +26,17 @@ typedef enum IR_TYPE_U64 = 1 << 4, IR_TYPE_U128 = 1 << 5, IR_TYPE_A32_REGISTER = 1 << 6, // ARM32 GPR R0-R14 + IR_TYPE_A32_EXTENDED_REGISTER = 1 << 7, // ARM32 Extended Registers (e.g., for + IR_TYPE_CONDITION = 1 << 9, // Condition codes + IR_TYPE_MEMORY_ACCESS = 1 << 10, // Memory access type #if 0 - IR_TYPE_A32_EXT_REG = 1 << 7, // ARM32 Extended Registers (e.g., for // VFP/NEON, or just R15 if treated specially) IR_TYPE_A32_CPSR = 1 << 8, // ARM32 CPSR/SPSR - IR_TYPE_COND = 1 << 9, // Condition codes IR_TYPE_ACC_TYPE = 1 << 10, // Memory access type #endif IR_TYPE_OPAQUE = 1 << 11, // Represents a value defined by another IR instruction + IR_TYPE_NZCV = 1 << 12, } type_t; /*! diff --git a/src/main.cpp b/src/main.cpp index 327d9fe..7b4ab79 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,21 +1,12 @@ // Copyright 2025 Pound Emulator Project. All rights reserved. -#include -#include -#include - #define LOG_MODULE "main" #include "common/logging.h" #include "common/passert.h" -#include "frontend/gui.h" #include "host/memory/arena.h" #include "jit/decoder/arm32.h" - -#include -#include "frontend/color.h" -#include "frontend/panels.h" -#include "imgui_impl_opengl3.h" -#include "imgui_impl_sdl3.h" +#include "jit/ir/opcode.h" +#include "jit/a32_types.h" int main() { @@ -26,6 +17,7 @@ int main() pound::jit::decoder::arm32_decode(&decoder, 0xE2800001); /* Sub r0, r0, #1 */ pound::jit::decoder::arm32_decode(&decoder, 0xE2400001); + pound::jit::ir::opcode_init(); #if 0 gui::window_t window = {.data = nullptr, .gl_context = nullptr};