@@ -2722,7 +2722,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh16(Register ResVReg,
27222722 Register ExtReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
27232723 bool Result =
27242724 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);
27262726}
27272727
27282728bool SPIRVInstructionSelector::selectFirstBitHigh32 (Register ResVReg,
@@ -2805,36 +2805,43 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
28052805
28062806 // 4. check if result of each top 32 bits is == -1
28072807 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 {
28092820 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
28152829 Register BReg = MRI->createVirtualRegister (GR.getRegClass (BoolType));
28162830 Result &= selectNAryOpWithSrcs (BReg, BoolType, I, {HighReg, NegOneReg},
28172831 SPIRV::OpIEqual);
28182832
28192833 // Select low bits if true in BReg, otherwise high bits
2820- unsigned selectOp =
2821- isScalarRes ? SPIRV::OpSelectSISCond : SPIRV::OpSelectVIVCond;
28222834 Register TmpReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
28232835 Result &= selectNAryOpWithSrcs (TmpReg, ResType, I, {BReg, LowReg, HighReg},
28242836 selectOp);
28252837
28262838 // Add 32 for high bits, 0 for low bits
28272839 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);
28322840 Result &=
28332841 selectNAryOpWithSrcs (ValReg, ResType, I, {BReg, Reg0, Reg32}, selectOp);
28342842
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);
28382845}
28392846
28402847bool SPIRVInstructionSelector::selectFirstBitHigh (Register ResVReg,
0 commit comments