@@ -2722,7 +2722,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh16(Register ResVReg,
2722
2722
Register ExtReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2723
2723
bool Result =
2724
2724
selectUnOpWithSrc (ExtReg, ResType, I, I.getOperand (2 ).getReg (), Opcode);
2725
- return Result & selectFirstBitHigh32 (ResVReg, ResType, I, ExtReg, IsSigned);
2725
+ return Result && selectFirstBitHigh32 (ResVReg, ResType, I, ExtReg, IsSigned);
2726
2726
}
2727
2727
2728
2728
bool SPIRVInstructionSelector::selectFirstBitHigh32 (Register ResVReg,
@@ -2805,36 +2805,43 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
2805
2805
2806
2806
// 4. check if result of each top 32 bits is == -1
2807
2807
SPIRVType *BoolType = GR.getOrCreateSPIRVBoolType (I, TII);
2808
- if (!isScalarRes)
2808
+ Register NegOneReg;
2809
+ Register Reg0;
2810
+ Register Reg32;
2811
+ unsigned selectOp;
2812
+ unsigned addOp;
2813
+ if (isScalarRes) {
2814
+ NegOneReg = GR.getOrCreateConstInt (-1 , I, ResType, TII, ZeroAsNull);
2815
+ Reg0 = GR.getOrCreateConstInt (0 , I, ResType, TII, ZeroAsNull);
2816
+ Reg32 = GR.getOrCreateConstInt (32 , I, ResType, TII, ZeroAsNull);
2817
+ selectOp = SPIRV::OpSelectSISCond;
2818
+ addOp = SPIRV::OpIAddS;
2819
+ } else {
2809
2820
BoolType = GR.getOrCreateSPIRVVectorType (BoolType, count, MIRBuilder);
2810
-
2811
- // check if the high bits are == -1;
2812
- Register NegOneReg =
2813
- GR.getOrCreateConstScalarOrVector (-1 , I, ResType, TII, ZeroAsNull);
2814
- // true if -1
2821
+ NegOneReg = GR.getOrCreateConstVector (-1 , I, ResType, TII, ZeroAsNull);
2822
+ Reg0 = GR.getOrCreateConstVector (0 , I, ResType, TII, ZeroAsNull);
2823
+ Reg32 = GR.getOrCreateConstVector (32 , I, ResType, TII, ZeroAsNull);
2824
+ selectOp = SPIRV::OpSelectVIVCond;
2825
+ addOp = SPIRV::OpIAddV;
2826
+ }
2827
+
2828
+ // check if the high bits are == -1; true if -1
2815
2829
Register BReg = MRI->createVirtualRegister (GR.getRegClass (BoolType));
2816
2830
Result &= selectNAryOpWithSrcs (BReg, BoolType, I, {HighReg, NegOneReg},
2817
2831
SPIRV::OpIEqual);
2818
2832
2819
2833
// Select low bits if true in BReg, otherwise high bits
2820
- unsigned selectOp =
2821
- isScalarRes ? SPIRV::OpSelectSISCond : SPIRV::OpSelectVIVCond;
2822
2834
Register TmpReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2823
2835
Result &= selectNAryOpWithSrcs (TmpReg, ResType, I, {BReg, LowReg, HighReg},
2824
2836
selectOp);
2825
2837
2826
2838
// Add 32 for high bits, 0 for low bits
2827
2839
Register ValReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
2828
- Register Reg0 =
2829
- GR.getOrCreateConstScalarOrVector (0 , I, ResType, TII, ZeroAsNull);
2830
- Register Reg32 =
2831
- GR.getOrCreateConstScalarOrVector (32 , I, ResType, TII, ZeroAsNull);
2832
2840
Result &=
2833
2841
selectNAryOpWithSrcs (ValReg, ResType, I, {BReg, Reg0, Reg32}, selectOp);
2834
2842
2835
- return Result &=
2836
- selectNAryOpWithSrcs (ResVReg, ResType, I, {ValReg, TmpReg},
2837
- isScalarRes ? SPIRV::OpIAddS : SPIRV::OpIAddV);
2843
+ return Result &&
2844
+ selectNAryOpWithSrcs (ResVReg, ResType, I, {ValReg, TmpReg}, addOp);
2838
2845
}
2839
2846
2840
2847
bool SPIRVInstructionSelector::selectFirstBitHigh (Register ResVReg,
0 commit comments