mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 00:24:26 +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:
@ -119,8 +119,9 @@ namespace {
|
||||
virtual std::vector<SDOperand>
|
||||
LowerArguments(Function &F, SelectionDAG &DAG);
|
||||
virtual std::pair<SDOperand, SDOperand>
|
||||
LowerCallTo(SDOperand Chain, const Type *RetTy, bool RetTyIsSigned,
|
||||
bool isVarArg, unsigned CC, bool isTailCall, SDOperand Callee,
|
||||
LowerCallTo(SDOperand Chain, const Type *RetTy,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
unsigned CC, bool isTailCall, SDOperand Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG);
|
||||
virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
|
||||
MachineBasicBlock *MBB);
|
||||
@ -481,8 +482,8 @@ SparcTargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
|
||||
|
||||
std::pair<SDOperand, SDOperand>
|
||||
SparcTargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
|
||||
bool RetTyIsSigned, bool isVarArg, unsigned CC,
|
||||
bool isTailCall, SDOperand Callee,
|
||||
bool RetSExt, bool RetZExt, bool isVarArg,
|
||||
unsigned CC, bool isTailCall, SDOperand Callee,
|
||||
ArgListTy &Args, SelectionDAG &DAG) {
|
||||
// Count the size of the outgoing arguments.
|
||||
unsigned ArgsSize = 0;
|
||||
@ -646,11 +647,16 @@ SparcTargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
|
||||
Chain = RetVal.getValue(1);
|
||||
|
||||
// Add a note to keep track of whether it is sign or zero extended.
|
||||
ISD::NodeType AssertKind = ISD::AssertZext;
|
||||
if (RetTyIsSigned)
|
||||
ISD::NodeType AssertKind = ISD::DELETED_NODE;
|
||||
if (RetSExt)
|
||||
AssertKind = ISD::AssertSext;
|
||||
RetVal = DAG.getNode(AssertKind, MVT::i32, RetVal,
|
||||
DAG.getValueType(RetTyVT));
|
||||
else if (RetZExt)
|
||||
AssertKind = ISD::AssertZext;
|
||||
|
||||
if (AssertKind != ISD::DELETED_NODE)
|
||||
RetVal = DAG.getNode(AssertKind, MVT::i32, RetVal,
|
||||
DAG.getValueType(RetTyVT));
|
||||
|
||||
RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal);
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user