@@ -314,62 +314,66 @@ bool RISCVDAGToDAGISel::SelectSLLIUW(SDValue N, SDValue &RS1, SDValue &Shamt) {
314
314
// and then we check that VC1, the mask used to fill with ones, is compatible
315
315
// with VC2, the shamt:
316
316
//
317
- // VC1 == maskTrailingOnes<uint32_t>(VC2)
317
+ // VC2 < 32
318
+ // VC1 == maskTrailingOnes<uint64_t>(VC2)
318
319
319
320
bool RISCVDAGToDAGISel::SelectSLOIW (SDValue N, SDValue &RS1, SDValue &Shamt) {
320
- if (Subtarget->getXLenVT () == MVT::i64 &&
321
- N.getOpcode () == ISD::SIGN_EXTEND_INREG &&
322
- cast<VTSDNode>(N.getOperand (1 ))->getVT () == MVT::i32 ) {
323
- if (N.getOperand (0 ).getOpcode () == ISD::OR) {
324
- SDValue Or = N.getOperand (0 );
325
- if (Or.getOperand (0 ).getOpcode () == ISD::SHL) {
326
- SDValue Shl = Or.getOperand (0 );
327
- if (isa<ConstantSDNode>(Shl.getOperand (1 )) &&
328
- isa<ConstantSDNode>(Or.getOperand (1 ))) {
329
- uint32_t VC1 = Or.getConstantOperandVal (1 );
330
- uint32_t VC2 = Shl.getConstantOperandVal (1 );
331
- if (VC1 == maskTrailingOnes<uint32_t >(VC2)) {
332
- RS1 = Shl.getOperand (0 );
333
- Shamt = CurDAG->getTargetConstant (VC2, SDLoc (N),
334
- Shl.getOperand (1 ).getValueType ());
335
- return true ;
336
- }
337
- }
338
- }
339
- }
340
- }
341
- return false ;
321
+ assert (Subtarget->is64Bit () && " SLOIW should only be matched on RV64" );
322
+ if (N.getOpcode () != ISD::SIGN_EXTEND_INREG ||
323
+ cast<VTSDNode>(N.getOperand (1 ))->getVT () != MVT::i32 )
324
+ return false ;
325
+
326
+ SDValue Or = N.getOperand (0 );
327
+
328
+ if (Or.getOpcode () != ISD::OR || !isa<ConstantSDNode>(Or.getOperand (1 )))
329
+ return false ;
330
+
331
+ SDValue Shl = Or.getOperand (0 );
332
+ if (Shl.getOpcode () != ISD::SHL || !isa<ConstantSDNode>(Shl.getOperand (1 )))
333
+ return false ;
334
+
335
+ uint64_t VC1 = Or.getConstantOperandVal (1 );
336
+ uint64_t VC2 = Shl.getConstantOperandVal (1 );
337
+
338
+ if (VC2 >= 32 || VC1 != maskTrailingOnes<uint64_t >(VC2))
339
+ return false ;
340
+
341
+ RS1 = Shl.getOperand (0 );
342
+ Shamt = CurDAG->getTargetConstant (VC2, SDLoc (N),
343
+ Shl.getOperand (1 ).getValueType ());
344
+ return true ;
342
345
}
343
346
344
347
// Check that it is a SROIW (Shift Right Ones Immediate i32 on RV64).
345
348
// We first check that it is the right node tree:
346
349
//
347
- // (OR (SHL RS1, VC2), VC1)
350
+ // (OR (SRL RS1, VC2), VC1)
348
351
//
349
352
// and then we check that VC1, the mask used to fill with ones, is compatible
350
353
// with VC2, the shamt:
351
354
//
352
- // VC1 == maskLeadingOnes<uint32_t>(VC2)
353
-
355
+ // VC2 < 32
356
+ // VC1 == maskTrailingZeros<uint64_t>(32 - VC2)
357
+ //
354
358
bool RISCVDAGToDAGISel::SelectSROIW (SDValue N, SDValue &RS1, SDValue &Shamt) {
355
- if (N. getOpcode () == ISD::OR && Subtarget-> getXLenVT () == MVT:: i64 ) {
356
- SDValue Or = N;
357
- if (Or. getOperand ( 0 ). getOpcode () == ISD::SRL) {
358
- SDValue Srl = Or. getOperand ( 0 );
359
- if (isa<ConstantSDNode>(Srl .getOperand (1 )) &&
360
- isa<ConstantSDNode>(Or .getOperand (1 ))) {
361
- uint32_t VC1 = Or. getConstantOperandVal ( 1 ) ;
362
- uint32_t VC2 = Srl. getConstantOperandVal ( 1 );
363
- if ( VC1 == maskLeadingOnes< uint32_t >(VC2)) {
364
- RS1 = Srl.getOperand ( 0 );
365
- Shamt = CurDAG-> getTargetConstant (VC2, SDLoc (N),
366
- Srl. getOperand ( 1 ). getValueType ());
367
- return true ;
368
- }
369
- }
370
- }
371
- }
372
- return false ;
359
+ assert (Subtarget-> is64Bit () && " SROIW should only be matched on RV64 " );
360
+ if (N. getOpcode () != ISD::OR || !isa<ConstantSDNode>(N. getOperand ( 1 )))
361
+ return false ;
362
+
363
+ SDValue Srl = N .getOperand (0 );
364
+ if (Srl. getOpcode () != ISD::SRL || ! isa<ConstantSDNode>(Srl .getOperand (1 )))
365
+ return false ;
366
+
367
+ uint64_t VC1 = N. getConstantOperandVal ( 1 );
368
+ uint64_t VC2 = Srl.getConstantOperandVal ( 1 );
369
+
370
+ if (VC2 >= 32 || VC1 != maskTrailingZeros< uint64_t >( 32 - VC2))
371
+ return false ;
372
+
373
+ RS1 = Srl. getOperand ( 0 );
374
+ Shamt = CurDAG-> getTargetConstant (VC2, SDLoc (N),
375
+ Srl. getOperand ( 1 ). getValueType ());
376
+ return true ;
373
377
}
374
378
375
379
// Check that it is a RORIW (i32 Right Rotate Immediate on RV64).
0 commit comments