@@ -3410,14 +3410,11 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
3410
3410
3411
3411
unsigned Opc, MOpc;
3412
3412
bool isSigned = Opcode == ISD::SMUL_LOHI;
3413
- bool hasBMI2 = Subtarget->hasBMI2 ();
3414
3413
if (!isSigned) {
3415
3414
switch (NVT.SimpleTy ) {
3416
3415
default : llvm_unreachable (" Unsupported VT!" );
3417
- case MVT::i32 : Opc = hasBMI2 ? X86::MULX32rr : X86::MUL32r;
3418
- MOpc = hasBMI2 ? X86::MULX32rm : X86::MUL32m; break ;
3419
- case MVT::i64 : Opc = hasBMI2 ? X86::MULX64rr : X86::MUL64r;
3420
- MOpc = hasBMI2 ? X86::MULX64rm : X86::MUL64m; break ;
3416
+ case MVT::i32 : Opc = X86::MUL32r; MOpc = X86::MUL32m; break ;
3417
+ case MVT::i64 : Opc = X86::MUL64r; MOpc = X86::MUL64m; break ;
3421
3418
}
3422
3419
} else {
3423
3420
switch (NVT.SimpleTy ) {
@@ -3438,12 +3435,6 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
3438
3435
case X86::MUL64r:
3439
3436
SrcReg = LoReg = X86::RAX; HiReg = X86::RDX;
3440
3437
break ;
3441
- case X86::MULX32rr:
3442
- SrcReg = X86::EDX; LoReg = HiReg = 0 ;
3443
- break ;
3444
- case X86::MULX64rr:
3445
- SrcReg = X86::RDX; LoReg = HiReg = 0 ;
3446
- break ;
3447
3438
}
3448
3439
3449
3440
SDValue Tmp0, Tmp1, Tmp2, Tmp3, Tmp4;
@@ -3457,66 +3448,43 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
3457
3448
3458
3449
SDValue InFlag = CurDAG->getCopyToReg (CurDAG->getEntryNode (), dl, SrcReg,
3459
3450
N0, SDValue ()).getValue (1 );
3460
- SDValue ResHi, ResLo;
3461
-
3462
3451
if (foldedLoad) {
3463
3452
SDValue Chain;
3464
3453
MachineSDNode *CNode = nullptr ;
3465
3454
SDValue Ops[] = { Tmp0, Tmp1, Tmp2, Tmp3, Tmp4, N1.getOperand (0 ),
3466
3455
InFlag };
3467
- if (MOpc == X86::MULX32rm || MOpc == X86::MULX64rm) {
3468
- SDVTList VTs = CurDAG->getVTList (NVT, NVT, MVT::Other, MVT::Glue);
3469
- CNode = CurDAG->getMachineNode (MOpc, dl, VTs, Ops);
3470
- ResHi = SDValue (CNode, 0 );
3471
- ResLo = SDValue (CNode, 1 );
3472
- Chain = SDValue (CNode, 2 );
3473
- InFlag = SDValue (CNode, 3 );
3474
- } else {
3475
- SDVTList VTs = CurDAG->getVTList (MVT::Other, MVT::Glue);
3476
- CNode = CurDAG->getMachineNode (MOpc, dl, VTs, Ops);
3477
- Chain = SDValue (CNode, 0 );
3478
- InFlag = SDValue (CNode, 1 );
3479
- }
3456
+ SDVTList VTs = CurDAG->getVTList (MVT::Other, MVT::Glue);
3457
+ CNode = CurDAG->getMachineNode (MOpc, dl, VTs, Ops);
3458
+ Chain = SDValue (CNode, 0 );
3459
+ InFlag = SDValue (CNode, 1 );
3480
3460
3481
3461
// Update the chain.
3482
3462
ReplaceUses (N1.getValue (1 ), Chain);
3483
3463
// Record the mem-refs
3484
3464
CurDAG->setNodeMemRefs (CNode, {cast<LoadSDNode>(N1)->getMemOperand ()});
3485
3465
} else {
3486
3466
SDValue Ops[] = { N1, InFlag };
3487
- if (Opc == X86::MULX32rr || Opc == X86::MULX64rr) {
3488
- SDVTList VTs = CurDAG->getVTList (NVT, NVT, MVT::Glue);
3489
- SDNode *CNode = CurDAG->getMachineNode (Opc, dl, VTs, Ops);
3490
- ResHi = SDValue (CNode, 0 );
3491
- ResLo = SDValue (CNode, 1 );
3492
- InFlag = SDValue (CNode, 2 );
3493
- } else {
3494
- SDVTList VTs = CurDAG->getVTList (MVT::Glue);
3495
- SDNode *CNode = CurDAG->getMachineNode (Opc, dl, VTs, Ops);
3496
- InFlag = SDValue (CNode, 0 );
3497
- }
3467
+ SDVTList VTs = CurDAG->getVTList (MVT::Glue);
3468
+ SDNode *CNode = CurDAG->getMachineNode (Opc, dl, VTs, Ops);
3469
+ InFlag = SDValue (CNode, 0 );
3498
3470
}
3499
3471
3500
3472
// Copy the low half of the result, if it is needed.
3501
3473
if (!SDValue (Node, 0 ).use_empty ()) {
3502
- if (!ResLo.getNode ()) {
3503
- assert (LoReg && " Register for low half is not defined!" );
3504
- ResLo = CurDAG->getCopyFromReg (CurDAG->getEntryNode (), dl, LoReg, NVT,
3505
- InFlag);
3506
- InFlag = ResLo.getValue (2 );
3507
- }
3474
+ assert (LoReg && " Register for low half is not defined!" );
3475
+ SDValue ResLo = CurDAG->getCopyFromReg (CurDAG->getEntryNode (), dl, LoReg,
3476
+ NVT, InFlag);
3477
+ InFlag = ResLo.getValue (2 );
3508
3478
ReplaceUses (SDValue (Node, 0 ), ResLo);
3509
3479
LLVM_DEBUG (dbgs () << " => " ; ResLo.getNode ()->dump (CurDAG);
3510
3480
dbgs () << ' \n ' );
3511
3481
}
3512
3482
// Copy the high half of the result, if it is needed.
3513
3483
if (!SDValue (Node, 1 ).use_empty ()) {
3514
- if (!ResHi.getNode ()) {
3515
- assert (HiReg && " Register for high half is not defined!" );
3516
- ResHi = CurDAG->getCopyFromReg (CurDAG->getEntryNode (), dl, HiReg, NVT,
3517
- InFlag);
3518
- InFlag = ResHi.getValue (2 );
3519
- }
3484
+ assert (HiReg && " Register for high half is not defined!" );
3485
+ SDValue ResHi = CurDAG->getCopyFromReg (CurDAG->getEntryNode (), dl, HiReg,
3486
+ NVT, InFlag);
3487
+ InFlag = ResHi.getValue (2 );
3520
3488
ReplaceUses (SDValue (Node, 1 ), ResHi);
3521
3489
LLVM_DEBUG (dbgs () << " => " ; ResHi.getNode ()->dump (CurDAG);
3522
3490
dbgs () << ' \n ' );
0 commit comments