diff options
author | Chad Rosier <mcrosier@apple.com> | 2011-11-08 00:03:32 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2011-11-08 00:03:32 +0000 |
commit | 5de1bea5c90d6a834acdf2c851b6ff9d0659b7dd (patch) | |
tree | efafd6d820aac8d1dadaf17d058bd26a9c76c27f /llvm/lib/Target/ARM/ARMFastISel.cpp | |
parent | 2dc40434aa1635130dcb5407fc3c4229071dc74b (diff) | |
download | bcm5719-llvm-5de1bea5c90d6a834acdf2c851b6ff9d0659b7dd.tar.gz bcm5719-llvm-5de1bea5c90d6a834acdf2c851b6ff9d0659b7dd.zip |
Enable support for returning i1, i8, and i16. Nothing special todo as it's the
callee's responsibility to sign or zero-extend the return value. The additional
test case just checks to make sure the calls are selected (i.e., -fast-isel-abort
doesn't assert).
llvm-svn: 144047
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFastISel.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFastISel.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index c98156e8869..8acdd91a19e 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/lib/Target/ARM/ARMFastISel.cpp @@ -1697,6 +1697,11 @@ bool ARMFastISel::FinishCall(MVT RetVT, SmallVectorImpl<unsigned> &UsedRegs, } else { assert(RVLocs.size() == 1 &&"Can't handle non-double multi-reg retvals!"); EVT CopyVT = RVLocs[0].getValVT(); + + // Special handling for extended integers. + if (RetVT == MVT::i1 || RetVT == MVT::i8 || RetVT == MVT::i16) + CopyVT = MVT::i32; + TargetRegisterClass* DstRC = TLI.getRegClassFor(CopyVT); unsigned ResultReg = createResultReg(DstRC); @@ -1913,7 +1918,8 @@ bool ARMFastISel::SelectCall(const Instruction *I) { MVT RetVT; if (RetTy->isVoidTy()) RetVT = MVT::isVoid; - else if (!isTypeLegal(RetTy, RetVT)) + else if (!isTypeLegal(RetTy, RetVT) && RetVT != MVT::i16 && + RetVT != MVT::i8 && RetVT != MVT::i1) return false; // TODO: For now if we have long calls specified we don't handle the call. |