@@ -212,9 +212,6 @@ class SPIRVInstructionSelector : public InstructionSelector {
212212 bool selectOpIsNan (Register ResVReg, const SPIRVType *ResType,
213213 MachineInstr &I) const ;
214214
215- bool selectF16ToF32 (Register ResVReg, const SPIRVType *ResType,
216- MachineInstr &I) const ;
217-
218215 template <bool Signed>
219216 bool selectDot4AddPacked (Register ResVReg, const SPIRVType *ResType,
220217 MachineInstr &I) const ;
@@ -3475,8 +3472,8 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
34753472 case Intrinsic::spv_resource_nonuniformindex: {
34763473 return selectResourceNonUniformIndex (ResVReg, ResType, I);
34773474 }
3478- case Intrinsic::spv_legacyf16tof32 : {
3479- return selectF16ToF32 (ResVReg, ResType, I);
3475+ case Intrinsic::spv_unpackhalf2x16 : {
3476+ return selectExtInst (ResVReg, ResType, I, GL::UnpackHalf2x16 );
34803477 }
34813478
34823479 default : {
@@ -3751,89 +3748,6 @@ bool SPIRVInstructionSelector::selectResourceNonUniformIndex(
37513748 return true ;
37523749}
37533750
3754- bool SPIRVInstructionSelector::selectF16ToF32 (Register ResVReg,
3755- const SPIRVType *ResType,
3756- MachineInstr &I) const {
3757- assert (I.getNumOperands () == 3 );
3758- assert (I.getOperand (0 ).isReg ());
3759- assert (I.getOperand (2 ).isReg ());
3760- Register SrcReg = I.getOperand (2 ).getReg ();
3761- const SPIRVType *SrcRegType = GR.getSPIRVTypeForVReg (SrcReg);
3762- LLT SrcType = MRI->getType (SrcReg);
3763- SPIRVType *SrcEltType = GR.getScalarOrVectorComponentType (SrcRegType);
3764- SPIRVType *ResEltType = GR.getScalarOrVectorComponentType (ResType);
3765- const TargetRegisterClass *SrcRegClass = GR.getRegClass (SrcEltType);
3766- const TargetRegisterClass *ResRegClass = GR.getRegClass (ResEltType);
3767- MachineIRBuilder MIRBuilder (I);
3768- const SPIRVType *Vec2ResType =
3769- GR.getOrCreateSPIRVVectorType (ResEltType, 2 , MIRBuilder, false );
3770- const TargetRegisterClass *Vec2RegClass = GR.getRegClass (Vec2ResType);
3771-
3772- bool Result = true ;
3773- MachineBasicBlock &BB = *I.getParent ();
3774- if (SrcType.isVector ()) {
3775- // We have a vector of uints to convert elementwise
3776- uint64_t ResultSize = GR.getScalarOrVectorComponentCount (ResType);
3777- SmallVector<Register> ComponentRegisters;
3778- for (uint64_t Idx = 0 ; Idx < ResultSize; Idx++) {
3779- Register EltReg = MRI->createVirtualRegister (SrcRegClass);
3780- Register FReg = MRI->createVirtualRegister (ResRegClass);
3781- Register Vec2Reg = MRI->createVirtualRegister (Vec2RegClass);
3782-
3783- Result =
3784- BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpCompositeExtract))
3785- .addDef (EltReg)
3786- .addUse (GR.getSPIRVTypeID (SrcEltType))
3787- .addUse (SrcReg)
3788- .addImm (Idx)
3789- .constrainAllUses (TII, TRI, RBI);
3790-
3791- Result &=
3792- BuildMI (*I.getParent (), I, I.getDebugLoc (), TII.get (SPIRV::OpExtInst))
3793- .addDef (Vec2Reg)
3794- .addUse (GR.getSPIRVTypeID (Vec2ResType))
3795- .addImm (
3796- static_cast <uint32_t >(SPIRV::InstructionSet::GLSL_std_450))
3797- .addImm (GL::UnpackHalf2x16)
3798- .addUse (EltReg)
3799- .constrainAllUses (TII, TRI, RBI);
3800-
3801- Result &=
3802- BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpCompositeExtract))
3803- .addDef (FReg)
3804- .addUse (GR.getSPIRVTypeID (ResEltType))
3805- .addUse (Vec2Reg)
3806- .addImm (0 )
3807- .constrainAllUses (TII, TRI, RBI);
3808-
3809- ComponentRegisters.emplace_back (FReg);
3810- }
3811-
3812- MachineInstrBuilder MIB =
3813- BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpCompositeConstruct))
3814- .addDef (ResVReg)
3815- .addUse (GR.getSPIRVTypeID (ResType));
3816-
3817- for (Register ComponentReg : ComponentRegisters)
3818- MIB.addUse (ComponentReg);
3819- return Result && MIB.constrainAllUses (TII, TRI, RBI);
3820-
3821- } else if (SrcType.isScalar ()) {
3822- // just a scalar uint to convert
3823- Register Vec2Reg = MRI->createVirtualRegister (Vec2RegClass);
3824- Result &= selectExtInst (Vec2Reg, Vec2ResType, I, GL::UnpackHalf2x16);
3825- Result &=
3826- BuildMI (BB, I, I.getDebugLoc (), TII.get (SPIRV::OpCompositeExtract))
3827- .addDef (ResVReg)
3828- .addUse (GR.getSPIRVTypeID (ResType))
3829- .addUse (Vec2Reg)
3830- .addImm (0 )
3831- .constrainAllUses (TII, TRI, RBI);
3832- return Result;
3833- }
3834- return false ;
3835- }
3836-
38373751void SPIRVInstructionSelector::decorateUsesAsNonUniform (
38383752 Register &NonUniformReg) const {
38393753 llvm::SmallVector<Register> WorkList = {NonUniformReg};
0 commit comments