@@ -330,13 +330,8 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
330
330
return ;
331
331
}
332
332
333
- // FPR->FPR copies and VR->VR copies.
334
- unsigned Opc;
335
- bool IsScalableVector = true ;
336
- unsigned NF = 1 ;
337
- RISCVII::VLMUL LMul = RISCVII::LMUL_1;
338
- unsigned SubRegIdx = RISCV::sub_vrm1_0;
339
333
if (RISCV::FPR16RegClass.contains (DstReg, SrcReg)) {
334
+ unsigned Opc;
340
335
if (STI.hasStdExtZfh ()) {
341
336
Opc = RISCV::FSGNJ_H;
342
337
} else {
@@ -350,14 +345,32 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
350
345
&RISCV::FPR32RegClass);
351
346
Opc = RISCV::FSGNJ_S;
352
347
}
353
- IsScalableVector = false ;
354
- } else if (RISCV::FPR32RegClass.contains (DstReg, SrcReg)) {
355
- Opc = RISCV::FSGNJ_S;
356
- IsScalableVector = false ;
357
- } else if (RISCV::FPR64RegClass.contains (DstReg, SrcReg)) {
358
- Opc = RISCV::FSGNJ_D;
359
- IsScalableVector = false ;
360
- } else if (RISCV::VRRegClass.contains (DstReg, SrcReg)) {
348
+ BuildMI (MBB, MBBI, DL, get (Opc), DstReg)
349
+ .addReg (SrcReg, getKillRegState (KillSrc))
350
+ .addReg (SrcReg, getKillRegState (KillSrc));
351
+ return ;
352
+ }
353
+
354
+ if (RISCV::FPR32RegClass.contains (DstReg, SrcReg)) {
355
+ BuildMI (MBB, MBBI, DL, get (RISCV::FSGNJ_S), DstReg)
356
+ .addReg (SrcReg, getKillRegState (KillSrc))
357
+ .addReg (SrcReg, getKillRegState (KillSrc));
358
+ return ;
359
+ }
360
+
361
+ if (RISCV::FPR64RegClass.contains (DstReg, SrcReg)) {
362
+ BuildMI (MBB, MBBI, DL, get (RISCV::FSGNJ_D), DstReg)
363
+ .addReg (SrcReg, getKillRegState (KillSrc))
364
+ .addReg (SrcReg, getKillRegState (KillSrc));
365
+ return ;
366
+ }
367
+
368
+ // VR->VR copies.
369
+ unsigned Opc;
370
+ unsigned NF = 1 ;
371
+ RISCVII::VLMUL LMul = RISCVII::LMUL_1;
372
+ unsigned SubRegIdx = RISCV::sub_vrm1_0;
373
+ if (RISCV::VRRegClass.contains (DstReg, SrcReg)) {
361
374
Opc = RISCV::VMV1R_V;
362
375
LMul = RISCVII::LMUL_1;
363
376
} else if (RISCV::VRM2RegClass.contains (DstReg, SrcReg)) {
@@ -428,97 +441,90 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
428
441
llvm_unreachable (" Impossible reg-to-reg copy" );
429
442
}
430
443
431
- if (IsScalableVector) {
432
- bool UseVMV_V_V = false ;
433
- bool UseVMV_V_I = false ;
434
- MachineBasicBlock::const_iterator DefMBBI;
435
- if (isConvertibleToVMV_V_V (STI, MBB, MBBI, DefMBBI, LMul)) {
436
- UseVMV_V_V = true ;
437
- // We only need to handle LMUL = 1/2/4/8 here because we only define
438
- // vector register classes for LMUL = 1/2/4/8.
439
- unsigned VIOpc;
440
- switch (LMul) {
441
- default :
442
- llvm_unreachable (" Impossible LMUL for vector register copy." );
443
- case RISCVII::LMUL_1:
444
- Opc = RISCV::PseudoVMV_V_V_M1;
445
- VIOpc = RISCV::PseudoVMV_V_I_M1;
446
- break ;
447
- case RISCVII::LMUL_2:
448
- Opc = RISCV::PseudoVMV_V_V_M2;
449
- VIOpc = RISCV::PseudoVMV_V_I_M2;
450
- break ;
451
- case RISCVII::LMUL_4:
452
- Opc = RISCV::PseudoVMV_V_V_M4;
453
- VIOpc = RISCV::PseudoVMV_V_I_M4;
454
- break ;
455
- case RISCVII::LMUL_8:
456
- Opc = RISCV::PseudoVMV_V_V_M8;
457
- VIOpc = RISCV::PseudoVMV_V_I_M8;
458
- break ;
459
- }
444
+ bool UseVMV_V_V = false ;
445
+ bool UseVMV_V_I = false ;
446
+ MachineBasicBlock::const_iterator DefMBBI;
447
+ if (isConvertibleToVMV_V_V (STI, MBB, MBBI, DefMBBI, LMul)) {
448
+ UseVMV_V_V = true ;
449
+ // We only need to handle LMUL = 1/2/4/8 here because we only define
450
+ // vector register classes for LMUL = 1/2/4/8.
451
+ unsigned VIOpc;
452
+ switch (LMul) {
453
+ default :
454
+ llvm_unreachable (" Impossible LMUL for vector register copy." );
455
+ case RISCVII::LMUL_1:
456
+ Opc = RISCV::PseudoVMV_V_V_M1;
457
+ VIOpc = RISCV::PseudoVMV_V_I_M1;
458
+ break ;
459
+ case RISCVII::LMUL_2:
460
+ Opc = RISCV::PseudoVMV_V_V_M2;
461
+ VIOpc = RISCV::PseudoVMV_V_I_M2;
462
+ break ;
463
+ case RISCVII::LMUL_4:
464
+ Opc = RISCV::PseudoVMV_V_V_M4;
465
+ VIOpc = RISCV::PseudoVMV_V_I_M4;
466
+ break ;
467
+ case RISCVII::LMUL_8:
468
+ Opc = RISCV::PseudoVMV_V_V_M8;
469
+ VIOpc = RISCV::PseudoVMV_V_I_M8;
470
+ break ;
471
+ }
460
472
461
- if (DefMBBI->getOpcode () == VIOpc) {
462
- UseVMV_V_I = true ;
463
- Opc = VIOpc;
464
- }
473
+ if (DefMBBI->getOpcode () == VIOpc) {
474
+ UseVMV_V_I = true ;
475
+ Opc = VIOpc;
465
476
}
477
+ }
466
478
467
- if (NF == 1 ) {
468
- auto MIB = BuildMI (MBB, MBBI, DL, get (Opc), DstReg);
479
+ if (NF == 1 ) {
480
+ auto MIB = BuildMI (MBB, MBBI, DL, get (Opc), DstReg);
481
+ if (UseVMV_V_V)
482
+ MIB.addReg (DstReg, RegState::Undef);
483
+ if (UseVMV_V_I)
484
+ MIB = MIB.add (DefMBBI->getOperand (2 ));
485
+ else
486
+ MIB = MIB.addReg (SrcReg, getKillRegState (KillSrc));
487
+ if (UseVMV_V_V) {
488
+ const MCInstrDesc &Desc = DefMBBI->getDesc ();
489
+ MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
490
+ MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
491
+ MIB.addImm (0 ); // tu, mu
492
+ MIB.addReg (RISCV::VL, RegState::Implicit);
493
+ MIB.addReg (RISCV::VTYPE, RegState::Implicit);
494
+ }
495
+ } else {
496
+ int I = 0 , End = NF, Incr = 1 ;
497
+ unsigned SrcEncoding = TRI->getEncodingValue (SrcReg);
498
+ unsigned DstEncoding = TRI->getEncodingValue (DstReg);
499
+ unsigned LMulVal;
500
+ bool Fractional;
501
+ std::tie (LMulVal, Fractional) = RISCVVType::decodeVLMUL (LMul);
502
+ assert (!Fractional && " It is impossible be fractional lmul here." );
503
+ if (forwardCopyWillClobberTuple (DstEncoding, SrcEncoding, NF * LMulVal)) {
504
+ I = NF - 1 ;
505
+ End = -1 ;
506
+ Incr = -1 ;
507
+ }
508
+
509
+ for (; I != End; I += Incr) {
510
+ auto MIB = BuildMI (MBB, MBBI, DL, get (Opc),
511
+ TRI->getSubReg (DstReg, SubRegIdx + I));
469
512
if (UseVMV_V_V)
470
- MIB.addReg (DstReg, RegState::Undef);
513
+ MIB.addReg (TRI-> getSubReg ( DstReg, SubRegIdx + I) , RegState::Undef);
471
514
if (UseVMV_V_I)
472
515
MIB = MIB.add (DefMBBI->getOperand (2 ));
473
516
else
474
- MIB = MIB.addReg (SrcReg, getKillRegState (KillSrc));
517
+ MIB = MIB.addReg (TRI->getSubReg (SrcReg, SubRegIdx + I),
518
+ getKillRegState (KillSrc));
475
519
if (UseVMV_V_V) {
476
520
const MCInstrDesc &Desc = DefMBBI->getDesc ();
477
521
MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
478
522
MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
479
- MIB.addImm (0 ); // tu, mu
523
+ MIB.addImm (0 ); // tu, mu
480
524
MIB.addReg (RISCV::VL, RegState::Implicit);
481
525
MIB.addReg (RISCV::VTYPE, RegState::Implicit);
482
526
}
483
- } else {
484
- int I = 0 , End = NF, Incr = 1 ;
485
- unsigned SrcEncoding = TRI->getEncodingValue (SrcReg);
486
- unsigned DstEncoding = TRI->getEncodingValue (DstReg);
487
- unsigned LMulVal;
488
- bool Fractional;
489
- std::tie (LMulVal, Fractional) = RISCVVType::decodeVLMUL (LMul);
490
- assert (!Fractional && " It is impossible be fractional lmul here." );
491
- if (forwardCopyWillClobberTuple (DstEncoding, SrcEncoding, NF * LMulVal)) {
492
- I = NF - 1 ;
493
- End = -1 ;
494
- Incr = -1 ;
495
- }
496
-
497
- for (; I != End; I += Incr) {
498
- auto MIB = BuildMI (MBB, MBBI, DL, get (Opc),
499
- TRI->getSubReg (DstReg, SubRegIdx + I));
500
- if (UseVMV_V_V)
501
- MIB.addReg (TRI->getSubReg (DstReg, SubRegIdx + I),
502
- RegState::Undef);
503
- if (UseVMV_V_I)
504
- MIB = MIB.add (DefMBBI->getOperand (2 ));
505
- else
506
- MIB = MIB.addReg (TRI->getSubReg (SrcReg, SubRegIdx + I),
507
- getKillRegState (KillSrc));
508
- if (UseVMV_V_V) {
509
- const MCInstrDesc &Desc = DefMBBI->getDesc ();
510
- MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
511
- MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
512
- MIB.addImm (0 ); // tu, mu
513
- MIB.addReg (RISCV::VL, RegState::Implicit);
514
- MIB.addReg (RISCV::VTYPE, RegState::Implicit);
515
- }
516
- }
517
527
}
518
- } else {
519
- BuildMI (MBB, MBBI, DL, get (Opc), DstReg)
520
- .addReg (SrcReg, getKillRegState (KillSrc))
521
- .addReg (SrcReg, getKillRegState (KillSrc));
522
528
}
523
529
}
524
530
0 commit comments