@@ -2589,9 +2589,9 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
2589
2589
case Intrinsic::spv_sign:
2590
2590
return selectSign (ResVReg, ResType , I);
2591
2591
case Intrinsic::spv_firstbituhigh: // There is no CL equivalent of FindUMsb
2592
- return selectFirstBitHigh (ResVReg, ResType , I, false );
2592
+ return selectFirstBitHigh (ResVReg, ResType , I, /* IsSigned= */ false );
2593
2593
case Intrinsic::spv_firstbitshigh: // There is no CL equivalent of FindSMsb
2594
- return selectFirstBitHigh (ResVReg, ResType , I, true );
2594
+ return selectFirstBitHigh (ResVReg, ResType , I, /* IsSigned= */ true );
2595
2595
case Intrinsic::spv_lifetime_start:
2596
2596
case Intrinsic::spv_lifetime_end: {
2597
2597
unsigned Op = IID == Intrinsic::spv_lifetime_start ? SPIRV::OpLifetimeStart
@@ -2729,32 +2729,30 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2729
2729
// count should be one.
2730
2730
2731
2731
Register HighReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2732
- auto MIB =
2733
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2734
- TII.get (SPIRV::OpVectorShuffle))
2735
- .addDef (HighReg)
2736
- .addUse (GR.getSPIRVTypeID (VResType))
2737
- .addUse (FBHReg)
2738
- .addUse (
2739
- FBHReg); // this vector will not be selected from; could be empty
2740
- unsigned i;
2741
- for (i = 0 ; i < count * 2 ; i += 2 ) {
2742
- MIB.addImm (i);
2732
+ auto MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2733
+ TII.get (SPIRV::OpVectorShuffle))
2734
+ .addDef (HighReg)
2735
+ .addUse (GR.getSPIRVTypeID (VResType))
2736
+ .addUse (FBHReg)
2737
+ .addUse (FBHReg);
2738
+ // ^^ this vector will not be selected from; could be empty
2739
+ unsigned j;
2740
+ for (j = 0 ; j < count * 2 ; j += 2 ) {
2741
+ MIB.addImm (j);
2743
2742
}
2744
2743
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2745
2744
2746
2745
// get low bits
2747
2746
Register LowReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2748
- MIB =
2749
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2750
- TII.get (SPIRV::OpVectorShuffle))
2751
- .addDef (LowReg)
2752
- .addUse (GR.getSPIRVTypeID (VResType))
2753
- .addUse (FBHReg)
2754
- .addUse (
2755
- FBHReg); // this vector will not be selected from; could be empty
2756
- for (i = 1 ; i < count * 2 ; i += 2 ) {
2757
- MIB.addImm (i);
2747
+ MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2748
+ TII.get (SPIRV::OpVectorShuffle))
2749
+ .addDef (LowReg)
2750
+ .addUse (GR.getSPIRVTypeID (VResType))
2751
+ .addUse (FBHReg)
2752
+ .addUse (FBHReg);
2753
+ // ^^ this vector will not be selected from; could be empty
2754
+ for (j = 1 ; j < count * 2 ; j += 2 ) {
2755
+ MIB.addImm (j);
2758
2756
}
2759
2757
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2760
2758
@@ -2783,6 +2781,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2783
2781
Register AddReg = ResVReg;
2784
2782
if (isScalarRes)
2785
2783
AddReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2784
+
2786
2785
Result &= selectNAryOpWithSrcs (AddReg, VResType, I, {ValReg, TmpReg},
2787
2786
SPIRV::OpIAddV);
2788
2787
@@ -2800,17 +2799,21 @@ bool SPIRVInstructionSelector::selectFirstBitHigh(Register ResVReg,
2800
2799
const SPIRVType *ResType ,
2801
2800
MachineInstr &I,
2802
2801
bool IsSigned) const {
2803
- // FindUMsb intrinsic only supports 32 bit integers
2802
+ // FindUMsb and FindSMsb intrinsics only support 32 bit integers
2804
2803
Register OpReg = I.getOperand (2 ).getReg ();
2805
2804
SPIRVType *OpType = GR.getSPIRVTypeForVReg (OpReg);
2806
- unsigned bitWidth = GR.getScalarOrVectorBitWidth (OpType);
2807
2805
2808
- if (bitWidth == 16 )
2806
+ switch (GR.getScalarOrVectorBitWidth (OpType)) {
2807
+ case 16 :
2809
2808
return selectFirstBitHigh16 (ResVReg, ResType , I, IsSigned);
2810
- else if (bitWidth == 32 )
2809
+ case 32 :
2811
2810
return selectFirstBitHigh32 (ResVReg, ResType , I, OpReg, IsSigned);
2812
- else // 64 bit
2811
+ case 64 :
2813
2812
return selectFirstBitHigh64 (ResVReg, ResType , I, IsSigned);
2813
+ default :
2814
+ report_fatal_error (
2815
+ " spv_firstbituhigh and spv_firstbitshigh only support 16,32,64 bits." );
2816
+ }
2814
2817
}
2815
2818
2816
2819
bool SPIRVInstructionSelector::selectAllocaArray (Register ResVReg,
0 commit comments