diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-03-27 17:23:31 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2014-03-27 17:23:31 +0000 |
commit | 0c6d96cf160f2a6c63f59b5ab7e7a6bbe903ede3 (patch) | |
tree | bcda7ed72865ba37d6445d5f04e4b2551bc2fa99 /lib | |
parent | 94687c0f43a409fb8113f8320b4858fb2939ef96 (diff) | |
download | llvm-0c6d96cf160f2a6c63f59b5ab7e7a6bbe903ede3.tar.gz llvm-0c6d96cf160f2a6c63f59b5ab7e7a6bbe903ede3.tar.bz2 llvm-0c6d96cf160f2a6c63f59b5ab7e7a6bbe903ede3.tar.xz |
R600: Implement isZExtFree.
This allows 64-bit operations that are truncated to be reduced
to 32-bit ones.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204946 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/R600/AMDGPUISelLowering.cpp | 16 | ||||
-rw-r--r-- | lib/Target/R600/AMDGPUISelLowering.h | 4 |
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/Target/R600/AMDGPUISelLowering.cpp b/lib/Target/R600/AMDGPUISelLowering.cpp index ba7ce13491..797063d0e1 100644 --- a/lib/Target/R600/AMDGPUISelLowering.cpp +++ b/lib/Target/R600/AMDGPUISelLowering.cpp @@ -275,6 +275,22 @@ bool AMDGPUTargetLowering::isTruncateFree(Type *Source, Type *Dest) const { (Dest->getPrimitiveSizeInBits() % 32 == 0); } +bool AMDGPUTargetLowering::isZExtFree(Type *Src, Type *Dest) const { + const DataLayout *DL = getDataLayout(); + unsigned SrcSize = DL->getTypeSizeInBits(Src->getScalarType()); + unsigned DestSize = DL->getTypeSizeInBits(Dest->getScalarType()); + + return SrcSize == 32 && DestSize == 64; +} + +bool AMDGPUTargetLowering::isZExtFree(EVT Src, EVT Dest) const { + // Any register load of a 64-bit value really requires 2 32-bit moves. For all + // practical purposes, the extra mov 0 to load a 64-bit is free. As used, + // this will enable reducing 64-bit operations the 32-bit, which is always + // good. + return Src == MVT::i32 && Dest == MVT::i64; +} + bool AMDGPUTargetLowering::isNarrowingProfitable(EVT SrcVT, EVT DestVT) const { // There aren't really 64-bit registers, but pairs of 32-bit ones and only a // limited number of native 64-bit operations. Shrinking an operation to fit diff --git a/lib/Target/R600/AMDGPUISelLowering.h b/lib/Target/R600/AMDGPUISelLowering.h index 2d40e26426..48298f2097 100644 --- a/lib/Target/R600/AMDGPUISelLowering.h +++ b/lib/Target/R600/AMDGPUISelLowering.h @@ -87,6 +87,10 @@ public: virtual bool isFNegFree(EVT VT) const override; virtual bool isTruncateFree(EVT Src, EVT Dest) const override; virtual bool isTruncateFree(Type *Src, Type *Dest) const override; + + virtual bool isZExtFree(Type *Src, Type *Dest) const override; + virtual bool isZExtFree(EVT Src, EVT Dest) const override; + virtual bool isNarrowingProfitable(EVT VT1, EVT VT2) const override; virtual MVT getVectorIdxTy() const override; |