@@ -2840,7 +2840,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh16(Register ResVReg,
2840
2840
Register ExtReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2841
2841
bool Result =
2842
2842
selectUnOpWithSrc (ExtReg, ResType, I, I.getOperand (2 ).getReg (), Opcode);
2843
- return Result & selectFirstBitHigh32 (ResVReg, ResType, I, ExtReg, IsSigned);
2843
+ return Result && selectFirstBitHigh32 (ResVReg, ResType, I, ExtReg, IsSigned);
2844
2844
}
2845
2845
2846
2846
bool SPIRVInstructionSelector::selectFirstBitHigh32 (Register ResVReg,
@@ -2923,36 +2923,43 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2923
2923
2924
2924
// 4. check if result of each top 32 bits is == -1
2925
2925
SPIRVType *BoolType = GR.getOrCreateSPIRVBoolType (I, TII);
2926
- if (!isScalarRes)
2926
+ Register NegOneReg;
2927
+ Register Reg0;
2928
+ Register Reg32;
2929
+ unsigned selectOp;
2930
+ unsigned addOp;
2931
+ if (isScalarRes) {
2932
+ NegOneReg = GR.getOrCreateConstInt (-1 , I, ResType, TII, ZeroAsNull);
2933
+ Reg0 = GR.getOrCreateConstInt (0 , I, ResType, TII, ZeroAsNull);
2934
+ Reg32 = GR.getOrCreateConstInt (32 , I, ResType, TII, ZeroAsNull);
2935
+ selectOp = SPIRV::OpSelectSISCond;
2936
+ addOp = SPIRV::OpIAddS;
2937
+ } else {
2927
2938
BoolType = GR.getOrCreateSPIRVVectorType (BoolType, count, MIRBuilder);
2928
-
2929
- // check if the high bits are == -1;
2930
- Register NegOneReg =
2931
- GR.getOrCreateConstScalarOrVector (-1 , I, ResType, TII, ZeroAsNull);
2932
- // true if -1
2939
+ NegOneReg = GR.getOrCreateConstVector (-1 , I, ResType, TII, ZeroAsNull);
2940
+ Reg0 = GR.getOrCreateConstVector (0 , I, ResType, TII, ZeroAsNull);
2941
+ Reg32 = GR.getOrCreateConstVector (32 , I, ResType, TII, ZeroAsNull);
2942
+ selectOp = SPIRV::OpSelectVIVCond;
2943
+ addOp = SPIRV::OpIAddV;
2944
+ }
2945
+
2946
+ // check if the high bits are == -1; true if -1
2933
2947
Register BReg = MRI->createVirtualRegister (GR.getRegClass (BoolType));
2934
2948
Result &= selectNAryOpWithSrcs (BReg, BoolType, I, {HighReg, NegOneReg},
2935
2949
SPIRV::OpIEqual);
2936
2950
2937
2951
// Select low bits if true in BReg, otherwise high bits
2938
- unsigned selectOp =
2939
- isScalarRes ? SPIRV::OpSelectSISCond : SPIRV::OpSelectVIVCond;
2940
2952
Register TmpReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2941
2953
Result &= selectNAryOpWithSrcs (TmpReg, ResType, I, {BReg, LowReg, HighReg},
2942
2954
selectOp);
2943
2955
2944
2956
// Add 32 for high bits, 0 for low bits
2945
2957
Register ValReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2946
- Register Reg0 =
2947
- GR.getOrCreateConstScalarOrVector (0 , I, ResType, TII, ZeroAsNull);
2948
- Register Reg32 =
2949
- GR.getOrCreateConstScalarOrVector (32 , I, ResType, TII, ZeroAsNull);
2950
2958
Result &=
2951
2959
selectNAryOpWithSrcs (ValReg, ResType, I, {BReg, Reg0, Reg32}, selectOp);
2952
2960
2953
- return Result &=
2954
- selectNAryOpWithSrcs (ResVReg, ResType, I, {ValReg, TmpReg},
2955
- isScalarRes ? SPIRV::OpIAddS : SPIRV::OpIAddV);
2961
+ return Result &&
2962
+ selectNAryOpWithSrcs (ResVReg, ResType, I, {ValReg, TmpReg}, addOp);
2956
2963
}
2957
2964
2958
2965
bool SPIRVInstructionSelector::selectFirstBitHigh (Register ResVReg,
0 commit comments