@@ -294,40 +294,52 @@ static bool isConvertibleToVMV_V_V(const RISCVSubtarget &STI,
294
294
return false ;
295
295
}
296
296
297
- void RISCVInstrInfo::copyPhysRegVector (
298
- MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI,
299
- const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
300
- unsigned Opc, unsigned NF, RISCVII::VLMUL LMul, unsigned SubRegIdx) const {
297
+ void RISCVInstrInfo::copyPhysRegVector (MachineBasicBlock &MBB,
298
+ MachineBasicBlock::iterator MBBI,
299
+ const DebugLoc &DL, MCRegister DstReg,
300
+ MCRegister SrcReg, bool KillSrc,
301
+ unsigned Opc, unsigned NF) const {
301
302
const TargetRegisterInfo *TRI = STI.getRegisterInfo ();
302
303
304
+ RISCVII::VLMUL LMul;
305
+ unsigned SubRegIdx;
306
+ unsigned VVOpc, VIOpc;
307
+ switch (Opc) {
308
+ default :
309
+ llvm_unreachable (" Impossible LMUL for vector register copy." );
310
+ case RISCV::VMV1R_V:
311
+ LMul = RISCVII::LMUL_1;
312
+ SubRegIdx = RISCV::sub_vrm1_0;
313
+ VVOpc = RISCV::PseudoVMV_V_V_M1;
314
+ VIOpc = RISCV::PseudoVMV_V_I_M1;
315
+ break ;
316
+ case RISCV::VMV2R_V:
317
+ LMul = RISCVII::LMUL_2;
318
+ SubRegIdx = RISCV::sub_vrm2_0;
319
+ VVOpc = RISCV::PseudoVMV_V_V_M2;
320
+ VIOpc = RISCV::PseudoVMV_V_I_M2;
321
+ break ;
322
+ case RISCV::VMV4R_V:
323
+ LMul = RISCVII::LMUL_4;
324
+ SubRegIdx = RISCV::sub_vrm4_0;
325
+ VVOpc = RISCV::PseudoVMV_V_V_M4;
326
+ VIOpc = RISCV::PseudoVMV_V_I_M4;
327
+ break ;
328
+ case RISCV::VMV8R_V:
329
+ assert (NF == 1 );
330
+ LMul = RISCVII::LMUL_8;
331
+ SubRegIdx = RISCV::sub_vrm1_0; // There is no sub_vrm8_0.
332
+ VVOpc = RISCV::PseudoVMV_V_V_M8;
333
+ VIOpc = RISCV::PseudoVMV_V_I_M8;
334
+ break ;
335
+ }
336
+
303
337
bool UseVMV_V_V = false ;
304
338
bool UseVMV_V_I = false ;
305
339
MachineBasicBlock::const_iterator DefMBBI;
306
340
if (isConvertibleToVMV_V_V (STI, MBB, MBBI, DefMBBI, LMul)) {
307
341
UseVMV_V_V = true ;
308
- // We only need to handle LMUL = 1/2/4/8 here because we only define
309
- // vector register classes for LMUL = 1/2/4/8.
310
- unsigned VIOpc;
311
- switch (LMul) {
312
- default :
313
- llvm_unreachable (" Impossible LMUL for vector register copy." );
314
- case RISCVII::LMUL_1:
315
- Opc = RISCV::PseudoVMV_V_V_M1;
316
- VIOpc = RISCV::PseudoVMV_V_I_M1;
317
- break ;
318
- case RISCVII::LMUL_2:
319
- Opc = RISCV::PseudoVMV_V_V_M2;
320
- VIOpc = RISCV::PseudoVMV_V_I_M2;
321
- break ;
322
- case RISCVII::LMUL_4:
323
- Opc = RISCV::PseudoVMV_V_V_M4;
324
- VIOpc = RISCV::PseudoVMV_V_I_M4;
325
- break ;
326
- case RISCVII::LMUL_8:
327
- Opc = RISCV::PseudoVMV_V_V_M8;
328
- VIOpc = RISCV::PseudoVMV_V_I_M8;
329
- break ;
330
- }
342
+ Opc = VVOpc;
331
343
332
344
if (DefMBBI->getOpcode () == VIOpc) {
333
345
UseVMV_V_I = true ;
@@ -351,38 +363,39 @@ void RISCVInstrInfo::copyPhysRegVector(
351
363
MIB.addReg (RISCV::VL, RegState::Implicit);
352
364
MIB.addReg (RISCV::VTYPE, RegState::Implicit);
353
365
}
354
- } else {
355
- int I = 0 , End = NF, Incr = 1 ;
356
- unsigned SrcEncoding = TRI->getEncodingValue (SrcReg);
357
- unsigned DstEncoding = TRI->getEncodingValue (DstReg);
358
- unsigned LMulVal;
359
- bool Fractional;
360
- std::tie (LMulVal, Fractional) = RISCVVType::decodeVLMUL (LMul);
361
- assert (!Fractional && " It is impossible be fractional lmul here." );
362
- if (forwardCopyWillClobberTuple (DstEncoding, SrcEncoding, NF * LMulVal)) {
363
- I = NF - 1 ;
364
- End = -1 ;
365
- Incr = -1 ;
366
- }
366
+ return ;
367
+ }
367
368
368
- for (; I != End; I += Incr) {
369
- auto MIB = BuildMI (MBB, MBBI, DL, get (Opc),
370
- TRI->getSubReg (DstReg, SubRegIdx + I));
371
- if (UseVMV_V_V)
372
- MIB.addReg (TRI->getSubReg (DstReg, SubRegIdx + I), RegState::Undef);
373
- if (UseVMV_V_I)
374
- MIB = MIB.add (DefMBBI->getOperand (2 ));
375
- else
376
- MIB = MIB.addReg (TRI->getSubReg (SrcReg, SubRegIdx + I),
377
- getKillRegState (KillSrc));
378
- if (UseVMV_V_V) {
379
- const MCInstrDesc &Desc = DefMBBI->getDesc ();
380
- MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
381
- MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
382
- MIB.addImm (0 ); // tu, mu
383
- MIB.addReg (RISCV::VL, RegState::Implicit);
384
- MIB.addReg (RISCV::VTYPE, RegState::Implicit);
385
- }
369
+ int I = 0 , End = NF, Incr = 1 ;
370
+ unsigned SrcEncoding = TRI->getEncodingValue (SrcReg);
371
+ unsigned DstEncoding = TRI->getEncodingValue (DstReg);
372
+ unsigned LMulVal;
373
+ bool Fractional;
374
+ std::tie (LMulVal, Fractional) = RISCVVType::decodeVLMUL (LMul);
375
+ assert (!Fractional && " It is impossible be fractional lmul here." );
376
+ if (forwardCopyWillClobberTuple (DstEncoding, SrcEncoding, NF * LMulVal)) {
377
+ I = NF - 1 ;
378
+ End = -1 ;
379
+ Incr = -1 ;
380
+ }
381
+
382
+ for (; I != End; I += Incr) {
383
+ auto MIB =
384
+ BuildMI (MBB, MBBI, DL, get (Opc), TRI->getSubReg (DstReg, SubRegIdx + I));
385
+ if (UseVMV_V_V)
386
+ MIB.addReg (TRI->getSubReg (DstReg, SubRegIdx + I), RegState::Undef);
387
+ if (UseVMV_V_I)
388
+ MIB = MIB.add (DefMBBI->getOperand (2 ));
389
+ else
390
+ MIB = MIB.addReg (TRI->getSubReg (SrcReg, SubRegIdx + I),
391
+ getKillRegState (KillSrc));
392
+ if (UseVMV_V_V) {
393
+ const MCInstrDesc &Desc = DefMBBI->getDesc ();
394
+ MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
395
+ MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
396
+ MIB.addImm (0 ); // tu, mu
397
+ MIB.addReg (RISCV::VL, RegState::Implicit);
398
+ MIB.addReg (RISCV::VTYPE, RegState::Implicit);
386
399
}
387
400
}
388
401
}
@@ -460,92 +473,88 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
460
473
461
474
// VR->VR copies.
462
475
if (RISCV::VRRegClass.contains (DstReg, SrcReg)) {
463
- copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
464
- /* NF=*/ 1 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
476
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V);
465
477
return ;
466
478
}
467
479
468
480
if (RISCV::VRM2RegClass.contains (DstReg, SrcReg)) {
469
- copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
470
- /* NF=*/ 1 , RISCVII::LMUL_2, RISCV::sub_vrm1_0);
481
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V);
471
482
return ;
472
483
}
473
484
474
485
if (RISCV::VRM4RegClass.contains (DstReg, SrcReg)) {
475
- copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V,
476
- /* NF=*/ 1 , RISCVII::LMUL_4, RISCV::sub_vrm1_0);
486
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V);
477
487
return ;
478
488
}
479
489
480
490
if (RISCV::VRM8RegClass.contains (DstReg, SrcReg)) {
481
- copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV8R_V,
482
- /* NF=*/ 1 , RISCVII::LMUL_8, RISCV::sub_vrm1_0);
491
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV8R_V);
483
492
return ;
484
493
}
485
494
486
495
if (RISCV::VRN2M1RegClass.contains (DstReg, SrcReg)) {
487
496
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
488
- /* NF=*/ 2 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
497
+ /* NF=*/ 2 );
489
498
return ;
490
499
}
491
500
492
501
if (RISCV::VRN2M2RegClass.contains (DstReg, SrcReg)) {
493
502
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
494
- /* NF=*/ 2 , RISCVII::LMUL_2, RISCV::sub_vrm2_0 );
503
+ /* NF=*/ 2 );
495
504
return ;
496
505
}
497
506
498
507
if (RISCV::VRN2M4RegClass.contains (DstReg, SrcReg)) {
499
508
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V,
500
- /* NF=*/ 2 , RISCVII::LMUL_4, RISCV::sub_vrm4_0 );
509
+ /* NF=*/ 2 );
501
510
return ;
502
511
}
503
512
504
513
if (RISCV::VRN3M1RegClass.contains (DstReg, SrcReg)) {
505
514
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
506
- /* NF=*/ 3 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
515
+ /* NF=*/ 3 );
507
516
return ;
508
517
}
509
518
510
519
if (RISCV::VRN3M2RegClass.contains (DstReg, SrcReg)) {
511
520
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
512
- /* NF=*/ 3 , RISCVII::LMUL_2, RISCV::sub_vrm2_0 );
521
+ /* NF=*/ 3 );
513
522
return ;
514
523
}
515
524
516
525
if (RISCV::VRN4M1RegClass.contains (DstReg, SrcReg)) {
517
526
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
518
- /* NF=*/ 4 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
527
+ /* NF=*/ 4 );
519
528
return ;
520
529
}
521
530
522
531
if (RISCV::VRN4M2RegClass.contains (DstReg, SrcReg)) {
523
532
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
524
- /* NF=*/ 4 , RISCVII::LMUL_2, RISCV::sub_vrm2_0 );
533
+ /* NF=*/ 4 );
525
534
return ;
526
535
}
527
536
528
537
if (RISCV::VRN5M1RegClass.contains (DstReg, SrcReg)) {
529
538
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
530
- /* NF=*/ 5 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
539
+ /* NF=*/ 5 );
531
540
return ;
532
541
}
533
542
534
543
if (RISCV::VRN6M1RegClass.contains (DstReg, SrcReg)) {
535
544
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
536
- /* NF=*/ 6 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
545
+ /* NF=*/ 6 );
537
546
return ;
538
547
}
539
548
540
549
if (RISCV::VRN7M1RegClass.contains (DstReg, SrcReg)) {
541
550
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
542
- /* NF=*/ 7 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
551
+ /* NF=*/ 7 );
543
552
return ;
544
553
}
545
554
546
555
if (RISCV::VRN8M1RegClass.contains (DstReg, SrcReg)) {
547
556
copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
548
- /* NF=*/ 8 , RISCVII::LMUL_1, RISCV::sub_vrm1_0 );
557
+ /* NF=*/ 8 );
549
558
return ;
550
559
}
551
560
0 commit comments