@@ -483,9 +483,7 @@ static bool RetCC_Hexagon32(unsigned ValNo, MVT ValVT,
483
483
}
484
484
}
485
485
486
- unsigned Offset = State.AllocateStack (4 , 4 );
487
- State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
488
- return false ;
486
+ return true ;
489
487
}
490
488
491
489
static bool RetCC_Hexagon64 (unsigned ValNo, MVT ValVT,
@@ -498,9 +496,7 @@ static bool RetCC_Hexagon64(unsigned ValNo, MVT ValVT,
498
496
}
499
497
}
500
498
501
- unsigned Offset = State.AllocateStack (8 , 8 );
502
- State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
503
- return false ;
499
+ return true ;
504
500
}
505
501
506
502
static bool RetCC_HexagonVector (unsigned ValNo, MVT ValVT,
@@ -511,7 +507,6 @@ static bool RetCC_HexagonVector(unsigned ValNo, MVT ValVT,
511
507
bool UseHVX = HST.useHVXOps ();
512
508
bool UseHVXDbl = HST.useHVXDblOps ();
513
509
514
- unsigned OffSiz = 64 ;
515
510
if (LocVT == MVT::v16i32) {
516
511
if (unsigned Reg = State.AllocateReg (Hexagon::V0)) {
517
512
State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
@@ -523,18 +518,14 @@ static bool RetCC_HexagonVector(unsigned ValNo, MVT ValVT,
523
518
State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
524
519
return false ;
525
520
}
526
- OffSiz = 128 ;
527
521
} else if (LocVT == MVT::v64i32) {
528
522
if (unsigned Reg = State.AllocateReg (Hexagon::W0)) {
529
523
State.addLoc (CCValAssign::getReg (ValNo, ValVT, Reg, LocVT, LocInfo));
530
524
return false ;
531
525
}
532
- OffSiz = 256 ;
533
526
}
534
527
535
- unsigned Offset = State.AllocateStack (OffSiz, OffSiz);
536
- State.addLoc (CCValAssign::getMem (ValNo, ValVT, Offset, LocVT, LocInfo));
537
- return false ;
528
+ return true ;
538
529
}
539
530
540
531
void HexagonTargetLowering::promoteLdStType (MVT VT, MVT PromotedLdStVT) {
@@ -590,6 +581,16 @@ static bool isHvxVectorType(MVT Ty) {
590
581
}
591
582
}
592
583
584
+ bool
585
+ HexagonTargetLowering::CanLowerReturn (
586
+ CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
587
+ const SmallVectorImpl<ISD::OutputArg> &Outs,
588
+ LLVMContext &Context) const {
589
+ SmallVector<CCValAssign, 16 > RVLocs;
590
+ CCState CCInfo (CallConv, isVarArg, MF, RVLocs, Context);
591
+ return CCInfo.CheckReturn (Outs, RetCC_Hexagon);
592
+ }
593
+
593
594
// LowerReturn - Lower ISD::RET. If a struct is larger than 8 bytes and is
594
595
// passed by value, the function prototype is modified to return void and
595
596
// the value is stored in memory pointed by a pointer passed by caller.
@@ -1217,7 +1218,7 @@ SDValue HexagonTargetLowering::LowerFormalArguments(
1217
1218
InVals.push_back (FIN);
1218
1219
} else {
1219
1220
InVals.push_back (
1220
- DAG.getLoad (VA.getLocVT (), dl, Chain, FIN, MachinePointerInfo ()));
1221
+ DAG.getLoad (VA.getValVT (), dl, Chain, FIN, MachinePointerInfo ()));
1221
1222
}
1222
1223
}
1223
1224
}
0 commit comments