Files
FEX-Emu--FEX/External/FEXCore/Source/Interface/IR/IR.json
T
2021-05-02 12:18:35 -07:00

3680 lines
86 KiB
JSON

{
"Defines": [
"constexpr static uint8_t COND_EQ = 0",
"constexpr static uint8_t COND_NEQ = 1",
"constexpr static uint8_t COND_UGE = 2",
"constexpr static uint8_t COND_ULT = 3",
"constexpr static uint8_t COND_MI = 4",
"constexpr static uint8_t COND_PL = 5",
"constexpr static uint8_t COND_VS = 6",
"constexpr static uint8_t COND_VC = 7",
"constexpr static uint8_t COND_UGT = 8",
"constexpr static uint8_t COND_ULE = 9",
"constexpr static uint8_t COND_SGE = 10",
"constexpr static uint8_t COND_SLT = 11",
"constexpr static uint8_t COND_SGT = 12",
"constexpr static uint8_t COND_SLE = 13",
"constexpr static uint8_t COND_FLU = 16 /* float less or unordred */",
"constexpr static uint8_t COND_FGE = 17 /* float greater or equal */",
"constexpr static uint8_t COND_FLEU = 18 /* float less or equal or unordred */",
"constexpr static uint8_t COND_FGT = 19 /* float greater */",
"constexpr static uint8_t COND_FU = 20 /* float unordred */",
"constexpr static uint8_t COND_FNU = 21 /* float not unordred */",
"static constexpr FEXCore::IR::RegisterClassType GPRClass {0}",
"static constexpr FEXCore::IR::RegisterClassType GPRFixedClass {1}",
"static constexpr FEXCore::IR::RegisterClassType FPRClass {2}",
"static constexpr FEXCore::IR::RegisterClassType FPRFixedClass {3}",
"static constexpr FEXCore::IR::RegisterClassType GPRPairClass {4}",
"static constexpr FEXCore::IR::RegisterClassType ComplexClass {5}",
"static constexpr FEXCore::IR::RegisterClassType InvalidClass {7}",
"",
"static constexpr uint8_t InvalidReg {31}",
"",
"static const FEXCore::IR::TypeDefinition i8 {TypeDefinition::Create(1, 0)}",
"static const FEXCore::IR::TypeDefinition i16 {TypeDefinition::Create(2, 0)}",
"static const FEXCore::IR::TypeDefinition i32 {TypeDefinition::Create(4, 0)}",
"static const FEXCore::IR::TypeDefinition i64 {TypeDefinition::Create(8, 0)}",
"static const FEXCore::IR::TypeDefinition i128 {TypeDefinition::Create(16, 0)}",
"",
"static const FEXCore::IR::TypeDefinition i8v8 {TypeDefinition::Create(1, 8)}",
"static const FEXCore::IR::TypeDefinition i8v16 {TypeDefinition::Create(1, 16)}",
"static const FEXCore::IR::TypeDefinition i16v4 {TypeDefinition::Create(2, 4)}",
"static const FEXCore::IR::TypeDefinition i16v8 {TypeDefinition::Create(2, 8)}",
"static const FEXCore::IR::TypeDefinition i32v2 {TypeDefinition::Create(4, 2)}",
"static const FEXCore::IR::TypeDefinition i32v4 {TypeDefinition::Create(4, 4)}",
"static const FEXCore::IR::TypeDefinition i64v2 {TypeDefinition::Create(8, 2)}",
"",
"constexpr static uint8_t FCMP_FLAG_EQ = 0",
"constexpr static uint8_t FCMP_FLAG_LT = 1",
"constexpr static uint8_t FCMP_FLAG_UNORDERED = 2",
"static constexpr FEXCore::IR::FenceType Fence_Load {0}",
"static constexpr FEXCore::IR::FenceType Fence_Store {1}",
"static constexpr FEXCore::IR::FenceType Fence_LoadStore {2}",
"constexpr static uint8_t ROUND_MODE_NEAREST = 0",
"constexpr static uint8_t ROUND_MODE_NEGATIVE_INFINITY = 1",
"constexpr static uint8_t ROUND_MODE_POSITIVE_INFINITY = 2",
"constexpr static uint8_t ROUND_MODE_TOWARDS_ZERO = 3",
"constexpr static uint8_t ROUND_MODE_FLUSH_TO_ZERO = 1 << 2",
"constexpr static FEXCore::IR::MemOffsetType MEM_OFFSET_SXTX {0};",
"constexpr static FEXCore::IR::MemOffsetType MEM_OFFSET_UXTW {1};",
"constexpr static FEXCore::IR::MemOffsetType MEM_OFFSET_SXTW {2};"
],
"Ops": {
"Dummy": {
"HasSideEffects": true,
"OpClass": "Misc",
"SwitchGen": false
},
"IRHeader": {
"OpClass": "Misc",
"SwitchGen": false,
"SSAArgs": "1",
"SSANames": [
"Blocks"
],
"Args": [
"uint32_t", "BlockCount"
]
},
"CodeBlock": {
"OpClass": "Misc",
"SwitchGen": false,
"SSAArgs": "2",
"RAOverride": "0",
"SSANames": [
"Begin",
"Last"
]
},
"BeginBlock": {
"HasSideEffects": true,
"OpClass": "Misc",
"SwitchGen": false,
"SSAArgs": "1",
"RAOverride": "0",
"SSANames": [
"BlockHeader"
]
},
"InvalidateFlags": {
"OpClass": "Misc",
"HasSideEffects": true,
"Args": [
"uint64_t", "Flags"
]
},
"EndBlock": {
"HasSideEffects": true,
"OpClass": "Misc",
"SwitchGen": false,
"SSAArgs": "1",
"RAOverride": "0",
"SSANames": [
"BlockHeader"
]
},
"ValidateCode": {
"HasSideEffects": true,
"OpClass": "Misc",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "8",
"Args": [
"uint64_t", "CodeOriginalLow",
"uint64_t", "CodeOriginalHigh",
"int64_t", "Offset",
"uint8_t", "CodeLength"
]
},
"RemoveCodeEntry": {
"HasSideEffects": true,
"OpClass": "Misc"
},
"GuestCallDirect": {
"OpClass": "Branch",
"Args": [
"uint64_t", "RIP",
"uint64_t", "NextRIP"
]
},
"GuestCallIndirect": {
"OpClass": "Branch",
"SSAArgs": "1",
"SSANames": [
"RIP"
],
"Args": [
"uint64_t", "NextRIP"
]
},
"GuestReturn": {
"OpClass": "Branch"
},
"Fence": {
"Desc": ["Does a memory fence operation of the desired type",
"Fence_Load: Ensures load memory operations are serialized",
"Fence_Store: Ensures store memory operations are serialized",
"Fence_LoadStore: Ensures loads and store memory operations are serialized",
"Ensures the memory operations are globally visible"
],
"HasSideEffects": true,
"OpClass": "Misc",
"Args":[
"FEXCore::IR::FenceType", "Fence"
]
},
"SignalReturn": {
"HasSideEffects": true,
"OpClass": "Branch"
},
"CallbackReturn": {
"HasSideEffects": true,
"OpClass": "Branch"
},
"CASPair": {
"HasSideEffects": true,
"OpClass": "Atomic",
"Desc": ["Does a compare and exchange with two GPRPair values",
"ssa0 is the comparison value",
"ssa1 is the new value",
"ssa2 is the memory location",
"Returns a pair containing the value in memory"
],
"HasDest": true,
"DestClass": "GPRPair",
"DestSize": "GetOpSize(ssa0)",
"NumElements": "2",
"SSAArgs": "3",
"SSANames": [
"Expected",
"Desired",
"Addr"
]
},
"ExtractElementPair": {
"OpClass": "Moves",
"Desc": ["Extracts a register for the register pair"],
"SSAArgs": "1",
"SSANames": [
"Pair"
],
"HasDest": true,
"DestClass": "GPR",
"DestSize": "GetOpSize(ssa0)",
"Args": [
"uint8_t", "Element"
]
},
"CreateElementPair": {
"OpClass": "Moves",
"Desc": ["Inserts a register for the register pair",
"ssa0 is the lower incoming register",
"ssa1 is the upper incoming register"
],
"HasDest": true,
"DestClass": "GPRPair",
"DestSize": "GetOpSize(ssa0)",
"NumElements": "2",
"SSAArgs": "2",
"SSANames": [
"Lower",
"Upper"
]
},
"TruncElementPair": {
"OpClass": "ALU",
"Desc": "Truncates each element of a pair to the destination size",
"HasDest": true,
"DestClass": "GPRPair",
"DestSize": "Size",
"NumElements": "2",
"SSAArgs": "1",
"SSANames": [
"Pair"
],
"Args": [
"uint8_t", "Size"
]
},
"GetRoundingMode": {
"Desc": ["Gets the current rounding mode options"
],
"OpClass": "Misc",
"HasDest": true,
"DestClass": "GPR",
"FixedDestSize": "4"
},
"SetRoundingMode": {
"Desc": ["Sets the current rounding mode options for the thread"
],
"HasSideEffects": true,
"OpClass": "Misc",
"HasDest": false,
"DestClass": "GPR",
"SSAArgs": "1",
"SSANames": [
"RoundMode"
]
},
"EntrypointOffset": {
"Desc": ["Returns the <entrypoint> + Offset address"],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "RegisterSize",
"Args": [
"int64_t", "Offset"
],
"HelperArgs": [
"uint8_t", "RegisterSize"
]
},
"InlineEntrypointOffset": {
"Desc": ["Returns the <entrypoint> + Offset address"],
"OpClass": "ALU",
"DestSize": "RegisterSize",
"Args": [
"int64_t", "Offset"
],
"HelperArgs": [
"uint8_t", "RegisterSize"
]
},
"Constant": {
"Desc": ["Generates a 64bit constant inside of a GPR",
"Unsupported to create a constant in FPR"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"FixedDestSize": "8",
"Args": [
"uint64_t", "Constant"
]
},
"InlineConstant": {
"Desc": ["Generates a 64bit constant to be used directly, non-FPR"],
"OpClass": "ALU",
"Args": [
"uint64_t", "Constant"
]
},
"VectorZero": {
"Desc": ["Generates a vector zero",
"Useful to generate a zero vector without any previous dependencies"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"HelperArgs": [
"uint8_t", "RegisterSize"
]
},
"VectorImm": {
"Desc": ["Generates a vector with each element containg the immediate zexted"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Immediate"
]
},
"Break": {
"HasSideEffects": true,
"OpClass": "Misc",
"Args": [
"uint8_t", "Reason",
"uint8_t", "Literal"
]
},
"ExitFunction": {
"HasSideEffects": true,
"OpClass": "Branch",
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "1",
"SSANames": [
"NewRIP"
]
},
"Jump": {
"HasSideEffects": true,
"OpClass": "Branch",
"SSAArgs": "1",
"SSANames": [
"Target"
],
"RAOverride": "0"
},
"CondJump": {
"HasSideEffects": true,
"OpClass": "Branch",
"SSAArgs": "4",
"RAOverride": "2",
"SSANames": [
"Cmp1",
"Cmp2",
"TrueBlock",
"FalseBlock"
],
"Args": [
"CondClassType", "Cond",
"uint8_t", "CompareSize"
]
},
"Phi": {
"OpClass": "Misc",
"HasDest": true,
"DestClass": "Complex",
"DestSize": "~0",
"ArgPrinter": false,
"SSAArgs": "2",
"RAOverride": 0,
"SSANames": [
"PhiBegin",
"PhiEnd"
],
"Args": [
"uint8_t", "Class"
]
},
"PhiValue": {
"OpClass": "Misc",
"HasDest": false,
"DestClass": "Complex",
"SSAArgs": "3",
"RAOverride": 0,
"DestSize": "GetOpSize(ssa0)",
"SSANames": [
"Value",
"Block",
"Next"
]
},
"Mov": {
"OpClass": "Moves",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "1",
"SSANames": [
"Value"
]
},
"CycleCounter": {
"Desc": ["Returns the host 64bit cycle counter",
"Useful when emulating rdtsc",
"Be careful, the frequency of this counter changes based on host",
"On AArch64 make sure to query the CNTFRQ_EL0 system register to get the frequency",
"On x86-64 make sure to query CPUID fn8000_0008[EDX_8] for constant TSC",
"x86-64 constant frequency lives in MSR_PLATFORM_INFO. Which is only available to kernel",
"Part of the ART frequency equation can be pulled from CPUID fn0000_0015[EBX & EAX]",
"But it's missing the ART multiplier still?"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"FixedDestSize": "8"
},
"LoadRegister": {
"Desc": ["Loads a value from the static-ra context with offset",
"Dest = Ctx[Offset]"
],
"OpClass": "StaticRA",
"HasDest": true,
"DestClass": "Complex",
"DestSize": "Size",
"HelperArgs": [
"uint8_t", "Size"
],
"Args": [
"bool", "IsAlias",
"uint32_t", "Offset",
"RegisterClassType", "Class",
"RegisterClassType", "StaticClass"
]
},
"StoreRegister": {
"HasSideEffects": true,
"Desc": ["Stores a value to the static-ra context with offset",
"Ctx[Offset] = Value",
"Zero Extends if value's type is too small",
"Truncates if value's type is too large"
],
"OpClass": "StaticRA",
"SSAArgs": "1",
"SSANames": [
"Value"
],
"DestSize": "Size",
"HelperArgs": [
"uint8_t", "Size"
],
"Args": [
"bool", "IsPrewrite",
"uint32_t", "Offset",
"RegisterClassType", "Class",
"RegisterClassType", "StaticClass"
]
},
"LoadContext": {
"Desc": ["Loads a value from the context with offset",
"Dest = Ctx[Offset]"
],
"OpClass": "Memory",
"HasDest": true,
"DestClass": "Complex",
"DestSize": "Size",
"HelperArgs": [
"uint8_t", "Size"
],
"Args": [
"uint32_t", "Offset",
"RegisterClassType", "Class"
]
},
"StoreContext": {
"HasSideEffects": true,
"Desc": ["Stores a value to the context with offset",
"Ctx[Offset] = Value",
"Zero Extends if value's type is too small",
"Truncates if value's type is too large"
],
"OpClass": "Memory",
"SSAArgs": "1",
"SSANames": [
"Value"
],
"DestSize": "Size",
"HelperArgs": [
"uint8_t", "Size"
],
"Args": [
"uint32_t", "Offset",
"RegisterClassType", "Class"
]
},
"LoadContextIndexed": {
"Desc": ["Loads a value from the context with offset and indexed by SSA value",
"Dest = Ctx[BaseOffset + Index * Stride]"
],
"OpClass": "Memory",
"SSAArgs": "1",
"SSANames": [
"Index"
],
"HasDest": true,
"DestClass": "Complex",
"DestSize": "Size",
"Args": [
"uint8_t", "Size",
"uint32_t", "BaseOffset",
"uint32_t", "Stride",
"RegisterClassType", "Class"
]
},
"StoreContextIndexed": {
"HasSideEffects": true,
"Desc": ["Stores a value to the context with offset and indexed by SSA value",
"Ctx[BaseOffset + Index * Stride] = Value"
],
"OpClass": "Memory",
"SSAArgs": "2",
"SSANames": [
"Value",
"Index"
],
"Args": [
"uint8_t", "Size",
"uint32_t", "BaseOffset",
"uint32_t", "Stride",
"RegisterClassType", "Class"
]
},
"SpillRegister": {
"HasSideEffects": true,
"Desc": ["Spills an SSA value to memory",
"Spill slots are register allocated and has live ranges calculated to handle slot calculation",
"```diff\n- !Don't use this op. It is for RA to handle spilling and filling!\n```"
],
"OpClass": "Memory",
"SSAArgs": "1",
"SSANames": [
"Value"
],
"Args": [
"uint32_t", "Slot",
"RegisterClassType", "Class"
]
},
"FillRegister": {
"Desc": ["Fills a register from a spill slot",
"Spill slots are register allocated and has live ranges calculated to handle slot calculation",
"```diff\n- !Don't use this op. It is for RA to handle spilling and filling!\n```"
],
"OpClass": "Memory",
"HasDest": true,
"DestClass": "Complex",
"Args": [
"uint32_t", "Slot",
"RegisterClassType", "Class"
]
},
"LoadFlag": {
"Desc": ["Loads an x86-64 flag from the context object",
"Specialized to allow flexible implementation of flag handling"
],
"OpClass": "Memory",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "1",
"Args": [
"uint32_t", "Flag"
]
},
"StoreFlag": {
"HasSideEffects": true,
"Desc": ["Stores 1-bit of the flag in to the specified x86-64 flag",
"Specialized to allow flexible implementation of flag handling"
],
"OpClass": "Memory",
"SSAArgs": "1",
"SSANames": [
"Value"
],
"Args": [
"uint32_t", "Flag"
]
},
"Syscall": {
"HasSideEffects": true,
"OpClass": "Branch",
"HasDest": true,
"DestClass": "GPR",
"FixedDestSize": "8",
"SSAArgs": "7",
"SSANames": [
"SyscallID",
"Arg0",
"Arg1",
"Arg2",
"Arg3",
"Arg4",
"Arg5"
]
},
"Thunk": {
"HasSideEffects": true,
"OpClass": "Branch",
"SSAArgs": "1",
"SSANames": [
"ArgPtr"
],
"Args":[
"SHA256Sum", "ThunkNameHash"
]
},
"LoadMem": {
"OpClass": "Memory",
"HasDest": true,
"DestClass": "Complex",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Offset"
],
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class",
"MemOffsetType", "OffsetType",
"uint8_t", "OffsetScale"
]
},
"StoreMem": {
"Desc": [ "Stores a value to memory.",
"Zero Extends if value's type is too small",
"Truncates if value's type is too large"
],
"HasSideEffects": true,
"OpClass": "Memory",
"SSAArgs": "3",
"SSANames": [
"Addr",
"Value",
"Offset"
],
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class",
"MemOffsetType", "OffsetType",
"uint8_t", "OffsetScale"
]
},
"LoadMemTSO": {
"Desc": ["Does a x86 TSO compatible load from memory. Offset must be Invalid()."
],
"OpClass": "Memory",
"HasDest": true,
"DestClass": "Complex",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Offset"
],
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class",
"MemOffsetType", "OffsetType",
"uint8_t", "OffsetScale"
]
},
"StoreMemTSO": {
"Desc": ["Does a x86 TSO compatible store to memory. Offset must be Invalid()."
],
"HasSideEffects": true,
"OpClass": "Memory",
"SSAArgs": "3",
"SSANames": [
"Addr",
"Value",
"Offset"
],
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class",
"MemOffsetType", "OffsetType",
"uint8_t", "OffsetScale"
]
},
"VLoadMemElement": {
"OpClass": "Memory",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Align",
"uint8_t", "Index"
]
},
"VStoreMemElement": {
"HasSideEffects": true,
"OpClass": "Memory",
"SSAArgs": "2",
"DestSize": "ElementSize",
"NumElements": "RegisterSize / ElementSize",
"SSANames": [
"Addr",
"Value"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Index",
"uint8_t", "Align"
]
},
"CacheLineClear": {
"Desc": ["Does a 64 byte cacheline clear at the address specified"
],
"HasSideEffects": true,
"OpClass": "Memory",
"SSAArgs": "1",
"SSANames": [
"Addr"
]
},
"Add": {
"Desc": [ "Integer Add",
"Will truncate to 64 or 32bits"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "std::max<uint8_t>(4, std::max(GetOpSize(ssa0), GetOpSize(ssa1)))",
"SSAArgs": "2"
},
"Sub": {
"Desc": [ "Integer Sub",
"Will truncate to 64 or 32bits"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, std::max(GetOpSize(ssa0), GetOpSize(ssa1)))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Neg": {
"Desc": ["Integer negation",
"Dest = -Src",
"Will truncate to 64 or 32bits"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, GetOpSize(ssa0))",
"DestClass": "GPR",
"SSAArgs": "1"
},
"Mul": {
"Desc": ["Integer signed multiplication"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, std::max(GetOpSize(ssa0), GetOpSize(ssa1)))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"UMul": {
"Desc": ["Integer unsigned multiplication"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, std::max(GetOpSize(ssa0), GetOpSize(ssa1)))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Div": {
"Desc": ["Integer signed division"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"UDiv": {
"Desc": ["Integer unsigned division"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"Rem": {
"Desc": ["Integer signed remainder"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"URem": {
"Desc": ["Integer unsigned remainder"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"MulH": {
"Desc": ["Integer signed multiply returning high results",
"op:",
"Tmp <size * 2> = Src1 * Src2;",
"Dest = Tmp >> (size * 8);"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"UMulH": {
"Desc": ["Integer unsigned multiply returning high results",
"op:",
"Tmp <size * 2> = Src1 * Src2;",
"Dest = Tmp >> (size * 8);"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"Or": {
"Desc": ["Integer binary or"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"And": {
"Desc": ["Integer binary and"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"Xor": {
"Desc": ["Integer binary exclusive or"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2"
},
"Lshl": {
"Desc": ["Integer logical shift left"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, GetOpSize(ssa0))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Lshr": {
"Desc": ["Integer logical shift right"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, GetOpSize(ssa0))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Ashr": {
"Desc": ["Integer arithmetic shift right"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, GetOpSize(ssa0))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Ror": {
"Desc": ["Integer rotate right"
],
"OpClass": "ALU",
"HasDest": true,
"DestSize": "std::max<uint8_t>(4, GetOpSize(ssa0))",
"DestClass": "GPR",
"SSAArgs": "2"
},
"Extr": {
"Desc": ["Concats the two GPRs to create a value that is the size of the full two GPRs",
"It then extracts a bitfield width that size of a GPR from the LSB",
"Valid LSB range is 0-31 for 32bit and 0-63 for 64bit",
"<Size * 2> ConcatValue = src0:src1",
"Result = ConcatValue<LSB+Size - 1: LSB>"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "2",
"Args": [
"uint8_t", "LSB"
]
},
"LDiv": {
"Desc": ["Integer long signed division returning lower bits",
"The Lower and Upper registers will be concated together to generate a dividend twice the size",
"Then the divisor divides the temporary dividend and returns the results in the original sized register"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "3",
"SSANames": [
"Lower",
"Upper",
"Divisor"
]
},
"LUDiv": {
"Desc": ["Integer long unsigned division returning lower bits",
"The Lower and Upper registers will be concated together to generate a dividend twice the size",
"Then the divisor divides the temporary dividend and returns the results in the original sized register"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "3",
"SSANames": [
"Lower",
"Upper",
"Divisor"
]
},
"LRem": {
"Desc": ["Integer long signed remainder returning lower bits",
"The Lower and Upper registers will be concated together to generate a dividend twice the size",
"Then the divisor divides the temporary dividend and returns the remainder results in the original sized register"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "3",
"SSANames": [
"Lower",
"Upper",
"Divisor"
]
},
"LURem": {
"Desc": ["Integer long unsigned remainder returning lower bits",
"The Lower and Upper registers will be concated together to generate a dividend twice the size",
"Then the divisor divides the temporary dividend and returns the remainder results in the original sized register"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "3",
"SSANames": [
"Lower",
"Upper",
"Divisor"
]
},
"Not": {
"Desc": ["Integer binary not",
"op:",
"Dest = ~Src"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"Popcount": {
"Desc": ["Population count of source register",
"Returns the number of bits set"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"FindLSB": {
"Desc": ["Find least-significant-bit set",
"Returns the index of the least significant bit set",
"In the case of zero returns ~0U"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"FindMSB": {
"Desc": ["Find most-significant-bit set",
"Returns the index of the most significant bit set",
"In the case of zero returns ~0U"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"FindTrailingZeros": {
"Desc": ["Counts the number of trailing zero bits in a GPR",
"Returns the number of bits that are zero trailing",
"In the case of zero returns the size in bits of the input"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"CountLeadingZeroes": {
"Desc": ["Counts the number of leading zero bits in a GPR",
"Returns the number of bits that are zero leading",
"In the case of zero returns the size in bits of the input"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"Rev": {
"Desc": ["Reverses the byte order of the register",
"Specifically 8bit byte swap size. (Not 16bit or 32bit word swapping)"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1"
},
"CPUID": {
"Desc": ["Calls in to the CPUID handler function to return emulated CPUID",
"Returns a 128bit GPR pair that fits emulated EAX, EBX, EDX, ECX respectively"
],
"OpClass": "Branch",
"HasDest": true,
"DestClass": "GPRPair",
"FixedDestSize": "8",
"NumElements": "2",
"SSAArgs": "2",
"SSANames": [
"Function",
"Leaf"
]
},
"Bfi": {
"Desc": ["Copies a bitfield from one GPR to another",
"The source bitfield is from Src[Width:0]",
"The bitfield is copied in to Dest[(Width + lsb):lsb]"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "DestSize",
"SSAArgs": "2",
"SSANames": [
"Dest",
"Src"
],
"HelperArgs": [
"uint8_t", "DestSize"
],
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Bfe": {
"Desc": ["Extracts a bitfield from one GPR with zext",
"The source bitfield is from Src[Width:0]",
"The bitfield is then zero extended"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "DestSize != 0 ? DestSize : GetOpSize(ssa0)",
"SSAArgs": "1",
"SSANames": [
"Src"
],
"HelperArgs": [
"uint8_t", "DestSize"
],
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Sbfe": {
"Desc": ["Extracts a bitfield from one GPR with sext",
"The source bitfield is from Src[Width:0]",
"The bitfield is then sign extended"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "8",
"SSAArgs": "1",
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Select": {
"Desc": ["Ternary selection of GPRs",
"op:",
"Dest = Cmp1 <Cond> Cmp2 ? TrueVal : FalseVal"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "std::max<uint8_t>(4, std::max<uint8_t>(GetOpSize(ssa2), GetOpSize(ssa3)))",
"SSAArgs": "4",
"SSANames": [
"Cmp1",
"Cmp2",
"TrueVal",
"FalseVal"
],
"Args": [
"CondClassType", "Cond",
"uint8_t", "CompareSize"
]
},
"CAS": {
"HasSideEffects": true,
"Desc": ["Does a compare and swap of values to a memory location",
"This mostly matches the C++ atomic_compare_exchange_strong function",
"Dest = atomic_compare_exchange_strong(%Addr, %Expected, %Desired)",
"Depending on if the value in %Addr is Expected the results destination will be different",
"Behaves like the following but atomically",
"Dest = %Expected",
"if (deref(%Addr) != %Expected) Dest = deref(%Addr)"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "3",
"SSANames": [
"Expected",
"Desired",
"Addr"
]
},
"AtomicAdd": {
"HasSideEffects": true,
"Desc": ["Atomic integer add"
],
"OpClass": "Atomic",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicSub": {
"HasSideEffects": true,
"Desc": ["Atomic integer sub"
],
"OpClass": "Atomic",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicAnd": {
"HasSideEffects": true,
"Desc": ["Atomic binary and"
],
"OpClass": "Atomic",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicOr": {
"HasSideEffects": true,
"Desc": ["Atomic binary or"
],
"OpClass": "Atomic",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicXor": {
"HasSideEffects": true,
"Desc": ["Atomic binary exclusive or"
],
"OpClass": "Atomic",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicSwap": {
"HasSideEffects": true,
"Desc": ["Atomic swap",
"Atomically swaps contents of GPR and memory location"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchAdd": {
"HasSideEffects": true,
"Desc": ["Atomic integer fetch and add",
"Atomically fetches %Addr and adds %value to the memory location",
"Dest is the value prior to operating on the value in memory"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchSub": {
"HasSideEffects": true,
"Desc": ["Atomic integer fetch and sub",
"Atomically fetches %Addr and subtracts %value to the memory location",
"Dest is the value prior to operating on the value in memory"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchAnd": {
"HasSideEffects": true,
"Desc": ["Atomic integer fetch and binary and",
"Atomically fetches %Addr and binary ands %value to the memory location",
"Dest is the value prior to operating on the value in memory"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchOr": {
"HasSideEffects": true,
"Desc": ["Atomic integer fetch and binary or",
"Atomically fetches %Addr and binary ors %value to the memory location",
"Dest is the value prior to operating on the value in memory"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchXor": {
"HasSideEffects": true,
"Desc": ["Atomic integer fetch and binary exclusive or",
"Atomically fetches %Addr and binary exclusive ors %value to the memory location",
"Dest is the value prior to operating on the value in memory"
],
"OpClass": "Atomic",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"SSAArgs": "2",
"SSANames": [
"Addr",
"Value"
],
"Args": [
"uint8_t", "Size"
]
},
"VExtractToGPR": {
"Desc": ["Extracts an element from a vector and places it in a GPR",
"The element that is extracted from the vector is zero extended to the GPR size"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"DestSize": "ElementSize",
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Idx"
]
},
"Float_ToGPR_U": {
"Desc": ["Moves the scalar element to a GPR with conversion",
"Converts the 32bit or 64bit float to an unsigned integer",
"Rounding mode determined by host flag's rounding mode"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "ElementSize",
"SSAArgs": "1",
"SSANames": [
"Scalar"
],
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_ToGPR_S": {
"Desc": ["Moves the scalar element to a GPR with conversion",
"Converts the 32bit or 64bit float to an signed integer",
"Rounding mode determined by host flag's rounding mode"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "ElementSize",
"SSAArgs": "1",
"SSANames": [
"Scalar"
],
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_ToGPR_ZU": {
"Desc": ["Moves the scalar element to a GPR with conversion",
"Converts the 32bit or 64bit float to an unsigned integer rounding towards zero (Truncating)"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "ElementSize",
"SSAArgs": "1",
"SSANames": [
"Scalar"
],
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_ToGPR_ZS": {
"Desc": ["Moves the scalar element to a GPR with conversion",
"Converts the 32bit or 64bit float to an signed integer rounding towards zero (Truncating)"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "ElementSize",
"SSAArgs": "1",
"SSANames": [
"Scalar"
],
"Args": [
"uint8_t", "ElementSize"
]
},
"FCmp": {
"Desc": ["Does a scalar unordered compare and stores the asked for flags in to a GPR",
"Ordering flag result is true if either float input is NaN"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "4",
"SSAArgs": "2",
"SSANames": [
"Scalar1",
"Scalar2"
],
"Args": [
"uint8_t", "ElementSize",
"uint32_t", "Flags"
]
},
"Print": {
"HasSideEffects": true,
"Desc": ["Debug operation that prints an SSA value to the console",
"May only print 64bits of the value",
"Depending on backend, may only support GPR printing"
],
"OpClass": "Misc",
"SSAArgs": "1",
"SSANames": [
"Value"
]
},
"CreateVector2": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "GetOpSize(ssa0) * 2",
"SSAArgs": "2",
"SSANames": [
"Lower",
"Upper"
]
},
"CreateVector4": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "GetOpSize(ssa0) * 4",
"SSAArgs": "4",
"SSANames": [
"Lowest",
"Lower",
"Upper",
"Uppest"
]
},
"SplatVector2": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"NumElements": "2",
"DestSize": "GetOpSize(ssa0) * 2",
"SSAArgs": "1",
"SSANames": [
"Scalar"
]
},
"SplatVector4": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"NumElements": "4",
"DestSize": "GetOpSize(ssa0) * 4",
"SSAArgs": "1",
"SSANames": [
"Scalar"
]
},
"VMov": {
"Desc" : ["Copy vector register",
"When Register size is smaller than Source register size,",
"this op is defined to truncate and zero extend"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"SSAArgs": "1",
"SSANames": [
"Source"
],
"HelperArgs": [
"uint8_t", "RegisterSize"
]
},
"VAnd": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VOr": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VXor": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VAdd": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSub": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUQAdd": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUQSub": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQAdd": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQSub": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VAddP": {
"OpClass": "Vector",
"Desc": "Does a horizontal pairwise add of elements across the two source vectors",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VAddV": {
"OpClass": "Vector",
"Desc": ["Does a horizontal vector add of elements across the source vector",
"Result is a zero extended scalar"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VURAvg": {
"OpClass": "Vector",
"Desc": ["Does an unsigned rounded average", "dst_elem = (src1_elem + src2_elem + 1) >> 1"],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VAbs": {
"OpClass": "Vector",
"Desc": ["Does an signed integer absolute"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFAdd": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFAddP": {
"OpClass": "Vector",
"Desc": "Does a horizontal pairwise add of elements across the two source vectors with float element types",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFSub": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMul": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFDiv": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMin": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMax": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFRecp": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFSqrt": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFRSqrt": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VNeg": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFNeg": {
"OpClass": "Vector",
"Desc": ["Does a floating point sign negation"],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VNot": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMin": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMin": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMax": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMax": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VZip": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Lower",
"Upper"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VZip2": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Lower",
"Upper"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VBSL": {
"Desc": ["Does a vector bitwise select.",
"If the bit in the field is 1 then the corresponding bit is pulled from VectorTrue",
"If the bit in the field is 0 then the corresponding bit is pulled from VectorFalse"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "3",
"SSANames": [
"VectorMask",
"VectorTrue",
"VectorFalse"
]
},
"VCMPEQ": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPEQZ": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector1"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPGT": {
"Desc": ["Vector compare signed greater than",
"Each element is compared, if the result is true then the resulting element is ~0, else zero"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPGTZ": {
"Desc": ["Vector compare signed greater than",
"Each element is compared, if the result is true then the resulting element is ~0, else zero",
"Compares the vector against zero"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector1"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPLTZ": {
"Desc": ["Vector compare signed less than",
"Each element is compared, if the result is true then the resulting element is ~0, else zero",
"Compares the vector against zero"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector1"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPEQ": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPNEQ": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPLT": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPGT": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPLE": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPORD": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPUNO": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShl": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"ShiftVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShr": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"ShiftVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSShr": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"ShiftVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShlS": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"ShiftScalar"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShrS": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"ShiftScalar"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSShrS": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"ShiftScalar"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VInsElement": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"DestVector",
"SrcVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "DestIdx",
"uint8_t", "SrcIdx"
]
},
"VInsScalarElement": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector",
"Scalar"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "DestIdx"
]
},
"VExtractElement": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Index"
]
},
"VExtr": {
"Desc": ["Concats two vector registers together and extracts a full width register from the element index",
"Index is an element index. So it is offset by ElementSize argument",
"op:",
"TmpVector <RegisterSize *2> = concat(Upper:Lower)",
"Dest = TmpVector >> (ElementSize * Index * 8); // Or can be thought of `concat(&TmpVector[Index], i128)`"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Upper",
"Lower"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Index"
]
},
"VInsGPR": {
"OpClass": "Conv",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"DestVector",
"GPR"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "Index"
]
},
"VSLI": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "ByteShift"
]
},
"VSRI": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "ByteShift"
]
},
"VUShrI": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "BitShift"
]
},
"VSShrI": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "BitShift"
]
},
"VShlI": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "BitShift"
]
},
"VUShrNI": {
"OpClass": "Vector",
"Desc": "Unsigned shifts right each element and then narrows to the next lower element size",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "BitShift"
]
},
"VUShrNI2": {
"OpClass": "Vector",
"Desc": ["Unsigned shifts right each element and then narrows to the next lower element size",
"Inserts results in to the high elements of the first argument"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "2",
"SSANames": [
"LowerVector",
"UpperVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
],
"Args": [
"uint8_t", "BitShift"
]
},
"VBitcast": {
"Dest": ["Workaround for issue with LLVM breaking when loading scalar elements to vectors"],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"SSAArgs": "1",
"SSANames": [
"Vector"
]
},
"VSXTL": {
"OpClass": "Vector",
"Desc": "Sign extends elements from the source element size to the next size up",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSXTL2": {
"OpClass": "Vector",
"Desc": ["Sign extends elements from the source element size to the next size up",
"Source elements come from the upper 64bits of the register"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUXTL": {
"OpClass": "Vector",
"Desc": "Zero extends elements from the source element size to the next size up",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUXTL2": {
"OpClass": "Vector",
"Desc": ["Zero extends elements from the source element size to the next size up",
"Source elements come from the upper 64bits of the register"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCastFromGPR": {
"Desc": ["Moves a GPR to a Vector register with zero extension to full length of the register.",
"No conversion is done on the data as it moves register files"
],
"OpClass": "Conv",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"GPR"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTN": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTN2": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "2",
"SSANames": [
"LowerVector",
"UpperVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTUN": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTUN2": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize >> 1)",
"SSAArgs": "2",
"SSANames": [
"LowerVector",
"UpperVector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Float_FromGPR_U": {
"OpClass": "Conv",
"Desc": ["Scalar op: Converts unsigned GPR to Scalar float",
"Zeroes the upper bits of the vector register"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "DstElementSize",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"GPR"
],
"HelperArgs": [
"uint8_t", "DstElementSize"
],
"Args": [
"uint8_t", "SrcElementSize"
]
},
"Float_FromGPR_S": {
"OpClass": "Conv",
"Desc": ["Scalar op: Converts signed GPR to Scalar float",
"Zeroes the upper bits of the vector register"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "DstElementSize",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"GPR"
],
"HelperArgs": [
"uint8_t", "DstElementSize"
],
"Args": [
"uint8_t", "SrcElementSize"
]
},
"Float_FToF": {
"OpClass": "Conv",
"Desc": ["Scalar op: Converts float from one size to another",
"Zeroes the upper bits of the vector register"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "DstElementSize",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"Scalar"
],
"HelperArgs": [
"uint8_t", "DstElementSize"
],
"Args": [
"uint8_t", "SrcElementSize"
]
},
"Vector_UToF": {
"OpClass": "Conv",
"Desc": "Vector op: Converts unsigned integer to same size float",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_SToF": {
"OpClass": "Conv",
"Desc": "Vector op: Converts signed integer to same size float",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToU": {
"OpClass": "Conv",
"Desc": ["Vector op: Converts float to unsigned integer",
"Rounding mode determined by host rounding mode"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToS": {
"OpClass": "Conv",
"Desc": ["Vector op: Converts float to signed integer, rounding towards zero",
"Rounding mode determined by host rounding mode"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToZU": {
"OpClass": "Conv",
"Desc": "Vector op: Converts float to unsigned integer, rounding towards zero",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToZS": {
"OpClass": "Conv",
"Desc": "Vector op: Converts float to signed integer, rounding towards zero",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToF": {
"OpClass": "Conv",
"Desc": "Vector op: Converts float from source element size to destination size (fp32<->fp64)",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / DstElementSize",
"SSAArgs": "1",
"SSANames": [
"Vector"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "DstElementSize"
],
"Args": [
"uint8_t", "SrcElementSize"
]
},
"VUMul": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMul": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / ElementSize",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMull": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMull": {
"OpClass": "Vector",
"Desc": [ "Does a signed integer multiply with extend.",
"ElementSize is the source size"
],
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMull2": {
"OpClass": "Vector",
"Dest": "Multiplies the high elements with size extension",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMull2": {
"OpClass": "Vector",
"Dest": "Multiplies the high elements with size extension",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"NumElements": "RegisterSize / (ElementSize << 1)",
"SSAArgs": "2",
"SSANames": [
"Vector1",
"Vector2"
],
"HelperArgs": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VTBL1": {
"Desc": ["Does a vector table lookup from one register in to the destination",
"Lookup is byte sized per byte element.",
"Any index larger than what the registers provide will result in zero for that element",
"Table is always treated as a 128bit register",
"Indices matches destination size. Either 64bit or 128bit"
],
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "RegisterSize",
"SSAArgs": "2",
"SSANames": [
"Table",
"Indices"
],
"HelperArgs": [
"uint8_t", "RegisterSize"
]
},
"VAESImc": {
"OpClass": "Vector",
"Dest": "Does a stage of the inverse mix column transformation",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "1",
"SSANames": [
"Src"
]
},
"VAESEnc": {
"OpClass": "Vector",
"Dest": "Does a step of AES encryption",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "2",
"SSANames": [
"State",
"Key"
]
},
"VAESEncLast": {
"OpClass": "Vector",
"Dest": "Does the last step of AES encryption",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "2",
"SSANames": [
"State",
"Key"
]
},
"VAESDec": {
"OpClass": "Vector",
"Dest": "Does a step of AES decryption",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "2",
"SSANames": [
"State",
"Key"
]
},
"VAESDecLast": {
"OpClass": "Vector",
"Dest": "Does the last step of AES decryption",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "2",
"SSANames": [
"State",
"Key"
]
},
"VAESKeyGenAssist": {
"OpClass": "Vector",
"Dest": "Assists in key generation",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"SSAArgs": "1",
"SSANames": [
"Src"
],
"Args": [
"uint8_t", "RCON"
]
},
"GetHostFlag": {
"OpClass": "Flags",
"HasDest": true,
"DestClass": "GPR",
"SSAArgs": "1",
"SSANames": [
"GPR"
],
"Args": [
"uint8_t", "Flag"
]
},
"F80LoadFCW": {
"OpClass": "Vector",
"HasSideEffects": true,
"SSAArgs": "1",
"SSANames": [
"X80FCW"
]
},
"F80Add": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80Sub": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80Mul": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80Div": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80ATAN": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80FPREM": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80FPREM1": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80SCALE": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80CVT": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "Size",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
],
"HelperArgs": [
"uint8_t", "Size"
]
},
"F80CVTInt": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "Size",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
],
"Args": [
"bool", "Truncate"
],
"HelperArgs": [
"uint8_t", "Size"
]
},
"F80CVTTo": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
],
"Args": [
"uint8_t", "Size"
]
},
"F80CVTToInt": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
],
"Args": [
"uint8_t", "Size"
]
},
"F80Round": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80F2XM1": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80FYL2X": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
]
},
"F80TAN": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80SQRT": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80SIN": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80COS": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80XTRACT_EXP": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80XTRACT_SIG": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src"
]
},
"F80Cmp": {
"Desc": ["Does a scalar unordered compare and stores the asked for flags in to a GPR",
"Ordering flag result is true if either float input is NaN"
],
"OpClass": "ALU",
"HasDest": true,
"DestClass": "GPR",
"DestSize": "4",
"SSAArgs": "2",
"SSANames": [
"X80Src1",
"X80Src2"
],
"Args": [
"uint32_t", "Flags"
]
},
"F80BCDLoad": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"BCD"
]
},
"F80BCDStore": {
"OpClass": "Vector",
"HasDest": true,
"DestClass": "FPR",
"DestSize": "16",
"NumElements": "1",
"SSAArgs": "1",
"SSANames": [
"X80Src1"
]
},
"Last": {
"Last": true,
"Args": []
}
}
}