@@ -93,24 +93,24 @@ class SPIRVInstructionSelector : public InstructionSelector {
93
93
MachineInstr &I) const ;
94
94
95
95
bool selectFirstBitHigh (Register ResVReg, const SPIRVType *ResType,
96
- MachineInstr &I, bool IsSigned) const ;
96
+ MachineInstr &I, bool IsSigned) const ;
97
97
98
98
bool selectFirstBitHigh16 (Register ResVReg, const SPIRVType *ResType,
99
- MachineInstr &I, bool IsSigned) const ;
99
+ MachineInstr &I, bool IsSigned) const ;
100
100
101
101
bool selectFirstBitHigh32 (Register ResVReg, const SPIRVType *ResType,
102
- MachineInstr &I, Register SrcReg,
103
- bool IsSigned) const ;
102
+ MachineInstr &I, Register SrcReg,
103
+ bool IsSigned) const ;
104
104
105
105
bool selectFirstBitHigh64 (Register ResVReg, const SPIRVType *ResType,
106
- MachineInstr &I, bool IsSigned) const ;
106
+ MachineInstr &I, bool IsSigned) const ;
107
107
108
108
bool selectGlobalValue (Register ResVReg, MachineInstr &I,
109
109
const MachineInstr *Init = nullptr ) const ;
110
110
111
111
bool selectNAryOpWithSrcs (Register ResVReg, const SPIRVType *ResType,
112
- MachineInstr &I, std::vector<Register> SrcRegs,
113
- unsigned Opcode) const ;
112
+ MachineInstr &I, std::vector<Register> SrcRegs,
113
+ unsigned Opcode) const ;
114
114
115
115
bool selectUnOpWithSrc (Register ResVReg, const SPIRVType *ResType,
116
116
MachineInstr &I, Register SrcReg,
@@ -844,14 +844,14 @@ bool SPIRVInstructionSelector::selectExtInst(Register ResVReg,
844
844
}
845
845
846
846
bool SPIRVInstructionSelector::selectNAryOpWithSrcs (Register ResVReg,
847
- const SPIRVType *ResType,
848
- MachineInstr &I,
849
- std::vector<Register> Srcs,
850
- unsigned Opcode) const {
847
+ const SPIRVType *ResType,
848
+ MachineInstr &I,
849
+ std::vector<Register> Srcs,
850
+ unsigned Opcode) const {
851
851
auto MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (), TII.get (Opcode))
852
- .addDef (ResVReg)
853
- .addUse (GR.getSPIRVTypeID (ResType));
854
- for (Register SReg : Srcs) {
852
+ .addDef (ResVReg)
853
+ .addUse (GR.getSPIRVTypeID (ResType));
854
+ for (Register SReg : Srcs) {
855
855
MIB.addUse (SReg);
856
856
}
857
857
return MIB.constrainAllUses (TII, TRI, RBI);
@@ -2832,46 +2832,46 @@ Register SPIRVInstructionSelector::buildPointerToResource(
2832
2832
}
2833
2833
2834
2834
bool SPIRVInstructionSelector::selectFirstBitHigh16 (Register ResVReg,
2835
- const SPIRVType *ResType,
2836
- MachineInstr &I,
2837
- bool IsSigned) const {
2835
+ const SPIRVType *ResType,
2836
+ MachineInstr &I,
2837
+ bool IsSigned) const {
2838
2838
unsigned Opcode = IsSigned ? SPIRV::OpSConvert : SPIRV::OpUConvert;
2839
2839
// zero or sign extend
2840
2840
Register ExtReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2841
- bool Result = selectUnOpWithSrc (ExtReg, ResType, I, I. getOperand ( 2 ). getReg (),
2842
- Opcode);
2841
+ bool Result =
2842
+ selectUnOpWithSrc (ExtReg, ResType, I, I. getOperand ( 2 ). getReg (), Opcode);
2843
2843
return Result & selectFirstBitHigh32 (ResVReg, ResType, I, ExtReg, IsSigned);
2844
2844
}
2845
2845
2846
2846
bool SPIRVInstructionSelector::selectFirstBitHigh32 (Register ResVReg,
2847
- const SPIRVType *ResType,
2848
- MachineInstr &I,
2849
- Register SrcReg,
2850
- bool IsSigned) const {
2847
+ const SPIRVType *ResType,
2848
+ MachineInstr &I,
2849
+ Register SrcReg,
2850
+ bool IsSigned) const {
2851
2851
unsigned Opcode = IsSigned ? GL::FindSMsb : GL::FindUMsb;
2852
2852
return BuildMI (*I.getParent (), I, I.getDebugLoc (), TII.get (SPIRV::OpExtInst))
2853
- .addDef (ResVReg)
2854
- .addUse (GR.getSPIRVTypeID (ResType))
2855
- .addImm (static_cast <uint32_t >(SPIRV::InstructionSet::GLSL_std_450))
2856
- .addImm (Opcode)
2857
- .addUse (SrcReg)
2858
- .constrainAllUses (TII, TRI, RBI);
2853
+ .addDef (ResVReg)
2854
+ .addUse (GR.getSPIRVTypeID (ResType))
2855
+ .addImm (static_cast <uint32_t >(SPIRV::InstructionSet::GLSL_std_450))
2856
+ .addImm (Opcode)
2857
+ .addUse (SrcReg)
2858
+ .constrainAllUses (TII, TRI, RBI);
2859
2859
}
2860
2860
2861
2861
bool SPIRVInstructionSelector::selectFirstBitHigh64 (Register ResVReg,
2862
- const SPIRVType *ResType,
2863
- MachineInstr &I,
2864
- bool IsSigned) const {
2862
+ const SPIRVType *ResType,
2863
+ MachineInstr &I,
2864
+ bool IsSigned) const {
2865
2865
Register OpReg = I.getOperand (2 ).getReg ();
2866
2866
// 1. split our int64 into 2 pieces using a bitcast
2867
2867
unsigned count = GR.getScalarOrVectorComponentCount (ResType);
2868
2868
SPIRVType *baseType = GR.retrieveScalarOrVectorIntType (ResType);
2869
2869
MachineIRBuilder MIRBuilder (I);
2870
- SPIRVType *postCastT = GR. getOrCreateSPIRVVectorType (baseType, 2 * count,
2871
- MIRBuilder);
2870
+ SPIRVType *postCastT =
2871
+ GR. getOrCreateSPIRVVectorType (baseType, 2 * count, MIRBuilder);
2872
2872
Register bitcastReg = MRI->createVirtualRegister (GR.getRegClass (postCastT));
2873
- bool Result = selectUnOpWithSrc (bitcastReg, postCastT, I, OpReg,
2874
- SPIRV::OpBitcast);
2873
+ bool Result =
2874
+ selectUnOpWithSrc (bitcastReg, postCastT, I, OpReg, SPIRV::OpBitcast);
2875
2875
2876
2876
// 2. call firstbithigh
2877
2877
Register FBHReg = MRI->createVirtualRegister (GR.getRegClass (postCastT));
@@ -2889,76 +2889,77 @@ 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 = 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); // this vector will not be selected from; could be empty
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
2898
2900
unsigned i;
2899
- for (i = 0 ; i < count* 2 ; i += 2 ) {
2901
+ for (i = 0 ; i < count * 2 ; i += 2 ) {
2900
2902
MIB.addImm (i);
2901
2903
}
2902
2904
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2903
2905
2904
2906
// get low bits
2905
2907
Register LowReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2906
- MIB = BuildMI (*I.getParent (), I, I.getDebugLoc (),
2907
- TII.get (SPIRV::OpVectorShuffle))
2908
- .addDef (LowReg)
2909
- .addUse (GR.getSPIRVTypeID (VResType))
2910
- .addUse (FBHReg)
2911
- .addUse (FBHReg); // this vector will not be selected from; could be empty
2912
- for (i = 1 ; i < count*2 ; i += 2 ) {
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 ) {
2913
2917
MIB.addImm (i);
2914
2918
}
2915
2919
Result &= MIB.constrainAllUses (TII, TRI, RBI);
2916
2920
2917
- SPIRVType *BoolType =
2918
- GR.getOrCreateSPIRVVectorType (GR.getOrCreateSPIRVBoolType (I, TII),
2919
- count,
2920
- MIRBuilder);
2921
+ SPIRVType *BoolType = GR.getOrCreateSPIRVVectorType (
2922
+ GR.getOrCreateSPIRVBoolType (I, TII), count, MIRBuilder);
2921
2923
// check if the high bits are == -1;
2922
2924
Register NegOneReg = GR.getOrCreateConstVector (-1 , I, VResType, TII);
2923
2925
// true if -1
2924
2926
Register BReg = MRI->createVirtualRegister (GR.getRegClass (BoolType));
2925
2927
Result &= selectNAryOpWithSrcs (BReg, BoolType, I, {HighReg, NegOneReg},
2926
- SPIRV::OpIEqual);
2928
+ SPIRV::OpIEqual);
2927
2929
2928
2930
// Select low bits if true in BReg, otherwise high bits
2929
2931
Register TmpReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2930
2932
Result &= selectNAryOpWithSrcs (TmpReg, VResType, I, {BReg, LowReg, HighReg},
2931
- SPIRV::OpSelectVIVCond);
2933
+ SPIRV::OpSelectVIVCond);
2932
2934
2933
2935
// Add 32 for high bits, 0 for low bits
2934
2936
Register ValReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2935
2937
bool ZeroAsNull = STI.isOpenCLEnv ();
2936
2938
Register Reg32 = GR.getOrCreateConstVector (32 , I, VResType, TII, ZeroAsNull);
2937
2939
Register Reg0 = GR.getOrCreateConstVector (0 , I, VResType, TII, ZeroAsNull);
2938
2940
Result &= selectNAryOpWithSrcs (ValReg, VResType, I, {BReg, Reg0, Reg32},
2939
- SPIRV::OpSelectVIVCond);
2941
+ SPIRV::OpSelectVIVCond);
2940
2942
2941
2943
Register AddReg = ResVReg;
2942
- if (isScalarRes)
2944
+ if (isScalarRes)
2943
2945
AddReg = MRI->createVirtualRegister (GR.getRegClass (VResType));
2944
2946
Result &= selectNAryOpWithSrcs (AddReg, VResType, I, {ValReg, TmpReg},
2945
- SPIRV::OpIAddV);
2947
+ SPIRV::OpIAddV);
2946
2948
2947
2949
// convert result back to scalar if necessary
2948
2950
if (!isScalarRes)
2949
2951
return Result;
2950
2952
else
2951
- return Result & selectNAryOpWithSrcs (ResVReg, ResType, I,
2952
- {AddReg,
2953
- GR.getOrCreateConstInt (0 , I, ResType,
2954
- TII)},
2955
- SPIRV::OpVectorExtractDynamic);
2953
+ return Result & selectNAryOpWithSrcs (
2954
+ ResVReg, ResType, I,
2955
+ {AddReg, GR.getOrCreateConstInt (0 , I, ResType, TII)},
2956
+ SPIRV::OpVectorExtractDynamic);
2956
2957
}
2957
2958
2958
2959
bool SPIRVInstructionSelector::selectFirstBitHigh (Register ResVReg,
2959
- const SPIRVType *ResType,
2960
- MachineInstr &I,
2961
- bool IsSigned) const {
2960
+ const SPIRVType *ResType,
2961
+ MachineInstr &I,
2962
+ bool IsSigned) const {
2962
2963
// FindUMsb intrinsic only supports 32 bit integers
2963
2964
Register OpReg = I.getOperand (2 ).getReg ();
2964
2965
SPIRVType *OpType = GR.getSPIRVTypeForVReg (OpReg);
0 commit comments