AnyPS5/core/shader/recompiler/RdnaDecoder/src/RdnaOpcode.cpp

872 lines
31 KiB
C++

#include "RdnaDecoder/RdnaOpcode.hpp"
#include <stdexcept>
namespace ShaderRecompiler {
namespace {
void requireClassifiableOpcode(RdnaOpcode opcode) {
if (opcode == RdnaOpcode::Invalid || opcode == RdnaOpcode::Count) {
throw std::invalid_argument("RdnaOpcode sentinel value cannot be classified");
}
}
}
bool IsScalarAluOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::SMovB32:
case RdnaOpcode::SMovB64:
case RdnaOpcode::SMovkI32:
case RdnaOpcode::SAddI32:
case RdnaOpcode::SAddU32:
case RdnaOpcode::SSubI32:
case RdnaOpcode::SSubU32:
case RdnaOpcode::SMulI32:
case RdnaOpcode::SAndB32:
case RdnaOpcode::SOrB32:
case RdnaOpcode::SXorB32:
case RdnaOpcode::SLshlB32:
case RdnaOpcode::SLshrB32:
case RdnaOpcode::SAshrI32:
case RdnaOpcode::SAshrI64:
case RdnaOpcode::SBfeU32:
case RdnaOpcode::SBfeI32:
case RdnaOpcode::SCmpEqI32:
case RdnaOpcode::SCmpLtI32:
case RdnaOpcode::SCmpGtI32:
case RdnaOpcode::SCmpEqU32:
case RdnaOpcode::SCmovB32:
case RdnaOpcode::SCmovB64:
case RdnaOpcode::SAbsI32:
case RdnaOpcode::SAbsdiffI32:
case RdnaOpcode::SBrevB32:
case RdnaOpcode::SBrevB64:
case RdnaOpcode::SSextI32I8:
case RdnaOpcode::SSextI32I16:
case RdnaOpcode::SBcnt0I32B32:
case RdnaOpcode::SBcnt0I32B64:
case RdnaOpcode::SBcnt1I32B32:
case RdnaOpcode::SBcnt1I32B64:
case RdnaOpcode::SFf0I32B32:
case RdnaOpcode::SFf0I32B64:
case RdnaOpcode::SFf1I32B32:
case RdnaOpcode::SFf1I32B64:
case RdnaOpcode::SFlbitI32B32:
case RdnaOpcode::SFlbitI32B64:
case RdnaOpcode::SFlbitI32:
case RdnaOpcode::SFlbitI32I64:
case RdnaOpcode::SBitreplicateB64B32:
case RdnaOpcode::SQuadmaskB32:
case RdnaOpcode::SMovrelsB32:
case RdnaOpcode::SMovrelsB64:
case RdnaOpcode::SMovreldB32:
case RdnaOpcode::SMovreldB64:
case RdnaOpcode::SMovrelsd2B32:
case RdnaOpcode::SQuadmaskB64:
case RdnaOpcode::SAndSaveexecB32:
case RdnaOpcode::SOrSaveexecB32:
case RdnaOpcode::SXorSaveexecB32:
case RdnaOpcode::SAndn2SaveexecB32:
case RdnaOpcode::SOrn2SaveexecB32:
case RdnaOpcode::SNandSaveexecB32:
case RdnaOpcode::SNorSaveexecB32:
case RdnaOpcode::SXnorSaveexecB32:
case RdnaOpcode::SAndn1SaveexecB32:
case RdnaOpcode::SOrn1SaveexecB32:
case RdnaOpcode::SAndn1WrexecB32:
case RdnaOpcode::SAndn2WrexecB32:
case RdnaOpcode::SAndSaveexecB64:
case RdnaOpcode::SOrSaveexecB64:
case RdnaOpcode::SXorSaveexecB64:
case RdnaOpcode::SAndn2SaveexecB64:
case RdnaOpcode::SOrn2SaveexecB64:
case RdnaOpcode::SNandSaveexecB64:
case RdnaOpcode::SNorSaveexecB64:
case RdnaOpcode::SXnorSaveexecB64:
case RdnaOpcode::SAndn1SaveexecB64:
case RdnaOpcode::SOrn1SaveexecB64:
case RdnaOpcode::SAndn1WrexecB64:
case RdnaOpcode::SAndn2WrexecB64:
case RdnaOpcode::SNotB32:
case RdnaOpcode::SNotB64:
case RdnaOpcode::SWqmB32:
case RdnaOpcode::SWqmB64:
case RdnaOpcode::SAddcU32:
case RdnaOpcode::SSubbU32:
case RdnaOpcode::SBitcmp0B32:
case RdnaOpcode::SBitcmp1B32:
case RdnaOpcode::SBitcmp0B64:
case RdnaOpcode::SBitcmp1B64:
case RdnaOpcode::SBitset0B32:
case RdnaOpcode::SBitset1B32:
case RdnaOpcode::SBitset0B64:
case RdnaOpcode::SBitset1B64:
case RdnaOpcode::SMinI32:
case RdnaOpcode::SMaxI32:
case RdnaOpcode::SMinU32:
case RdnaOpcode::SMaxU32:
case RdnaOpcode::SAndB64:
case RdnaOpcode::SAndn2B32:
case RdnaOpcode::SAndn2B64:
case RdnaOpcode::SOrB64:
case RdnaOpcode::SOrn2B32:
case RdnaOpcode::SOrn2B64:
case RdnaOpcode::SXorB64:
case RdnaOpcode::SNandB32:
case RdnaOpcode::SNandB64:
case RdnaOpcode::SNorB32:
case RdnaOpcode::SNorB64:
case RdnaOpcode::SXnorB32:
case RdnaOpcode::SXnorB64:
case RdnaOpcode::SLshlB64:
case RdnaOpcode::SLshl1AddU32:
case RdnaOpcode::SLshl2AddU32:
case RdnaOpcode::SLshl3AddU32:
case RdnaOpcode::SLshl4AddU32:
case RdnaOpcode::SLshrB64:
case RdnaOpcode::SMulHiU32:
case RdnaOpcode::SMulHiI32:
case RdnaOpcode::SMulkI32:
case RdnaOpcode::SBfeU64:
case RdnaOpcode::SBfmB32:
case RdnaOpcode::SBfmB64:
case RdnaOpcode::SCselectB32:
case RdnaOpcode::SCselectB64:
case RdnaOpcode::SPackLlB32B16:
case RdnaOpcode::SPackLhB32B16:
case RdnaOpcode::SPackHhB32B16:
case RdnaOpcode::SCmpLgI32:
case RdnaOpcode::SCmpGeI32:
case RdnaOpcode::SCmpLeI32:
case RdnaOpcode::SCmpLgU32:
case RdnaOpcode::SCmpGtU32:
case RdnaOpcode::SCmpGeU32:
case RdnaOpcode::SCmpLtU32:
case RdnaOpcode::SCmpLeU32:
case RdnaOpcode::SCmpEqU64:
case RdnaOpcode::SCmpLgU64:
return true;
default:
return false;
}
}
bool IsVectorAluOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::VMovB32:
case RdnaOpcode::VAddF32:
case RdnaOpcode::VSubF32:
case RdnaOpcode::VMulF32:
case RdnaOpcode::VMadF32:
case RdnaOpcode::VMadLegacyF32:
case RdnaOpcode::VMullitF32:
case RdnaOpcode::VFmaF32:
case RdnaOpcode::VAddI32:
case RdnaOpcode::VSubI32:
case RdnaOpcode::VMulLoU32:
case RdnaOpcode::VMulHiU32:
case RdnaOpcode::VMadU64U32:
case RdnaOpcode::VMadI64I32:
case RdnaOpcode::VSadU32:
case RdnaOpcode::VSadU8:
case RdnaOpcode::VSadHiU8:
case RdnaOpcode::VSadU16:
case RdnaOpcode::VMsadU8:
case RdnaOpcode::VQsadPkU16U8:
case RdnaOpcode::VMqsadPkU16U8:
case RdnaOpcode::VMqsadU32U8:
case RdnaOpcode::VAndB32:
case RdnaOpcode::VOrB32:
case RdnaOpcode::VXorB32:
case RdnaOpcode::VLshlB32:
case RdnaOpcode::VLshrB32:
case RdnaOpcode::VAshrI32:
case RdnaOpcode::VCmpEqF32:
case RdnaOpcode::VCmpLtF32:
case RdnaOpcode::VCmpGtF32:
case RdnaOpcode::VCndmaskB32:
case RdnaOpcode::VCvtF32I32:
case RdnaOpcode::VCvtI32F32:
case RdnaOpcode::VCvtF32U32:
case RdnaOpcode::VCvtU32F32:
case RdnaOpcode::VCvtF32F16:
case RdnaOpcode::VCvtF16F32:
case RdnaOpcode::VRcpF32:
case RdnaOpcode::VRsqF32:
case RdnaOpcode::VSqrtF32:
case RdnaOpcode::VExpF32:
case RdnaOpcode::VLogF32:
case RdnaOpcode::VSinF32:
case RdnaOpcode::VCosF32:
case RdnaOpcode::VFloorF32:
case RdnaOpcode::VCeilF32:
case RdnaOpcode::VFractF32:
case RdnaOpcode::VMinF32:
case RdnaOpcode::VMaxF32:
case RdnaOpcode::VMinI32:
case RdnaOpcode::VMaxI32:
case RdnaOpcode::VReadfirstlaneB32:
case RdnaOpcode::VReadlaneB32:
case RdnaOpcode::VWritelaneB32:
case RdnaOpcode::VMovreldB32:
case RdnaOpcode::VNop:
case RdnaOpcode::VPipeflush:
case RdnaOpcode::VClrexcp:
case RdnaOpcode::VMovrelsB32:
case RdnaOpcode::VMovrelsdB32:
case RdnaOpcode::VMovrelsd2B32:
case RdnaOpcode::VSwapB32:
case RdnaOpcode::VSwaprelB32:
case RdnaOpcode::VPermlane16B32:
case RdnaOpcode::VPermlanex16B32:
case RdnaOpcode::VCubeidF32:
case RdnaOpcode::VCubescF32:
case RdnaOpcode::VCubetcF32:
case RdnaOpcode::VCubemaF32:
case RdnaOpcode::VDot2cF32F16:
case RdnaOpcode::VDot4cI32I8:
case RdnaOpcode::VDot2I32I16:
case RdnaOpcode::VDot2U32U16:
case RdnaOpcode::VDot4I32I8:
case RdnaOpcode::VDot4U32U8:
case RdnaOpcode::VDot8I32I4:
case RdnaOpcode::VDot8U32U4:
case RdnaOpcode::VCvtF16U16:
case RdnaOpcode::VCvtU16F16:
case RdnaOpcode::VCvtF16I16:
case RdnaOpcode::VCvtI16F16:
case RdnaOpcode::VCvtRpiI32F32:
case RdnaOpcode::VCvtFlrI32F32:
case RdnaOpcode::VFrexpExpI32F32:
case RdnaOpcode::VFrexpMantF32:
case RdnaOpcode::VCvtOffF32I4:
case RdnaOpcode::VCvtF32Ubyte0:
case RdnaOpcode::VCvtF32Ubyte1:
case RdnaOpcode::VCvtF32Ubyte2:
case RdnaOpcode::VCvtF32Ubyte3:
case RdnaOpcode::VRcpIflagF32:
case RdnaOpcode::VTruncF32:
case RdnaOpcode::VRndneF32:
case RdnaOpcode::VRcpF16:
case RdnaOpcode::VSqrtF16:
case RdnaOpcode::VRsqF16:
case RdnaOpcode::VLogF16:
case RdnaOpcode::VExpF16:
case RdnaOpcode::VFloorF16:
case RdnaOpcode::VCeilF16:
case RdnaOpcode::VTruncF16:
case RdnaOpcode::VRndneF16:
case RdnaOpcode::VFractF16:
case RdnaOpcode::VSinF16:
case RdnaOpcode::VCosF16:
case RdnaOpcode::VNotB32:
case RdnaOpcode::VBfrevB32:
case RdnaOpcode::VFfbhU32:
case RdnaOpcode::VFfblB32:
case RdnaOpcode::VFfbhI32:
case RdnaOpcode::VSubrevF32:
case RdnaOpcode::VMacF32:
case RdnaOpcode::VMadmkF32:
case RdnaOpcode::VMadakF32:
case RdnaOpcode::VAddF16:
case RdnaOpcode::VSubF16:
case RdnaOpcode::VSubrevF16:
case RdnaOpcode::VMulF16:
case RdnaOpcode::VFmacF16:
case RdnaOpcode::VFmamkF16:
case RdnaOpcode::VFmaakF16:
case RdnaOpcode::VMulI32I24:
case RdnaOpcode::VMulU32U24:
case RdnaOpcode::VMulHiI32I24:
case RdnaOpcode::VMulHiU32U24:
case RdnaOpcode::VMulLoI32:
case RdnaOpcode::VMulHiI32:
case RdnaOpcode::VCvtPkrtzF16F32:
case RdnaOpcode::VCvtPkU8F32:
case RdnaOpcode::VMadI32I24:
case RdnaOpcode::VMadU32U24:
case RdnaOpcode::VFmaF16:
case RdnaOpcode::VPackB32F16:
case RdnaOpcode::VBfeU32:
case RdnaOpcode::VBfeI32:
case RdnaOpcode::VBfiB32:
case RdnaOpcode::VAlignbitB32:
case RdnaOpcode::VAlignbyteB32:
case RdnaOpcode::VMin3F32:
case RdnaOpcode::VMin3I32:
case RdnaOpcode::VMin3U32:
case RdnaOpcode::VMin3F16:
case RdnaOpcode::VMin3I16:
case RdnaOpcode::VMin3U16:
case RdnaOpcode::VMax3F32:
case RdnaOpcode::VMax3I32:
case RdnaOpcode::VMax3U32:
case RdnaOpcode::VMax3F16:
case RdnaOpcode::VMax3I16:
case RdnaOpcode::VMax3U16:
case RdnaOpcode::VMed3F32:
case RdnaOpcode::VMed3I32:
case RdnaOpcode::VMed3U32:
case RdnaOpcode::VMed3F16:
case RdnaOpcode::VMed3I16:
case RdnaOpcode::VMed3U16:
case RdnaOpcode::VDivFixupF16:
case RdnaOpcode::VAdd3U32:
case RdnaOpcode::VLshlAddU32:
case RdnaOpcode::VAddLshlU32:
case RdnaOpcode::VPermB32:
case RdnaOpcode::VLerpU8:
case RdnaOpcode::VXadU32:
case RdnaOpcode::VLshlOrB32:
case RdnaOpcode::VAndOrB32:
case RdnaOpcode::VOr3B32:
case RdnaOpcode::VXor3B32:
case RdnaOpcode::VSubrevI32:
case RdnaOpcode::VBfmB32:
case RdnaOpcode::VLdexpF32:
case RdnaOpcode::VLdexpF16:
case RdnaOpcode::VFrexpMantF16:
case RdnaOpcode::VFrexpExpI16F16:
case RdnaOpcode::VCvtNormI16F16:
case RdnaOpcode::VCvtNormU16F16:
case RdnaOpcode::VCvtPknormI16F16:
case RdnaOpcode::VCvtPknormU16F16:
case RdnaOpcode::VCmpClassF16:
case RdnaOpcode::VCmpxClassF16:
case RdnaOpcode::VSatPkU8I16:
case RdnaOpcode::VMulLegacyF32:
case RdnaOpcode::VMacLegacyF32:
case RdnaOpcode::VFmaF64:
case RdnaOpcode::VAddF64:
case RdnaOpcode::VMulF64:
case RdnaOpcode::VMinF64:
case RdnaOpcode::VMaxF64:
case RdnaOpcode::VLdexpF64:
case RdnaOpcode::VCvtI32F64:
case RdnaOpcode::VCvtF64I32:
case RdnaOpcode::VCvtF32F64:
case RdnaOpcode::VCvtF64F32:
case RdnaOpcode::VCvtU32F64:
case RdnaOpcode::VCvtF64U32:
case RdnaOpcode::VTruncF64:
case RdnaOpcode::VCeilF64:
case RdnaOpcode::VRndneF64:
case RdnaOpcode::VFloorF64:
case RdnaOpcode::VFrexpExpI32F64:
case RdnaOpcode::VFrexpMantF64:
case RdnaOpcode::VFractF64:
case RdnaOpcode::VDivScaleF32:
case RdnaOpcode::VDivFmasF32:
case RdnaOpcode::VDivFixupF32:
case RdnaOpcode::VCvtPknormI16F32:
case RdnaOpcode::VCvtPknormU16F32:
case RdnaOpcode::VCvtPkU16U32:
case RdnaOpcode::VCvtPkI16I32:
case RdnaOpcode::VPkMadI16:
case RdnaOpcode::VPkMulLoU16:
case RdnaOpcode::VPkAddI16:
case RdnaOpcode::VPkSubI16:
case RdnaOpcode::VPkLshlrevB16:
case RdnaOpcode::VPkLshrrevB16:
case RdnaOpcode::VPkAshrrevI16:
case RdnaOpcode::VPkMaxI16:
case RdnaOpcode::VPkMinI16:
case RdnaOpcode::VPkMadU16:
case RdnaOpcode::VPkAddF16:
case RdnaOpcode::VPkMulF16:
case RdnaOpcode::VPkMinF16:
case RdnaOpcode::VPkMaxF16:
case RdnaOpcode::VPkFmaF16:
case RdnaOpcode::VPkFmacF16:
case RdnaOpcode::VPkAddU16:
case RdnaOpcode::VPkSubU16:
case RdnaOpcode::VPkMaxU16:
case RdnaOpcode::VPkMinU16:
case RdnaOpcode::VMadMixloF16:
case RdnaOpcode::VMadMixhiF16:
case RdnaOpcode::VAddNcU32:
case RdnaOpcode::VAddcU32:
case RdnaOpcode::VSubCoCiU32:
case RdnaOpcode::VSubrevCoCiU32:
case RdnaOpcode::VSubNcU32:
case RdnaOpcode::VSubrevNcU32:
case RdnaOpcode::VAddNcU16:
case RdnaOpcode::VSubNcU16:
case RdnaOpcode::VMaxU16:
case RdnaOpcode::VMaxI16:
case RdnaOpcode::VMinU16:
case RdnaOpcode::VMinI16:
case RdnaOpcode::VAddNcI16:
case RdnaOpcode::VSubNcI16:
case RdnaOpcode::VXnorB32:
case RdnaOpcode::VLshlrevB32:
case RdnaOpcode::VLshrrevB32:
case RdnaOpcode::VAshrrevI32:
case RdnaOpcode::VLshlrevB64:
case RdnaOpcode::VLshrrevB64:
case RdnaOpcode::VAshrrevI64:
case RdnaOpcode::VAddNcI32:
case RdnaOpcode::VSubNcI32:
case RdnaOpcode::VMulLoU16:
case RdnaOpcode::VMadU16:
case RdnaOpcode::VMadI16:
case RdnaOpcode::VMadU32U16:
case RdnaOpcode::VMadI32I16:
case RdnaOpcode::VLshlrevB16:
case RdnaOpcode::VLshrrevB16:
case RdnaOpcode::VAshrrevI16:
case RdnaOpcode::VBcntU32B32:
case RdnaOpcode::VMbcntLoU32B32:
case RdnaOpcode::VMbcntHiU32B32:
case RdnaOpcode::VMinU32:
case RdnaOpcode::VMaxU32:
case RdnaOpcode::VMaxF16:
case RdnaOpcode::VMinF16:
case RdnaOpcode::VCmpFF32:
case RdnaOpcode::VCmpLeF32:
case RdnaOpcode::VCmpLgF32:
case RdnaOpcode::VCmpGeF32:
case RdnaOpcode::VCmpOF32:
case RdnaOpcode::VCmpUF32:
case RdnaOpcode::VCmpNgeF32:
case RdnaOpcode::VCmpNlgF32:
case RdnaOpcode::VCmpNgtF32:
case RdnaOpcode::VCmpNleF32:
case RdnaOpcode::VCmpNeqF32:
case RdnaOpcode::VCmpNltF32:
case RdnaOpcode::VCmpTruF32:
case RdnaOpcode::VCmpxLtF32:
case RdnaOpcode::VCmpxEqF32:
case RdnaOpcode::VCmpxLeF32:
case RdnaOpcode::VCmpxGtF32:
case RdnaOpcode::VCmpxLgF32:
case RdnaOpcode::VCmpxGeF32:
case RdnaOpcode::VCmpxNgeF32:
case RdnaOpcode::VCmpxNlgF32:
case RdnaOpcode::VCmpxNgtF32:
case RdnaOpcode::VCmpxNleF32:
case RdnaOpcode::VCmpxNeqF32:
case RdnaOpcode::VCmpxNltF32:
case RdnaOpcode::VCmpFI32:
case RdnaOpcode::VCmpLtI32:
case RdnaOpcode::VCmpEqI32:
case RdnaOpcode::VCmpLeI32:
case RdnaOpcode::VCmpGtI32:
case RdnaOpcode::VCmpNeI32:
case RdnaOpcode::VCmpGeI32:
case RdnaOpcode::VCmpTI32:
case RdnaOpcode::VCmpClassF32:
case RdnaOpcode::VCmpxClassF32:
case RdnaOpcode::VCmpLtI16:
case RdnaOpcode::VCmpEqI16:
case RdnaOpcode::VCmpLeI16:
case RdnaOpcode::VCmpGtI16:
case RdnaOpcode::VCmpNeI16:
case RdnaOpcode::VCmpGeI16:
case RdnaOpcode::VCmpxLtI16:
case RdnaOpcode::VCmpxEqI16:
case RdnaOpcode::VCmpxLeI16:
case RdnaOpcode::VCmpxGtI16:
case RdnaOpcode::VCmpxNeI16:
case RdnaOpcode::VCmpxGeI16:
case RdnaOpcode::VCmpLtF16:
case RdnaOpcode::VCmpEqF16:
case RdnaOpcode::VCmpLeF16:
case RdnaOpcode::VCmpGtF16:
case RdnaOpcode::VCmpLgF16:
case RdnaOpcode::VCmpGeF16:
case RdnaOpcode::VCmpNeqF16:
case RdnaOpcode::VCmpxLtF16:
case RdnaOpcode::VCmpxEqF16:
case RdnaOpcode::VCmpxLeF16:
case RdnaOpcode::VCmpxGtF16:
case RdnaOpcode::VCmpxGeF16:
case RdnaOpcode::VCmpxNgtF16:
case RdnaOpcode::VCmpxNeqF16:
case RdnaOpcode::VCmpxNltF16:
case RdnaOpcode::VCmpxLtI32:
case RdnaOpcode::VCmpxEqI32:
case RdnaOpcode::VCmpxLeI32:
case RdnaOpcode::VCmpxGtI32:
case RdnaOpcode::VCmpxNeI32:
case RdnaOpcode::VCmpxGeI32:
case RdnaOpcode::VCmpLtU16:
case RdnaOpcode::VCmpEqU16:
case RdnaOpcode::VCmpLeU16:
case RdnaOpcode::VCmpGtU16:
case RdnaOpcode::VCmpxLtU16:
case RdnaOpcode::VCmpxEqU16:
case RdnaOpcode::VCmpxLeU16:
case RdnaOpcode::VCmpxGtU16:
case RdnaOpcode::VCmpxNeU16:
case RdnaOpcode::VCmpxGeU16:
case RdnaOpcode::VCmpNeU16:
case RdnaOpcode::VCmpGeU16:
case RdnaOpcode::VCmpFU32:
case RdnaOpcode::VCmpLtU32:
case RdnaOpcode::VCmpEqU32:
case RdnaOpcode::VCmpLeU32:
case RdnaOpcode::VCmpGtU32:
case RdnaOpcode::VCmpNeU32:
case RdnaOpcode::VCmpGeU32:
case RdnaOpcode::VCmpTU32:
case RdnaOpcode::VCmpEqI64:
case RdnaOpcode::VCmpLtU64:
case RdnaOpcode::VCmpEqU64:
case RdnaOpcode::VCmpGtU64:
case RdnaOpcode::VCmpNeU64:
case RdnaOpcode::VCmpxNeI64:
case RdnaOpcode::VCmpxFF32:
case RdnaOpcode::VCmpxOF32:
case RdnaOpcode::VCmpxUF32:
case RdnaOpcode::VCmpxTruF32:
case RdnaOpcode::VCmpxFI32:
case RdnaOpcode::VCmpxTI32:
case RdnaOpcode::VCmpxFU32:
case RdnaOpcode::VCmpxTU32:
case RdnaOpcode::VCmpFI64:
case RdnaOpcode::VCmpLtI64:
case RdnaOpcode::VCmpLeI64:
case RdnaOpcode::VCmpGtI64:
case RdnaOpcode::VCmpNeI64:
case RdnaOpcode::VCmpGeI64:
case RdnaOpcode::VCmpTI64:
case RdnaOpcode::VCmpxFI64:
case RdnaOpcode::VCmpxLtI64:
case RdnaOpcode::VCmpxEqI64:
case RdnaOpcode::VCmpxLeI64:
case RdnaOpcode::VCmpxGtI64:
case RdnaOpcode::VCmpxGeI64:
case RdnaOpcode::VCmpxTI64:
case RdnaOpcode::VCmpFU64:
case RdnaOpcode::VCmpLeU64:
case RdnaOpcode::VCmpGeU64:
case RdnaOpcode::VCmpTU64:
case RdnaOpcode::VCmpxFU64:
case RdnaOpcode::VCmpxLtU64:
case RdnaOpcode::VCmpxEqU64:
case RdnaOpcode::VCmpxLeU64:
case RdnaOpcode::VCmpxGtU64:
case RdnaOpcode::VCmpxGeU64:
case RdnaOpcode::VCmpxTU64:
case RdnaOpcode::VCmpFF16:
case RdnaOpcode::VCmpOF16:
case RdnaOpcode::VCmpUF16:
case RdnaOpcode::VCmpNgeF16:
case RdnaOpcode::VCmpNlgF16:
case RdnaOpcode::VCmpNgtF16:
case RdnaOpcode::VCmpNleF16:
case RdnaOpcode::VCmpNltF16:
case RdnaOpcode::VCmpTruF16:
case RdnaOpcode::VCmpxFF16:
case RdnaOpcode::VCmpxLgF16:
case RdnaOpcode::VCmpxOF16:
case RdnaOpcode::VCmpxUF16:
case RdnaOpcode::VCmpxNgeF16:
case RdnaOpcode::VCmpxNlgF16:
case RdnaOpcode::VCmpxNleF16:
case RdnaOpcode::VCmpxTruF16:
case RdnaOpcode::VCmpFF64:
case RdnaOpcode::VCmpLtF64:
case RdnaOpcode::VCmpEqF64:
case RdnaOpcode::VCmpLeF64:
case RdnaOpcode::VCmpGtF64:
case RdnaOpcode::VCmpLgF64:
case RdnaOpcode::VCmpGeF64:
case RdnaOpcode::VCmpOF64:
case RdnaOpcode::VCmpUF64:
case RdnaOpcode::VCmpNgeF64:
case RdnaOpcode::VCmpNlgF64:
case RdnaOpcode::VCmpNgtF64:
case RdnaOpcode::VCmpNleF64:
case RdnaOpcode::VCmpNeqF64:
case RdnaOpcode::VCmpNltF64:
case RdnaOpcode::VCmpTruF64:
case RdnaOpcode::VCmpClassF64:
case RdnaOpcode::VCmpxFF64:
case RdnaOpcode::VCmpxLtF64:
case RdnaOpcode::VCmpxEqF64:
case RdnaOpcode::VCmpxLeF64:
case RdnaOpcode::VCmpxGtF64:
case RdnaOpcode::VCmpxLgF64:
case RdnaOpcode::VCmpxGeF64:
case RdnaOpcode::VCmpxOF64:
case RdnaOpcode::VCmpxUF64:
case RdnaOpcode::VCmpxNgeF64:
case RdnaOpcode::VCmpxNlgF64:
case RdnaOpcode::VCmpxNgtF64:
case RdnaOpcode::VCmpxNleF64:
case RdnaOpcode::VCmpxNeqF64:
case RdnaOpcode::VCmpxNltF64:
case RdnaOpcode::VCmpxTruF64:
case RdnaOpcode::VCmpxClassF64:
case RdnaOpcode::VCmpxNeU64:
case RdnaOpcode::VCmpxLtU32:
case RdnaOpcode::VCmpxEqU32:
case RdnaOpcode::VCmpxLeU32:
case RdnaOpcode::VCmpxGtU32:
case RdnaOpcode::VCmpxNeU32:
case RdnaOpcode::VCmpxGeU32:
case RdnaOpcode::VInterpP1F32:
case RdnaOpcode::VInterpP2F32:
case RdnaOpcode::VInterpMovF32:
return true;
default:
return false;
}
}
bool IsBranchOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
return IsDirectBranchOpcode(opcode);
}
bool IsScalarMemoryOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::SLoadDword:
case RdnaOpcode::SLoadDwordx2:
case RdnaOpcode::SLoadDwordx4:
case RdnaOpcode::SLoadDwordx8:
case RdnaOpcode::SLoadDwordx16:
case RdnaOpcode::SBufferLoadDword:
case RdnaOpcode::SBufferLoadDwordx2:
case RdnaOpcode::SBufferLoadDwordx4:
case RdnaOpcode::SBufferLoadDwordx8:
case RdnaOpcode::SBufferLoadDwordx16:
return true;
default:
return false;
}
}
bool IsBufferMemoryOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::TBufferLoadFormatX:
case RdnaOpcode::TBufferLoadFormatXyzw:
throw std::logic_error("RdnaOpcode is an unused duplicate TBUFFER enum entry with no established classification");
case RdnaOpcode::BufferLoadFormatX:
case RdnaOpcode::BufferLoadFormatXy:
case RdnaOpcode::BufferLoadFormatXyz:
case RdnaOpcode::BufferLoadFormatXyzw:
case RdnaOpcode::BufferLoadDword:
case RdnaOpcode::BufferLoadDwordx2:
case RdnaOpcode::BufferLoadDwordx4:
case RdnaOpcode::BufferStoreFormatX:
case RdnaOpcode::BufferStoreDword:
case RdnaOpcode::BufferStoreDwordx4:
case RdnaOpcode::BufferStoreFormatXy:
case RdnaOpcode::BufferStoreFormatXyz:
case RdnaOpcode::BufferStoreFormatXyzw:
case RdnaOpcode::BufferLoadUbyte:
case RdnaOpcode::BufferLoadSbyte:
case RdnaOpcode::BufferLoadUshort:
case RdnaOpcode::BufferLoadSshort:
case RdnaOpcode::BufferLoadDwordx3:
case RdnaOpcode::BufferStoreByte:
case RdnaOpcode::BufferStoreShort:
case RdnaOpcode::BufferLoadUbyteD16:
case RdnaOpcode::BufferLoadUbyteD16Hi:
case RdnaOpcode::BufferLoadSbyteD16:
case RdnaOpcode::BufferLoadSbyteD16Hi:
case RdnaOpcode::BufferLoadShortD16:
case RdnaOpcode::BufferLoadShortD16Hi:
case RdnaOpcode::BufferStoreByteD16Hi:
case RdnaOpcode::BufferStoreShortD16Hi:
case RdnaOpcode::BufferStoreDwordx2:
case RdnaOpcode::BufferStoreDwordx3:
case RdnaOpcode::BufferAtomicSwap:
case RdnaOpcode::BufferAtomicCmpswap:
case RdnaOpcode::BufferAtomicSwapX2:
case RdnaOpcode::BufferAtomicAdd:
case RdnaOpcode::BufferAtomicSub:
case RdnaOpcode::BufferAtomicSmin:
case RdnaOpcode::BufferAtomicUmin:
case RdnaOpcode::BufferAtomicSmax:
case RdnaOpcode::BufferAtomicUmax:
case RdnaOpcode::BufferAtomicAnd:
case RdnaOpcode::BufferAtomicOr:
case RdnaOpcode::BufferAtomicOrX2:
case RdnaOpcode::BufferAtomicInc:
case RdnaOpcode::BufferAtomicDec:
case RdnaOpcode::BufferAtomicCmpswapX2:
case RdnaOpcode::BufferAtomicAddX2:
case RdnaOpcode::BufferAtomicSubX2:
case RdnaOpcode::BufferAtomicSminX2:
case RdnaOpcode::BufferAtomicUminX2:
case RdnaOpcode::BufferAtomicSmaxX2:
case RdnaOpcode::BufferAtomicUmaxX2:
case RdnaOpcode::BufferAtomicAndX2:
case RdnaOpcode::BufferAtomicXorX2:
case RdnaOpcode::BufferAtomicFcmpswap:
case RdnaOpcode::BufferAtomicFcmpswapX2:
case RdnaOpcode::BufferAtomicFminX2:
case RdnaOpcode::BufferAtomicFmaxX2:
case RdnaOpcode::BufferAtomicIncX2:
case RdnaOpcode::BufferAtomicDecX2:
case RdnaOpcode::BufferAtomicXor:
case RdnaOpcode::BufferAtomicFmin:
case RdnaOpcode::BufferAtomicFmax:
case RdnaOpcode::TbufferLoadFormatX:
case RdnaOpcode::TbufferLoadFormatXy:
case RdnaOpcode::TbufferLoadFormatXyz:
case RdnaOpcode::TbufferLoadFormatXyzw:
case RdnaOpcode::TbufferLoadFormatD16X:
case RdnaOpcode::TbufferLoadFormatD16Xy:
case RdnaOpcode::TbufferLoadFormatD16Xyz:
case RdnaOpcode::TbufferLoadFormatD16Xyzw:
case RdnaOpcode::BufferLoadFormatD16X:
case RdnaOpcode::BufferLoadFormatD16Xy:
case RdnaOpcode::BufferLoadFormatD16Xyz:
case RdnaOpcode::BufferLoadFormatD16Xyzw:
case RdnaOpcode::BufferLoadFormatD16HiX:
case RdnaOpcode::TbufferStoreFormatD16X:
case RdnaOpcode::TbufferStoreFormatD16Xy:
case RdnaOpcode::TbufferStoreFormatD16Xyz:
case RdnaOpcode::TbufferStoreFormatD16Xyzw:
case RdnaOpcode::BufferStoreFormatD16X:
case RdnaOpcode::BufferStoreFormatD16Xy:
case RdnaOpcode::BufferStoreFormatD16Xyz:
case RdnaOpcode::BufferStoreFormatD16Xyzw:
case RdnaOpcode::BufferStoreFormatD16HiX:
case RdnaOpcode::TbufferStoreFormatX:
case RdnaOpcode::TbufferStoreFormatXy:
case RdnaOpcode::TbufferStoreFormatXyz:
case RdnaOpcode::TbufferStoreFormatXyzw:
return true;
default:
return false;
}
}
bool IsImageOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::ImageSample:
case RdnaOpcode::ImageSampleBCl:
case RdnaOpcode::ImageSampleBClO:
case RdnaOpcode::ImageSampleBO:
case RdnaOpcode::ImageSampleC:
case RdnaOpcode::ImageSampleCB:
case RdnaOpcode::ImageSampleCBCl:
case RdnaOpcode::ImageSampleCBClO:
case RdnaOpcode::ImageSampleCBO:
case RdnaOpcode::ImageSampleCCl:
case RdnaOpcode::ImageSampleCClO:
case RdnaOpcode::ImageSampleCD:
case RdnaOpcode::ImageSampleCDCl:
case RdnaOpcode::ImageSampleCDClO:
case RdnaOpcode::ImageSampleCDO:
case RdnaOpcode::ImageSampleCL:
case RdnaOpcode::ImageSampleCLzO:
case RdnaOpcode::ImageSampleCLO:
case RdnaOpcode::ImageSampleCO:
case RdnaOpcode::ImageSampleCl:
case RdnaOpcode::ImageSampleClO:
case RdnaOpcode::ImageSampleD:
case RdnaOpcode::ImageSampleDCl:
case RdnaOpcode::ImageSampleDO:
case RdnaOpcode::ImageSampleLzO:
case RdnaOpcode::ImageSampleO:
case RdnaOpcode::ImageSampleLz:
case RdnaOpcode::ImageLoad:
case RdnaOpcode::ImageStore:
case RdnaOpcode::ImageGetResinfo:
case RdnaOpcode::ImageGetLod:
case RdnaOpcode::ImageLoadMip:
case RdnaOpcode::ImageLoadPck:
case RdnaOpcode::ImageLoadPckSgn:
case RdnaOpcode::ImageLoadMipPck:
case RdnaOpcode::ImageLoadMipPckSgn:
case RdnaOpcode::ImageStoreMip:
case RdnaOpcode::ImageStorePck:
case RdnaOpcode::ImageStoreMipPck:
case RdnaOpcode::ImageAtomicSwap:
case RdnaOpcode::ImageAtomicAdd:
case RdnaOpcode::ImageAtomicUmin:
case RdnaOpcode::ImageAtomicUmax:
case RdnaOpcode::ImageAtomicAnd:
case RdnaOpcode::ImageAtomicOr:
case RdnaOpcode::ImageAtomicXor:
case RdnaOpcode::ImageAtomicCmpswap:
case RdnaOpcode::ImageAtomicSub:
case RdnaOpcode::ImageAtomicSmin:
case RdnaOpcode::ImageAtomicSmax:
case RdnaOpcode::ImageAtomicInc:
case RdnaOpcode::ImageAtomicDec:
case RdnaOpcode::ImageGather4Lz:
case RdnaOpcode::ImageGather4C:
case RdnaOpcode::ImageGather4CLz:
case RdnaOpcode::ImageGather4LzO:
case RdnaOpcode::ImageGather4CO:
case RdnaOpcode::ImageGather4CLzO:
case RdnaOpcode::ImageGather4h:
case RdnaOpcode::ImageGather4:
case RdnaOpcode::ImageGather4B:
case RdnaOpcode::ImageGather4BCl:
case RdnaOpcode::ImageGather4BClO:
case RdnaOpcode::ImageGather4BO:
case RdnaOpcode::ImageGather4Cl:
case RdnaOpcode::ImageGather4ClO:
case RdnaOpcode::ImageGather4CB:
case RdnaOpcode::ImageGather4CBCl:
case RdnaOpcode::ImageGather4CBClO:
case RdnaOpcode::ImageGather4CBO:
case RdnaOpcode::ImageGather4CCl:
case RdnaOpcode::ImageGather4CClO:
case RdnaOpcode::ImageGather4CL:
case RdnaOpcode::ImageGather4CLO:
case RdnaOpcode::ImageGather4L:
case RdnaOpcode::ImageGather4LO:
case RdnaOpcode::ImageGather4O:
case RdnaOpcode::ImageBvhIntersectRay:
return true;
default:
return false;
}
}
bool IsExportOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::ExpMrt:
case RdnaOpcode::ExpPos:
case RdnaOpcode::ExpParam:
case RdnaOpcode::Exp:
return true;
default:
return false;
}
}
bool IsConditionalBranchOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
switch (opcode) {
case RdnaOpcode::SCbranchScc0:
case RdnaOpcode::SCbranchScc1:
case RdnaOpcode::SCbranchVccz:
case RdnaOpcode::SCbranchVccnz:
case RdnaOpcode::SCbranchExecz:
case RdnaOpcode::SCbranchExecnz:
case RdnaOpcode::SSubvectorLoopBegin:
case RdnaOpcode::SSubvectorLoopEnd:
return true;
default:
return false;
}
}
bool IsDirectBranchOpcode(RdnaOpcode opcode) {
requireClassifiableOpcode(opcode);
if (opcode == RdnaOpcode::SBranch) {
return true;
}
return IsConditionalBranchOpcode(opcode);
}
}