@@ -95,10 +95,52 @@ class MipsCCState : public CCState {
95
95
originalTypeIsF128 (MF.getFunction ()->getReturnType (), nullptr ));
96
96
}
97
97
98
+ // / Identify lowered values that originated from f128 arguments and record
99
+ // / this.
100
+ void PreAnalyzeCallOperandsForF128 (
101
+ const SmallVectorImpl<ISD::OutputArg> &Outs,
102
+ std::vector<TargetLowering::ArgListEntry> &FuncArgs, SDNode *CallNode) {
103
+ const MachineFunction &MF = getMachineFunction ();
104
+ for (unsigned i = 0 ; i < Outs.size (); ++i)
105
+ OriginalArgWasF128.push_back (
106
+ originalTypeIsF128 (FuncArgs[Outs[i].OrigArgIndex ].Ty , CallNode));
107
+ }
108
+
109
+ // / Identify lowered values that originated from f128 arguments and record
110
+ // / this.
111
+ void
112
+ PreAnalyzeFormalArgumentsForF128 (const SmallVectorImpl<ISD::InputArg> &Ins) {
113
+ const MachineFunction &MF = getMachineFunction ();
114
+ for (unsigned i = 0 ; i < Ins.size (); ++i) {
115
+ Function::const_arg_iterator FuncArg = MF.getFunction ()->arg_begin ();
116
+ std::advance (FuncArg, Ins[i].OrigArgIndex );
117
+
118
+ OriginalArgWasF128.push_back (
119
+ originalTypeIsF128 (FuncArg->getType (), nullptr ));
120
+ }
121
+ }
122
+
98
123
// / Records whether the value has been lowered from an f128.
99
124
SmallVector<bool , 4 > OriginalArgWasF128;
100
125
101
126
public:
127
+ // FIXME: Remove this from a public inteface ASAP. It's a temporary trap door
128
+ // to allow analyzeCallOperands to be removed incrementally.
129
+ void PreAnalyzeCallOperandsForF128_ (
130
+ const SmallVectorImpl<ISD::OutputArg> &Outs,
131
+ std::vector<TargetLowering::ArgListEntry> &FuncArgs, SDNode *CallNode) {
132
+ PreAnalyzeCallOperandsForF128 (Outs, FuncArgs, CallNode);
133
+ }
134
+ // FIXME: Remove this from a public inteface ASAP. It's a temporary trap door
135
+ // to allow analyzeFormalArguments to be removed incrementally.
136
+ void
137
+ PreAnalyzeFormalArgumentsForF128_ (const SmallVectorImpl<ISD::InputArg> &Ins) {
138
+ PreAnalyzeFormalArgumentsForF128 (Ins);
139
+ }
140
+ // FIXME: Remove this from a public inteface ASAP. It's a temporary trap door
141
+ // to clean up after the above functions.
142
+ void ClearOriginalArgWasF128 () { OriginalArgWasF128.clear (); }
143
+
102
144
MipsCCState (CallingConv::ID CC, bool isVarArg, MachineFunction &MF,
103
145
SmallVectorImpl<CCValAssign> &locs, LLVMContext &C)
104
146
: CCState(CC, isVarArg, MF, locs, C) {}
@@ -2546,12 +2588,14 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
2546
2588
2547
2589
// Analyze operands of the call, assigning locations to each operand.
2548
2590
SmallVector<CCValAssign, 16 > ArgLocs;
2549
- CCState CCInfo (CallConv, IsVarArg, DAG.getMachineFunction (), ArgLocs,
2550
- *DAG.getContext ());
2591
+ MipsCCState CCInfo (CallConv, IsVarArg, DAG.getMachineFunction (), ArgLocs,
2592
+ *DAG.getContext ());
2551
2593
MipsCC MipsCCInfo (CallConv, Subtarget, CCInfo);
2552
2594
2595
+ CCInfo.PreAnalyzeCallOperandsForF128_ (Outs, CLI.getArgs (), Callee.getNode ());
2553
2596
MipsCCInfo.analyzeCallOperands (Outs, IsVarArg, Subtarget.abiUsesSoftFloat (),
2554
2597
Callee.getNode (), CLI.getArgs (), CCInfo);
2598
+ CCInfo.ClearOriginalArgWasF128 ();
2555
2599
2556
2600
// Get a count of how many bytes are to be pushed on the stack.
2557
2601
unsigned NextStackOffset = CCInfo.getNextStackOffset ();
@@ -2632,6 +2676,9 @@ MipsTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
2632
2676
}
2633
2677
}
2634
2678
break ;
2679
+ case CCValAssign::BCvt:
2680
+ Arg = DAG.getNode (ISD::BITCAST, DL, LocVT, Arg);
2681
+ break ;
2635
2682
case CCValAssign::SExt:
2636
2683
Arg = DAG.getNode (ISD::SIGN_EXTEND, DL, LocVT, Arg);
2637
2684
break ;
@@ -2829,14 +2876,16 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
2829
2876
2830
2877
// Assign locations to all of the incoming arguments.
2831
2878
SmallVector<CCValAssign, 16 > ArgLocs;
2832
- CCState CCInfo (CallConv, IsVarArg, DAG.getMachineFunction (), ArgLocs,
2833
- *DAG.getContext ());
2879
+ MipsCCState CCInfo (CallConv, IsVarArg, DAG.getMachineFunction (), ArgLocs,
2880
+ *DAG.getContext ());
2834
2881
MipsCC MipsCCInfo (CallConv, Subtarget, CCInfo);
2835
2882
Function::const_arg_iterator FuncArg =
2836
2883
DAG.getMachineFunction ().getFunction ()->arg_begin ();
2837
2884
bool UseSoftFloat = Subtarget.abiUsesSoftFloat ();
2838
2885
2839
- MipsCCInfo.analyzeFormalArguments (Ins, UseSoftFloat, FuncArg, CCInfo);
2886
+ CCInfo.PreAnalyzeFormalArgumentsForF128_ (Ins);
2887
+ MipsCCInfo.analyzeFormalArguments (Ins, UseSoftFloat, CCInfo);
2888
+ CCInfo.ClearOriginalArgWasF128 ();
2840
2889
MipsFI->setFormalArgInfo (CCInfo.getNextStackOffset (),
2841
2890
MipsCCInfo.hasByValArg ());
2842
2891
@@ -2875,16 +2924,24 @@ MipsTargetLowering::LowerFormalArguments(SDValue Chain,
2875
2924
// If this is an 8 or 16-bit value, it has been passed promoted
2876
2925
// to 32 bits. Insert an assert[sz]ext to capture this, then
2877
2926
// truncate to the right size.
2878
- if (VA.getLocInfo () != CCValAssign::Full) {
2879
- unsigned Opcode = 0 ;
2880
- if (VA.getLocInfo () == CCValAssign::SExt)
2881
- Opcode = ISD::AssertSext;
2882
- else if (VA.getLocInfo () == CCValAssign::ZExt)
2883
- Opcode = ISD::AssertZext;
2884
- if (Opcode)
2885
- ArgValue = DAG.getNode (Opcode, DL, RegVT, ArgValue,
2886
- DAG.getValueType (ValVT));
2927
+ switch (VA.getLocInfo ()) {
2928
+ default :
2929
+ llvm_unreachable (" Unknown loc info!" );
2930
+ case CCValAssign::Full:
2931
+ break ;
2932
+ case CCValAssign::SExt:
2933
+ ArgValue = DAG.getNode (ISD::AssertSext, DL, RegVT, ArgValue,
2934
+ DAG.getValueType (ValVT));
2935
+ ArgValue = DAG.getNode (ISD::TRUNCATE, DL, ValVT, ArgValue);
2936
+ break ;
2937
+ case CCValAssign::ZExt:
2938
+ ArgValue = DAG.getNode (ISD::AssertZext, DL, RegVT, ArgValue,
2939
+ DAG.getValueType (ValVT));
2887
2940
ArgValue = DAG.getNode (ISD::TRUNCATE, DL, ValVT, ArgValue);
2941
+ break ;
2942
+ case CCValAssign::BCvt:
2943
+ ArgValue = DAG.getNode (ISD::BITCAST, DL, ValVT, ArgValue);
2944
+ break ;
2888
2945
}
2889
2946
2890
2947
// Handle floating point arguments passed in integer registers and
@@ -3563,11 +3620,8 @@ void MipsTargetLowering::MipsCC::analyzeCallOperands(
3563
3620
3564
3621
if (IsVarArg && !Args[I].IsFixed )
3565
3622
R = CC_Mips_VarArg (I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);
3566
- else {
3567
- MVT RegVT = getRegVT (ArgVT, FuncArgs[Args[I].OrigArgIndex ].Ty , CallNode,
3568
- IsSoftFloat);
3569
- R = FixedFn (I, ArgVT, RegVT, CCValAssign::Full, ArgFlags, State);
3570
- }
3623
+ else
3624
+ R = FixedFn (I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);
3571
3625
3572
3626
if (R) {
3573
3627
#ifndef NDEBUG
@@ -3581,24 +3635,19 @@ void MipsTargetLowering::MipsCC::analyzeCallOperands(
3581
3635
3582
3636
void MipsTargetLowering::MipsCC::analyzeFormalArguments (
3583
3637
const SmallVectorImpl<ISD::InputArg> &Args, bool IsSoftFloat,
3584
- Function::const_arg_iterator FuncArg, CCState &State) {
3638
+ CCState &State) {
3585
3639
unsigned NumArgs = Args.size ();
3586
- unsigned CurArgIdx = 0 ;
3587
3640
3588
3641
for (unsigned I = 0 ; I != NumArgs; ++I) {
3589
3642
MVT ArgVT = Args[I].VT ;
3590
3643
ISD::ArgFlagsTy ArgFlags = Args[I].Flags ;
3591
- std::advance (FuncArg, Args[I].OrigArgIndex - CurArgIdx);
3592
- CurArgIdx = Args[I].OrigArgIndex ;
3593
3644
3594
3645
if (ArgFlags.isByVal ()) {
3595
3646
handleByValArg (I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State);
3596
3647
continue ;
3597
3648
}
3598
3649
3599
- MVT RegVT = getRegVT (ArgVT, FuncArg->getType (), nullptr , IsSoftFloat);
3600
-
3601
- if (!CC_Mips_FixedArg (I, ArgVT, RegVT, CCValAssign::Full, ArgFlags, State))
3650
+ if (!CC_Mips_FixedArg (I, ArgVT, ArgVT, CCValAssign::Full, ArgFlags, State))
3602
3651
continue ;
3603
3652
3604
3653
#ifndef NDEBUG
0 commit comments