mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
In TargetLowering::LowerCallTo, don't assert that
the return value is zero-extended if it isn't sign-extended. It may also be any-extended. Also, if a floating point value was returned in a larger floating point type, pass 1 as the second operand to FP_ROUND, which tells it that all the precision is in the original type. I think this is right but I could be wrong. Finally, when doing libcalls, set isZExt on a parameter if it is "unsigned". Currently isSExt is set when signed, and nothing is set otherwise. This should be right for all calls to standard library routines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47122 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -319,7 +319,7 @@ static SDOperand LowerRET(SDOperand Op, SelectionDAG &DAG) {
|
||||
|
||||
std::pair<SDOperand, SDOperand>
|
||||
AlphaTargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
|
||||
bool RetTyIsSigned, bool isVarArg,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
unsigned CallingConv, bool isTailCall,
|
||||
SDOperand Callee, ArgListTy &Args,
|
||||
SelectionDAG &DAG) {
|
||||
@@ -378,8 +378,16 @@ AlphaTargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
|
||||
SDOperand RetVal = TheCall;
|
||||
|
||||
if (RetTyVT != ActualRetTyVT) {
|
||||
RetVal = DAG.getNode(RetTyIsSigned ? ISD::AssertSext : ISD::AssertZext,
|
||||
MVT::i64, RetVal, DAG.getValueType(RetTyVT));
|
||||
ISD::NodeType AssertKind = ISD::DELETED_NODE;
|
||||
if (RetSExt)
|
||||
AssertKind = ISD::AssertSext;
|
||||
else if (RetZExt)
|
||||
AssertKind = ISD::AssertZext;
|
||||
|
||||
if (AssertKind != ISD::DELETED_NODE)
|
||||
RetVal = DAG.getNode(AssertKind, MVT::i64, RetVal,
|
||||
DAG.getValueType(RetTyVT));
|
||||
|
||||
RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user