@@ -2840,7 +2840,7 @@ bool SPIRVInstructionSelector::selectFirstBitHigh16(Register ResVReg,
28402840 Register ExtReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
28412841 bool Result =
28422842 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);
28442844}
28452845
28462846bool SPIRVInstructionSelector::selectFirstBitHigh32 (Register ResVReg,
@@ -2923,36 +2923,43 @@ bool SPIRVInstructionSelector::selectFirstBitHigh64(Register ResVReg,
29232923
29242924 // 4. check if result of each top 32 bits is == -1
29252925 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 {
29272938 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
29332947 Register BReg = MRI->createVirtualRegister (GR.getRegClass (BoolType));
29342948 Result &= selectNAryOpWithSrcs (BReg, BoolType, I, {HighReg, NegOneReg},
29352949 SPIRV::OpIEqual);
29362950
29372951 // Select low bits if true in BReg, otherwise high bits
2938- unsigned selectOp =
2939- isScalarRes ? SPIRV::OpSelectSISCond : SPIRV::OpSelectVIVCond;
29402952 Register TmpReg = MRI->createVirtualRegister (GR.getRegClass (ResType));
29412953 Result &= selectNAryOpWithSrcs (TmpReg, ResType, I, {BReg, LowReg, HighReg},
29422954 selectOp);
29432955
29442956 // Add 32 for high bits, 0 for low bits
29452957 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);
29502958 Result &=
29512959 selectNAryOpWithSrcs (ValReg, ResType, I, {BReg, Reg0, Reg32}, selectOp);
29522960
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);
29562963}
29572964
29582965bool SPIRVInstructionSelector::selectFirstBitHigh (Register ResVReg,
0 commit comments