Files
FEX-Emu--FEX/External/FEXCore/Source/Interface/IR/IR.json
T
Ryan Houdek 4692a761b6 Implements two new IR Op codes
Extracts a vector element to a scalar value
Inserts a scalar element in to a vector
2020-03-17 13:49:47 -07:00

1250 lines
22 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",
"static constexpr FEXCore::IR::RegisterClassType GPRClass {0}",
"static constexpr FEXCore::IR::RegisterClassType FPRClass {1}"
],
"Ops": {
"Dummy": {
},
"IRHeader": {
"SSAArgs": "1",
"SSANames": [
"Blocks"
],
"Args": [
"uint64_t", "Entry",
"uint32_t", "BlockCount"
]
},
"CodeBlock": {
"SSAArgs": "3",
"RAOverride": "0",
"SSANames": [
"Begin",
"Last",
"Next"
]
},
"BeginBlock": {},
"EndBlock": {
"Args": [
"uint64_t", "RIPIncrement"
]
},
"GuestCallDirect": {
"Args": [
"uint64_t", "RIP",
"uint64_t", "NextRIP"
]
},
"GuestCallIndirect": {
"SSAArgs": "1",
"SSANames": [
"RIP"
],
"Args": [
"uint64_t", "NextRIP"
]
},
"GuestReturn": {
},
"Constant": {
"HasDest": true,
"FixedDestSize": "8",
"Args": [
"uint64_t", "Constant"
]
},
"Break": {
"Args": [
"uint8_t", "Reason",
"uint8_t", "Literal"
]
},
"ExitFunction": {},
"Jump": {
"SSAArgs": "1",
"RAOverride": "0"
},
"CondJump": {
"SSAArgs": "3",
"RAOverride": "1",
"SSANames": [
"Cond",
"TrueBlock",
"FalseBlock"
]
},
"Phi": {
"HasDest": true,
"DestSize": "~0",
"ArgPrinter": false,
"SSAArgs": "2",
"RAOverride": 0,
"SSANames": [
"PhiBegin",
"PhiEnd"
],
"Args": [
"uint8_t", "Class"
]
},
"PhiValue": {
"SSAArgs": "3",
"RAOverride": 0,
"DestSize": "GetOpSize(ssa0)",
"SSANames": [
"Value",
"Block",
"Next"
]
},
"Mov": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "1"
},
"CycleCounter": {
"HasDest": true,
"FixedDestSize": "8"
},
"LoadContext": {
"HasDest": true,
"DestSize": "Size",
"Args": [
"uint8_t", "Size",
"uint32_t", "Offset",
"RegisterClassType", "Class"
]
},
"StoreContext": {
"SSAArgs": "1",
"Args": [
"uint8_t", "Size",
"uint32_t", "Offset",
"RegisterClassType", "Class"
]
},
"LoadContextIndexed": {
"SSAArgs": "1",
"HasDest": true,
"DestSize": "Size",
"Args": [
"uint8_t", "Size",
"uint32_t", "BaseOffset",
"uint32_t", "Stride",
"RegisterClassType", "Class"
]
},
"StoreContextIndexed": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size",
"uint32_t", "BaseOffset",
"uint32_t", "Stride",
"RegisterClassType", "Class"
]
},
"SpillRegister": {
"SSAArgs": "1",
"Args": [
"uint32_t", "Slot",
"RegisterClassType", "Class"
]
},
"FillRegister": {
"HasDest": true,
"Args": [
"uint32_t", "Slot",
"RegisterClassType", "Class"
]
},
"LoadFlag": {
"HasDest": true,
"DestSize": "1",
"Args": [
"uint32_t", "Flag"
]
},
"StoreFlag": {
"SSAArgs": "1",
"Args": [
"uint32_t", "Flag"
]
},
"Syscall": {
"HasDest": true,
"FixedDestSize": "8",
"SSAArgs": "7"
},
"LoadMem": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "1",
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class"
]
},
"StoreMem": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size",
"uint8_t", "Align",
"RegisterClassType", "Class"
]
},
"Add": {
"HasDest": true,
"SSAArgs": "2"
},
"Sub": {
"HasDest": true,
"SSAArgs": "2"
},
"Neg": {
"HasDest": true,
"SSAArgs": "1"
},
"Mul": {
"HasDest": true,
"SSAArgs": "2"
},
"UMul": {
"HasDest": true,
"SSAArgs": "2"
},
"Div": {
"HasDest": true,
"SSAArgs": "2"
},
"UDiv": {
"HasDest": true,
"SSAArgs": "2"
},
"Rem": {
"HasDest": true,
"SSAArgs": "2"
},
"URem": {
"HasDest": true,
"SSAArgs": "2"
},
"MulH": {
"HasDest": true,
"SSAArgs": "2"
},
"UMulH": {
"HasDest": true,
"SSAArgs": "2"
},
"Or": {
"HasDest": true,
"SSAArgs": "2"
},
"And": {
"HasDest": true,
"SSAArgs": "2"
},
"Xor": {
"HasDest": true,
"SSAArgs": "2"
},
"Lshl": {
"HasDest": true,
"SSAArgs": "2"
},
"Lshr": {
"HasDest": true,
"SSAArgs": "2"
},
"Ashr": {
"HasDest": true,
"SSAArgs": "2"
},
"Rol": {
"HasDest": true,
"SSAArgs": "2"
},
"Ror": {
"HasDest": true,
"SSAArgs": "2"
},
"LDiv": {
"HasDest": true,
"SSAArgs": "3"
},
"LUDiv": {
"HasDest": true,
"SSAArgs": "3"
},
"LRem": {
"HasDest": true,
"SSAArgs": "3"
},
"LURem": {
"HasDest": true,
"SSAArgs": "3"
},
"Zext": {
"HasDest": true,
"DestSize": "SrcSize / 4",
"SSAArgs": "1",
"Args": [
"uint8_t", "SrcSize"
]
},
"Sext": {
"HasDest": true,
"DestSize": "SrcSize / 4",
"SSAArgs": "1",
"Args": [
"uint8_t", "SrcSize"
]
},
"Not": {
"HasDest": true,
"SSAArgs": "1"
},
"Popcount": {
"HasDest": true,
"SSAArgs": "1"
},
"FindLSB": {
"HasDest": true,
"SSAArgs": "1"
},
"FindMSB": {
"HasDest": true,
"SSAArgs": "1"
},
"FindTrailingZeros": {
"HasDest": true,
"SSAArgs": "1"
},
"Rev": {
"HasDest": true,
"SSAArgs": "1"
},
"CPUID": {
"HasDest": true,
"FixedDestSize": "4",
"NumElements": "4",
"SSAArgs": "1"
},
"Bfi": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "2",
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Bfe": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "1",
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Sbfe": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "Width",
"uint8_t", "lsb"
]
},
"Select": {
"HasDest": true,
"SSAArgs": "4",
"Args": [
"CondClassType", "Cond"
]
},
"CAS": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0)",
"SSAArgs": "3"
},
"AtomicAdd": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicSub": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicAnd": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicOr": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicXor": {
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicSwap": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchAdd": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchSub": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchAnd": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchOr": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"AtomicFetchXor": {
"HasDest": true,
"DestSize": "Size",
"SSAArgs": "2",
"Args": [
"uint8_t", "Size"
]
},
"VExtractToGPR": {
"HasDest": true,
"SSAArgs": "1",
"DestSize": "ElementSize",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "Idx"
]
},
"Float_ToGPR_ZU": {
"HasDest": true,
"DestSize": "ElementSize",
"SSAArgs": "1",
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_ToGPR_ZS": {
"HasDest": true,
"DestSize": "ElementSize",
"SSAArgs": "1",
"Args": [
"uint8_t", "ElementSize"
]
},
"Print": {
"SSAArgs": "1"
},
"CreateVector2": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0) * 2",
"SSAArgs": "2"
},
"CreateVector3": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0) * 3",
"SSAArgs": "3"
},
"CreateVector4": {
"HasDest": true,
"DestSize": "GetOpSize(ssa0) * 4",
"SSAArgs": "4"
},
"SplatVector2": {
"HasDest": true,
"NumElements": "2",
"DestSize": "GetOpSize(ssa0) * 2",
"SSAArgs": "1"
},
"SplatVector3": {
"HasDest": true,
"NumElements": "3",
"DestSize": "GetOpSize(ssa0) * 3",
"SSAArgs": "1"
},
"SplatVector4": {
"HasDest": true,
"NumElements": "4",
"DestSize": "GetOpSize(ssa0) * 4",
"SSAArgs": "1"
},
"VAnd": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VOr": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VXor": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VAdd": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSub": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUQAdd": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUQSub": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQAdd": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQSub": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFAdd": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFSub": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMul": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFDiv": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMin": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFMax": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFRecp": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFSqrt": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFRSqrt": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VNeg": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VNot": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMin": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMin": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMax": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMax": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VZip": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VZip2": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPEQ": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCMPGT": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPEQ": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPNEQ": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPLT": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPGT": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VFCMPLE": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShl": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShr": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSShr": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShlS": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUShrS": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSShrS": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VInsElement": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "DestIdx",
"uint8_t", "SrcIdx"
]
},
"VInsScalarElement": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "DestIdx"
]
},
"VExtractElement": {
"HasDest": true,
"DestSize": "ElementSize",
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "Index"
]
},
"VExtr": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "Index"
]
},
"VInsGPR": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "Index"
]
},
"VSLI": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "ByteShift"
]
},
"VSRI": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "ByteShift"
]
},
"VUShrI": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "BitShift"
]
},
"VSShrI": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "BitShift"
]
},
"VShlI": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize",
"uint8_t", "BitShift"
]
},
"VBitcast": {
"HasDest": true,
"SSAArgs": "1"
},
"VSXTL": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUXTL": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VCastFromGPR": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTN": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTN2": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTUN": {
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSQXTUN2": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Float_FromGPR_U": {
"Desc": "Scalar op: Converts unsigned GPR to Scalar float",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_FromGPR_S": {
"Desc": "Scalar op: Converts signed GPR to Scalar float",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "ElementSize"
]
},
"Float_FToF": {
"Desc": "Scalar op: Converts float from one size to another",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "DstElementSize",
"uint8_t", "SrcElementSize"
]
},
"Vector_UToF": {
"Desc": "Vector op: Converts unsigned integer to same size float",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_SToF": {
"Desc": "Vector op: Converts signed integer to same size float",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToZU": {
"Desc": "Vector op: Converts float to unsigned integer, rounding towards zero",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToZS": {
"Desc": "Vector op: Converts float to signed integer, rounding towards zero",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Vector_FToF": {
"Desc": "Vector op: Converts float from source element size to destination size (fp32<->fp64)",
"HasDest": true,
"SSAArgs": "1",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "DstElementSize",
"uint8_t", "SrcElementSize"
]
},
"VUMul": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMul": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VUMull": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"VSMull": {
"HasDest": true,
"SSAArgs": "2",
"Args": [
"uint8_t", "RegisterSize",
"uint8_t", "ElementSize"
]
},
"Last": {
"Last": true,
"Args": []
}
}
}