@@ -2708,9 +2708,9 @@ bool SPIRVInstructionSelector::selectIntrinsic(Register ResVReg,
2708
2708
case Intrinsic::spv_sign:
2709
2709
return selectSign (ResVReg, ResType, I);
2710
2710
case Intrinsic::spv_firstbituhigh: // There is no CL equivalent of FindUMsb
2711
- return selectFirstBitHigh (ResVReg, ResType, I, false );
2711
+ return selectFirstBitHigh (ResVReg, ResType, I, /* IsSigned= */ false );
2712
2712
case Intrinsic::spv_firstbitshigh: // There is no CL equivalent of FindSMsb
2713
- return selectFirstBitHigh (ResVReg, ResType, I, true );
2713
+ return selectFirstBitHigh (ResVReg, ResType, I, /* IsSigned= */ true );
2714
2714
case Intrinsic::spv_group_memory_barrier_with_group_sync: {
2715
2715
Register MemSemReg =
2716
2716
buildI32Constant (SPIRV::MemorySemantics::SequentiallyConsistent, I);
@@ -2889,32 +2889,30 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2889
2889
// count should be one.
2890
2890
2891
2891
Register HighReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2892
- auto MIB =
2893
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2894
- TII.get (SPIRV::OpVectorShuffle))
2895
- .addDef (HighReg)
2896
- .addUse (GR.getSPIRVTypeID (VResType))
2897
- .addUse (FBHReg)
2898
- .addUse (
2899
- FBHReg); // this vector will not be selected from; could be empty
2900
- unsigned i;
2901
- for (i = 0 ; i < count * 2 ; i += 2 ) {
2902
- MIB.addImm (i);
2892
+ auto MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2893
+ TII.get (SPIRV::OpVectorShuffle))
2894
+ .addDef (HighReg)
2895
+ .addUse (GR.getSPIRVTypeID (VResType))
2896
+ .addUse (FBHReg)
2897
+ .addUse (FBHReg);
2898
+ // ^^ this vector will not be selected from; could be empty
2899
+ unsigned j;
2900
+ for (j = 0 ; j < count * 2 ; j += 2 ) {
2901
+ MIB.addImm (j);
2903
2902
}
2904
2903
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2905
2904
2906
2905
// get low bits
2907
2906
Register LowReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2908
- MIB =
2909
- BuildMI (*I.getParent (), I, I.getDebugLoc (),
2910
- TII.get (SPIRV::OpVectorShuffle))
2911
- .addDef (LowReg)
2912
- .addUse (GR.getSPIRVTypeID (VResType))
2913
- .addUse (FBHReg)
2914
- .addUse (
2915
- FBHReg); // this vector will not be selected from; could be empty
2916
- for (i = 1 ; i < count * 2 ; i += 2 ) {
2917
- MIB.addImm (i);
2907
+ MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2908
+ TII.get (SPIRV::OpVectorShuffle))
2909
+ .addDef (LowReg)
2910
+ .addUse (GR.getSPIRVTypeID (VResType))
2911
+ .addUse (FBHReg)
2912
+ .addUse (FBHReg);
2913
+ // ^^ this vector will not be selected from; could be empty
2914
+ for (j = 1 ; j < count * 2 ; j += 2 ) {
2915
+ MIB.addImm (j);
2918
2916
}
2919
2917
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2920
2918
@@ -2943,6 +2941,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2943
2941
Register AddReg = ResVReg;
2944
2942
if (isScalarRes)
2945
2943
AddReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2944
+
2946
2945
Result &= selectNAryOpWithSrcs (AddReg, VResType, I, {ValReg, TmpReg},
2947
2946
SPIRV::OpIAddV);
2948
2947
@@ -2960,17 +2959,21 @@ bool SPIRVInstructionSelector::selectFirstBitHigh(Register ResVReg,
2960
2959
const SPIRVType *ResType,
2961
2960
MachineInstr &I,
2962
2961
bool IsSigned) const {
2963
- // FindUMsb intrinsic only supports 32 bit integers
2962
+ // FindUMsb and FindSMsb intrinsics only support 32 bit integers
2964
2963
Register OpReg = I.getOperand (2 ).getReg ();
2965
2964
SPIRVType *OpType = GR.getSPIRVTypeForVReg (OpReg);
2966
- unsigned bitWidth = GR.getScalarOrVectorBitWidth (OpType);
2967
2965
2968
- if (bitWidth == 16 )
2966
+ switch (GR.getScalarOrVectorBitWidth (OpType)) {
2967
+ case 16 :
2969
2968
return selectFirstBitHigh16 (ResVReg, ResType, I, IsSigned);
2970
- else if (bitWidth == 32 )
2969
+ case 32 :
2971
2970
return selectFirstBitHigh32 (ResVReg, ResType, I, OpReg, IsSigned);
2972
- else // 64 bit
2971
+ case 64 :
2973
2972
return selectFirstBitHigh64 (ResVReg, ResType, I, IsSigned);
2973
+ default :
2974
+ report_fatal_error (
2975
+ " spv_firstbituhigh and spv_firstbitshigh only support 16,32,64 bits." );
2976
+ }
2974
2977
}
2975
2978
2976
2979
bool SPIRVInstructionSelector::selectAllocaArray (Register ResVReg,
0 commit comments