@@ -2590,9 +2590,9 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
2590
2590
case Intrinsic::spv_sign:
2591
2591
return selectSign (ResVReg, ResType, I);
2592
2592
case Intrinsic::spv_firstbituhigh: // There is no CL equivalent of FindUMsb
2593
- return selectFirstBitHigh (ResVReg, ResType, I, false );
2593
+ return selectFirstBitHigh (ResVReg, ResType, I, /* IsSigned= */ false );
2594
2594
case Intrinsic::spv_firstbitshigh: // There is no CL equivalent of FindSMsb
2595
- return selectFirstBitHigh (ResVReg, ResType, I, true );
2595
+ return selectFirstBitHigh (ResVReg, ResType, I, /* IsSigned= */ true );
2596
2596
case Intrinsic::spv_group_memory_barrier_with_group_sync: {
2597
2597
Register MemSemReg =
2598
2598
buildI32Constant (SPIRV::MemorySemantics::SequentiallyConsistent, I);
@@ -2771,32 +2771,30 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2771
2771
// count should be one.
2772
2772
2773
2773
Register HighReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2774
- auto MIB =
2775
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2776
- TII.get (SPIRV::OpVectorShuffle))
2777
- .addDef (HighReg)
2778
- .addUse (GR.getSPIRVTypeID (VResType))
2779
- .addUse (FBHReg)
2780
- .addUse (
2781
- FBHReg); // this vector will not be selected from; could be empty
2782
- unsigned i;
2783
- for (i = 0 ; i < count * 2 ; i += 2 ) {
2784
- MIB.addImm (i);
2774
+ auto MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2775
+ TII.get (SPIRV::OpVectorShuffle))
2776
+ .addDef (HighReg)
2777
+ .addUse (GR.getSPIRVTypeID (VResType))
2778
+ .addUse (FBHReg)
2779
+ .addUse (FBHReg);
2780
+ // ^^ this vector will not be selected from; could be empty
2781
+ unsigned j;
2782
+ for (j = 0 ; j < count * 2 ; j += 2 ) {
2783
+ MIB.addImm (j);
2785
2784
}
2786
2785
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2787
2786
2788
2787
// get low bits
2789
2788
Register LowReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2790
- MIB =
2791
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2792
- TII.get (SPIRV::OpVectorShuffle))
2793
- .addDef (LowReg)
2794
- .addUse (GR.getSPIRVTypeID (VResType))
2795
- .addUse (FBHReg)
2796
- .addUse (
2797
- FBHReg); // this vector will not be selected from; could be empty
2798
- for (i = 1 ; i < count * 2 ; i += 2 ) {
2799
- MIB.addImm (i);
2789
+ MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2790
+ TII.get (SPIRV::OpVectorShuffle))
2791
+ .addDef (LowReg)
2792
+ .addUse (GR.getSPIRVTypeID (VResType))
2793
+ .addUse (FBHReg)
2794
+ .addUse (FBHReg);
2795
+ // ^^ this vector will not be selected from; could be empty
2796
+ for (j = 1 ; j < count * 2 ; j += 2 ) {
2797
+ MIB.addImm (j);
2800
2798
}
2801
2799
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2802
2800
@@ -2825,6 +2823,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2825
2823
Register AddReg = ResVReg;
2826
2824
if (isScalarRes)
2827
2825
AddReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2826
+
2828
2827
Result &= selectNAryOpWithSrcs (AddReg, VResType, I, {ValReg, TmpReg},
2829
2828
SPIRV::OpIAddV);
2830
2829
@@ -2842,17 +2841,21 @@ bool SPIRVInstructionSelector::selectFirstBitHigh(Register ResVReg,
2842
2841
const SPIRVType *ResType,
2843
2842
MachineInstr &I,
2844
2843
bool IsSigned) const {
2845
- // FindUMsb intrinsic only supports 32 bit integers
2844
+ // FindUMsb and FindSMsb intrinsics only support 32 bit integers
2846
2845
Register OpReg = I.getOperand (2 ).getReg ();
2847
2846
SPIRVType *OpType = GR.getSPIRVTypeForVReg (OpReg);
2848
- unsigned bitWidth = GR.getScalarOrVectorBitWidth (OpType);
2849
2847
2850
- if (bitWidth == 16 )
2848
+ switch (GR.getScalarOrVectorBitWidth (OpType)) {
2849
+ case 16 :
2851
2850
return selectFirstBitHigh16 (ResVReg, ResType, I, IsSigned);
2852
- else if (bitWidth == 32 )
2851
+ case 32 :
2853
2852
return selectFirstBitHigh32 (ResVReg, ResType, I, OpReg, IsSigned);
2854
- else // 64 bit
2853
+ case 64 :
2855
2854
return selectFirstBitHigh64 (ResVReg, ResType, I, IsSigned);
2855
+ default :
2856
+ report_fatal_error (
2857
+ " spv_firstbituhigh and spv_firstbitshigh only support 16,32,64 bits." );
2858
+ }
2856
2859
}
2857
2860
2858
2861
bool SPIRVInstructionSelector::selectAllocaArray (Register ResVReg,
0 commit comments