Index: llvm/trunk/lib/Target/AMDGPU/AMDGPU.td =================================================================== --- llvm/trunk/lib/Target/AMDGPU/AMDGPU.td +++ llvm/trunk/lib/Target/AMDGPU/AMDGPU.td @@ -190,6 +190,18 @@ "Has store scalar memory instructions" >; +def FeatureSDWA : SubtargetFeature<"sdwa", + "HasSDWA", + "true", + "Support SDWA (Sub-DWORD Addressing) extension" +>; + +def FeatureDPP : SubtargetFeature<"dpp", + "HasDPP", + "true", + "Support DPP (Data Parallel Primitives) extension" +>; + //===------------------------------------------------------------===// // Subtarget Features (options and debugging) //===------------------------------------------------------------===// @@ -337,7 +349,8 @@ FeatureWavefrontSize64, FeatureFlatAddressSpace, FeatureGCN, FeatureGCN3Encoding, FeatureCIInsts, Feature16BitInsts, FeatureSMemRealTime, FeatureVGPRIndexMode, FeatureMovrel, - FeatureScalarStores, FeatureInv2PiInlineImm + FeatureScalarStores, FeatureInv2PiInlineImm, FeatureSDWA, + FeatureDPP ] >; @@ -507,6 +520,12 @@ def Has16BitInsts : Predicate<"Subtarget->has16BitInsts()">; +def HasSDWA : Predicate<"Subtarget->hasSDWA()">, + AssemblerPredicate<"FeatureSDWA">; + +def HasDPP : Predicate<"Subtarget->hasDPP()">, + AssemblerPredicate<"FeatureDPP">; + class PredicateControl { Predicate SubtargetPredicate; Predicate SIAssemblerPredicate = isSICI; Index: llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.h =================================================================== --- llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.h +++ llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.h @@ -114,6 +114,8 @@ bool HasVGPRIndexMode; bool HasScalarStores; bool HasInv2PiInlineImm; + bool HasSDWA; + bool HasDPP; bool FlatAddressSpace; bool R600ALUInst; bool CaymanISA; @@ -552,6 +554,14 @@ return HasInv2PiInlineImm; } + bool hasSDWA() const { + return HasSDWA; + } + + bool hasDPP() const { + return HasDPP; + } + bool enableSIScheduler() const { return EnableSIScheduler; } Index: llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.cpp =================================================================== --- llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.cpp +++ llvm/trunk/lib/Target/AMDGPU/AMDGPUSubtarget.cpp @@ -109,6 +109,8 @@ HasMovrel(false), HasVGPRIndexMode(false), HasScalarStores(false), + HasSDWA(false), + HasDPP(false), HasInv2PiInlineImm(false), FlatAddressSpace(false), Index: llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp =================================================================== --- llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ llvm/trunk/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -3442,7 +3442,7 @@ AMDGPUOperand &Op = ((AMDGPUOperand &)*Operands[I]); // Add the register arguments if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) { - // VOP2b (v_add_u32, v_sub_u32 ...) sdwa use "vcc" token. + // VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token. // Skip it. continue; } if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) { Index: llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.h =================================================================== --- llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.h +++ llvm/trunk/lib/Target/AMDGPU/SIInstrInfo.h @@ -308,6 +308,14 @@ return get(Opcode).TSFlags & SIInstrFlags::VOP3; } + static bool isSDWA(const MachineInstr &MI) { + return MI.getDesc().TSFlags & SIInstrFlags::SDWA; + } + + bool isSDWA(uint16_t Opcode) const { + return get(Opcode).TSFlags & SIInstrFlags::SDWA; + } + static bool isVOPC(const MachineInstr &MI) { return MI.getDesc().TSFlags & SIInstrFlags::VOPC; } Index: llvm/trunk/lib/Target/AMDGPU/VOP2Instructions.td =================================================================== --- llvm/trunk/lib/Target/AMDGPU/VOP2Instructions.td +++ llvm/trunk/lib/Target/AMDGPU/VOP2Instructions.td @@ -119,8 +119,7 @@ def _e64 : VOP3_Pseudo .ret>, Commutable_REV; - def _sdwa : VOP2_SDWA_Pseudo , - Commutable_REV; + def _sdwa : VOP2_SDWA_Pseudo ; } // TODO: add SDWA pseudo instructions for VOP2bInst and VOP2eInst @@ -135,9 +134,9 @@ def _e32 : VOP2_Pseudo , Commutable_REV; - def _sdwa : VOP2_SDWA_Pseudo , - Commutable_REV; + def _sdwa : VOP2_SDWA_Pseudo ; } + def _e64 : VOP3_Pseudo .ret>, Commutable_REV; } @@ -154,6 +153,7 @@ def _e32 : VOP2_Pseudo , Commutable_REV; } + def _e64 : VOP3_Pseudo .ret>, Commutable_REV; } Index: llvm/trunk/lib/Target/AMDGPU/VOPCInstructions.td =================================================================== --- llvm/trunk/lib/Target/AMDGPU/VOPCInstructions.td +++ llvm/trunk/lib/Target/AMDGPU/VOPCInstructions.td @@ -165,13 +165,11 @@ let isCommutable = 1; } - def _sdwa : VOPC_SDWA_Pseudo , - Commutable_REV { + def _sdwa : VOPC_SDWA_Pseudo { let Defs = !if(DefExec, [VCC, EXEC], [VCC]); let SchedRW = P.Schedule; let isConvergent = DefExec; let isCompare = 1; - let isCommutable = 1; } } Index: llvm/trunk/lib/Target/AMDGPU/VOPInstructions.td =================================================================== --- llvm/trunk/lib/Target/AMDGPU/VOPInstructions.td +++ llvm/trunk/lib/Target/AMDGPU/VOPInstructions.td @@ -267,8 +267,8 @@ let SDWA = 1; let Uses = [EXEC]; - let SubtargetPredicate = isVI; - let AssemblerPredicate = !if(P.HasExt, isVI, DisableInst); + let SubtargetPredicate = HasSDWA; + let AssemblerPredicate = !if(P.HasExt, HasSDWA, DisableInst); let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.SDWA, AMDGPUAsmVariants.Disable); let DecoderNamespace = "SDWA"; @@ -337,8 +337,8 @@ let Size = 8; let AsmMatchConverter = !if(!eq(P.HasModifiers,1), "cvtDPP", ""); - let SubtargetPredicate = isVI; - let AssemblerPredicate = !if(P.HasExt, isVI, DisableInst); + let SubtargetPredicate = HasDPP; + let AssemblerPredicate = !if(P.HasExt, HasDPP, DisableInst); let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.DPP, AMDGPUAsmVariants.Disable); let DecoderNamespace = "DPP";