@@ -294,153 +294,12 @@ static bool isConvertibleToVMV_V_V(const RISCVSubtarget &STI,
294
294
return false ;
295
295
}
296
296
297
- void RISCVInstrInfo::copyPhysReg (MachineBasicBlock &MBB,
298
- MachineBasicBlock::iterator MBBI,
299
- const DebugLoc &DL, MCRegister DstReg,
300
- MCRegister SrcReg, bool KillSrc ) const {
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 {
301
301
const TargetRegisterInfo *TRI = STI.getRegisterInfo ();
302
302
303
- if (RISCV::GPRRegClass.contains (DstReg, SrcReg)) {
304
- BuildMI (MBB, MBBI, DL, get (RISCV::ADDI), DstReg)
305
- .addReg (SrcReg, getKillRegState (KillSrc))
306
- .addImm (0 );
307
- return ;
308
- }
309
-
310
- if (RISCV::GPRPF64RegClass.contains (DstReg, SrcReg)) {
311
- // Emit an ADDI for both parts of GPRPF64.
312
- BuildMI (MBB, MBBI, DL, get (RISCV::ADDI),
313
- TRI->getSubReg (DstReg, RISCV::sub_32))
314
- .addReg (TRI->getSubReg (SrcReg, RISCV::sub_32), getKillRegState (KillSrc))
315
- .addImm (0 );
316
- BuildMI (MBB, MBBI, DL, get (RISCV::ADDI),
317
- TRI->getSubReg (DstReg, RISCV::sub_32_hi))
318
- .addReg (TRI->getSubReg (SrcReg, RISCV::sub_32_hi),
319
- getKillRegState (KillSrc))
320
- .addImm (0 );
321
- return ;
322
- }
323
-
324
- // Handle copy from csr
325
- if (RISCV::VCSRRegClass.contains (SrcReg) &&
326
- RISCV::GPRRegClass.contains (DstReg)) {
327
- BuildMI (MBB, MBBI, DL, get (RISCV::CSRRS), DstReg)
328
- .addImm (RISCVSysReg::lookupSysRegByName (TRI->getName (SrcReg))->Encoding )
329
- .addReg (RISCV::X0);
330
- return ;
331
- }
332
-
333
- if (RISCV::FPR16RegClass.contains (DstReg, SrcReg)) {
334
- unsigned Opc;
335
- if (STI.hasStdExtZfh ()) {
336
- Opc = RISCV::FSGNJ_H;
337
- } else {
338
- assert (STI.hasStdExtF () &&
339
- (STI.hasStdExtZfhmin () || STI.hasStdExtZfbfmin ()) &&
340
- " Unexpected extensions" );
341
- // Zfhmin/Zfbfmin doesn't have FSGNJ_H, replace FSGNJ_H with FSGNJ_S.
342
- DstReg = TRI->getMatchingSuperReg (DstReg, RISCV::sub_16,
343
- &RISCV::FPR32RegClass);
344
- SrcReg = TRI->getMatchingSuperReg (SrcReg, RISCV::sub_16,
345
- &RISCV::FPR32RegClass);
346
- Opc = RISCV::FSGNJ_S;
347
- }
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)) {
374
- Opc = RISCV::VMV1R_V;
375
- LMul = RISCVII::LMUL_1;
376
- } else if (RISCV::VRM2RegClass.contains (DstReg, SrcReg)) {
377
- Opc = RISCV::VMV2R_V;
378
- LMul = RISCVII::LMUL_2;
379
- } else if (RISCV::VRM4RegClass.contains (DstReg, SrcReg)) {
380
- Opc = RISCV::VMV4R_V;
381
- LMul = RISCVII::LMUL_4;
382
- } else if (RISCV::VRM8RegClass.contains (DstReg, SrcReg)) {
383
- Opc = RISCV::VMV8R_V;
384
- LMul = RISCVII::LMUL_8;
385
- } else if (RISCV::VRN2M1RegClass.contains (DstReg, SrcReg)) {
386
- Opc = RISCV::VMV1R_V;
387
- SubRegIdx = RISCV::sub_vrm1_0;
388
- NF = 2 ;
389
- LMul = RISCVII::LMUL_1;
390
- } else if (RISCV::VRN2M2RegClass.contains (DstReg, SrcReg)) {
391
- Opc = RISCV::VMV2R_V;
392
- SubRegIdx = RISCV::sub_vrm2_0;
393
- NF = 2 ;
394
- LMul = RISCVII::LMUL_2;
395
- } else if (RISCV::VRN2M4RegClass.contains (DstReg, SrcReg)) {
396
- Opc = RISCV::VMV4R_V;
397
- SubRegIdx = RISCV::sub_vrm4_0;
398
- NF = 2 ;
399
- LMul = RISCVII::LMUL_4;
400
- } else if (RISCV::VRN3M1RegClass.contains (DstReg, SrcReg)) {
401
- Opc = RISCV::VMV1R_V;
402
- SubRegIdx = RISCV::sub_vrm1_0;
403
- NF = 3 ;
404
- LMul = RISCVII::LMUL_1;
405
- } else if (RISCV::VRN3M2RegClass.contains (DstReg, SrcReg)) {
406
- Opc = RISCV::VMV2R_V;
407
- SubRegIdx = RISCV::sub_vrm2_0;
408
- NF = 3 ;
409
- LMul = RISCVII::LMUL_2;
410
- } else if (RISCV::VRN4M1RegClass.contains (DstReg, SrcReg)) {
411
- Opc = RISCV::VMV1R_V;
412
- SubRegIdx = RISCV::sub_vrm1_0;
413
- NF = 4 ;
414
- LMul = RISCVII::LMUL_1;
415
- } else if (RISCV::VRN4M2RegClass.contains (DstReg, SrcReg)) {
416
- Opc = RISCV::VMV2R_V;
417
- SubRegIdx = RISCV::sub_vrm2_0;
418
- NF = 4 ;
419
- LMul = RISCVII::LMUL_2;
420
- } else if (RISCV::VRN5M1RegClass.contains (DstReg, SrcReg)) {
421
- Opc = RISCV::VMV1R_V;
422
- SubRegIdx = RISCV::sub_vrm1_0;
423
- NF = 5 ;
424
- LMul = RISCVII::LMUL_1;
425
- } else if (RISCV::VRN6M1RegClass.contains (DstReg, SrcReg)) {
426
- Opc = RISCV::VMV1R_V;
427
- SubRegIdx = RISCV::sub_vrm1_0;
428
- NF = 6 ;
429
- LMul = RISCVII::LMUL_1;
430
- } else if (RISCV::VRN7M1RegClass.contains (DstReg, SrcReg)) {
431
- Opc = RISCV::VMV1R_V;
432
- SubRegIdx = RISCV::sub_vrm1_0;
433
- NF = 7 ;
434
- LMul = RISCVII::LMUL_1;
435
- } else if (RISCV::VRN8M1RegClass.contains (DstReg, SrcReg)) {
436
- Opc = RISCV::VMV1R_V;
437
- SubRegIdx = RISCV::sub_vrm1_0;
438
- NF = 8 ;
439
- LMul = RISCVII::LMUL_1;
440
- } else {
441
- llvm_unreachable (" Impossible reg-to-reg copy" );
442
- }
443
-
444
303
bool UseVMV_V_V = false ;
445
304
bool UseVMV_V_I = false ;
446
305
MachineBasicBlock::const_iterator DefMBBI;
@@ -518,7 +377,7 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
518
377
getKillRegState (KillSrc));
519
378
if (UseVMV_V_V) {
520
379
const MCInstrDesc &Desc = DefMBBI->getDesc ();
521
- MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
380
+ MIB.add (DefMBBI->getOperand (RISCVII::getVLOpNum (Desc))); // AVL
522
381
MIB.add (DefMBBI->getOperand (RISCVII::getSEWOpNum (Desc))); // SEW
523
382
MIB.addImm (0 ); // tu, mu
524
383
MIB.addReg (RISCV::VL, RegState::Implicit);
@@ -528,6 +387,171 @@ void RISCVInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
528
387
}
529
388
}
530
389
390
+ void RISCVInstrInfo::copyPhysReg (MachineBasicBlock &MBB,
391
+ MachineBasicBlock::iterator MBBI,
392
+ const DebugLoc &DL, MCRegister DstReg,
393
+ MCRegister SrcReg, bool KillSrc) const {
394
+ const TargetRegisterInfo *TRI = STI.getRegisterInfo ();
395
+
396
+ if (RISCV::GPRRegClass.contains (DstReg, SrcReg)) {
397
+ BuildMI (MBB, MBBI, DL, get (RISCV::ADDI), DstReg)
398
+ .addReg (SrcReg, getKillRegState (KillSrc))
399
+ .addImm (0 );
400
+ return ;
401
+ }
402
+
403
+ if (RISCV::GPRPF64RegClass.contains (DstReg, SrcReg)) {
404
+ // Emit an ADDI for both parts of GPRPF64.
405
+ BuildMI (MBB, MBBI, DL, get (RISCV::ADDI),
406
+ TRI->getSubReg (DstReg, RISCV::sub_32))
407
+ .addReg (TRI->getSubReg (SrcReg, RISCV::sub_32), getKillRegState (KillSrc))
408
+ .addImm (0 );
409
+ BuildMI (MBB, MBBI, DL, get (RISCV::ADDI),
410
+ TRI->getSubReg (DstReg, RISCV::sub_32_hi))
411
+ .addReg (TRI->getSubReg (SrcReg, RISCV::sub_32_hi),
412
+ getKillRegState (KillSrc))
413
+ .addImm (0 );
414
+ return ;
415
+ }
416
+
417
+ // Handle copy from csr
418
+ if (RISCV::VCSRRegClass.contains (SrcReg) &&
419
+ RISCV::GPRRegClass.contains (DstReg)) {
420
+ BuildMI (MBB, MBBI, DL, get (RISCV::CSRRS), DstReg)
421
+ .addImm (RISCVSysReg::lookupSysRegByName (TRI->getName (SrcReg))->Encoding )
422
+ .addReg (RISCV::X0);
423
+ return ;
424
+ }
425
+
426
+ if (RISCV::FPR16RegClass.contains (DstReg, SrcReg)) {
427
+ unsigned Opc;
428
+ if (STI.hasStdExtZfh ()) {
429
+ Opc = RISCV::FSGNJ_H;
430
+ } else {
431
+ assert (STI.hasStdExtF () &&
432
+ (STI.hasStdExtZfhmin () || STI.hasStdExtZfbfmin ()) &&
433
+ " Unexpected extensions" );
434
+ // Zfhmin/Zfbfmin doesn't have FSGNJ_H, replace FSGNJ_H with FSGNJ_S.
435
+ DstReg = TRI->getMatchingSuperReg (DstReg, RISCV::sub_16,
436
+ &RISCV::FPR32RegClass);
437
+ SrcReg = TRI->getMatchingSuperReg (SrcReg, RISCV::sub_16,
438
+ &RISCV::FPR32RegClass);
439
+ Opc = RISCV::FSGNJ_S;
440
+ }
441
+ BuildMI (MBB, MBBI, DL, get (Opc), DstReg)
442
+ .addReg (SrcReg, getKillRegState (KillSrc))
443
+ .addReg (SrcReg, getKillRegState (KillSrc));
444
+ return ;
445
+ }
446
+
447
+ if (RISCV::FPR32RegClass.contains (DstReg, SrcReg)) {
448
+ BuildMI (MBB, MBBI, DL, get (RISCV::FSGNJ_S), DstReg)
449
+ .addReg (SrcReg, getKillRegState (KillSrc))
450
+ .addReg (SrcReg, getKillRegState (KillSrc));
451
+ return ;
452
+ }
453
+
454
+ if (RISCV::FPR64RegClass.contains (DstReg, SrcReg)) {
455
+ BuildMI (MBB, MBBI, DL, get (RISCV::FSGNJ_D), DstReg)
456
+ .addReg (SrcReg, getKillRegState (KillSrc))
457
+ .addReg (SrcReg, getKillRegState (KillSrc));
458
+ return ;
459
+ }
460
+
461
+ // VR->VR copies.
462
+ 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);
465
+ return ;
466
+ }
467
+
468
+ 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);
471
+ return ;
472
+ }
473
+
474
+ 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);
477
+ return ;
478
+ }
479
+
480
+ 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);
483
+ return ;
484
+ }
485
+
486
+ if (RISCV::VRN2M1RegClass.contains (DstReg, SrcReg)) {
487
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
488
+ /* NF=*/ 2 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
489
+ return ;
490
+ }
491
+
492
+ if (RISCV::VRN2M2RegClass.contains (DstReg, SrcReg)) {
493
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
494
+ /* NF=*/ 2 , RISCVII::LMUL_2, RISCV::sub_vrm2_0);
495
+ return ;
496
+ }
497
+
498
+ if (RISCV::VRN2M4RegClass.contains (DstReg, SrcReg)) {
499
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV4R_V,
500
+ /* NF=*/ 2 , RISCVII::LMUL_4, RISCV::sub_vrm4_0);
501
+ return ;
502
+ }
503
+
504
+ if (RISCV::VRN3M1RegClass.contains (DstReg, SrcReg)) {
505
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
506
+ /* NF=*/ 3 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
507
+ return ;
508
+ }
509
+
510
+ if (RISCV::VRN3M2RegClass.contains (DstReg, SrcReg)) {
511
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
512
+ /* NF=*/ 3 , RISCVII::LMUL_2, RISCV::sub_vrm2_0);
513
+ return ;
514
+ }
515
+
516
+ if (RISCV::VRN4M1RegClass.contains (DstReg, SrcReg)) {
517
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
518
+ /* NF=*/ 4 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
519
+ return ;
520
+ }
521
+
522
+ if (RISCV::VRN4M2RegClass.contains (DstReg, SrcReg)) {
523
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV2R_V,
524
+ /* NF=*/ 4 , RISCVII::LMUL_2, RISCV::sub_vrm2_0);
525
+ return ;
526
+ }
527
+
528
+ if (RISCV::VRN5M1RegClass.contains (DstReg, SrcReg)) {
529
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
530
+ /* NF=*/ 5 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
531
+ return ;
532
+ }
533
+
534
+ if (RISCV::VRN6M1RegClass.contains (DstReg, SrcReg)) {
535
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
536
+ /* NF=*/ 6 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
537
+ return ;
538
+ }
539
+
540
+ if (RISCV::VRN7M1RegClass.contains (DstReg, SrcReg)) {
541
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
542
+ /* NF=*/ 7 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
543
+ return ;
544
+ }
545
+
546
+ if (RISCV::VRN8M1RegClass.contains (DstReg, SrcReg)) {
547
+ copyPhysRegVector (MBB, MBBI, DL, DstReg, SrcReg, KillSrc, RISCV::VMV1R_V,
548
+ /* NF=*/ 8 , RISCVII::LMUL_1, RISCV::sub_vrm1_0);
549
+ return ;
550
+ }
551
+
552
+ llvm_unreachable (" Impossible reg-to-reg copy" );
553
+ }
554
+
531
555
void RISCVInstrInfo::storeRegToStackSlot (MachineBasicBlock &MBB,
532
556
MachineBasicBlock::iterator I,
533
557
Register SrcReg, bool IsKill, int FI,
0 commit comments