summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2011-04-01 03:34:54 +0000
committerDuncan Sands <baldrick@free.fr>2011-04-01 03:34:54 +0000
commit2d3cdd686b76b4b7815e621f2cd6e19b61c01723 (patch)
treedf566aabb33032e069ab18f3a3e6f804a1b1e0a4
parent8a05f661396a231908508fefd1b4bcb60bf3f490 (diff)
downloadbcm5719-llvm-2d3cdd686b76b4b7815e621f2cd6e19b61c01723.tar.gz
bcm5719-llvm-2d3cdd686b76b4b7815e621f2cd6e19b61c01723.zip
While testing dragonegg I noticed that isCastable and getCastOpcode
had gotten out of sync: isCastable didn't think it was possible to cast the x86_mmx type to anything, while it did think it possible to cast an i64 to x86_mmx. llvm-svn: 128705
-rw-r--r--llvm/lib/VMCore/Instructions.cpp16
-rw-r--r--llvm/unittests/VMCore/InstructionsTest.cpp13
2 files changed, 25 insertions, 4 deletions
diff --git a/llvm/lib/VMCore/Instructions.cpp b/llvm/lib/VMCore/Instructions.cpp
index d1290281cb1..622edde5124 100644
--- a/llvm/lib/VMCore/Instructions.cpp
+++ b/llvm/lib/VMCore/Instructions.cpp
@@ -2297,8 +2297,12 @@ bool CastInst::isCastable(const Type *SrcTy, const Type *DestTy) {
if (const VectorType *SrcPTy = dyn_cast<VectorType>(SrcTy)) {
// Casting from vector
return DestPTy->getBitWidth() == SrcPTy->getBitWidth();
- } else { // Casting from something else
- return DestPTy->getBitWidth() == SrcBits;
+ } else if (DestPTy->getBitWidth() == SrcBits) {
+ return true; // float/int -> vector
+ } else if (SrcTy->isX86_MMXTy()) {
+ return DestPTy->getBitWidth() == 64; // MMX to 64-bit vector
+ } else {
+ return false;
}
} else if (DestTy->isPointerTy()) { // Casting to pointer
if (SrcTy->isPointerTy()) { // Casting from pointer
@@ -2308,8 +2312,12 @@ bool CastInst::isCastable(const Type *SrcTy, const Type *DestTy) {
} else { // Casting from something else
return false;
}
- } else if (DestTy->isX86_MMXTy()) {
- return SrcBits == 64;
+ } else if (DestTy->isX86_MMXTy()) {
+ if (const VectorType *SrcPTy = dyn_cast<VectorType>(SrcTy)) {
+ return SrcPTy->getBitWidth() == 64; // 64-bit vector to MMX
+ } else {
+ return false;
+ }
} else { // Casting to something else
return false;
}
diff --git a/llvm/unittests/VMCore/InstructionsTest.cpp b/llvm/unittests/VMCore/InstructionsTest.cpp
index 1d1127d863b..d286c73d5c6 100644
--- a/llvm/unittests/VMCore/InstructionsTest.cpp
+++ b/llvm/unittests/VMCore/InstructionsTest.cpp
@@ -107,5 +107,18 @@ TEST(InstructionsTest, BranchInst) {
delete bb1;
}
+TEST(InstructionsTest, CastInst) {
+ LLVMContext &C(getGlobalContext());
+
+ const Type* Int8Ty = Type::getInt8Ty(C);
+ const Type* Int64Ty = Type::getInt64Ty(C);
+ const Type* V8x8Ty = VectorType::get(Int8Ty, 8);
+ const Type* X86MMXTy = Type::getX86_MMXTy(C);
+
+ EXPECT_TRUE(CastInst::isCastable(V8x8Ty, X86MMXTy));
+ EXPECT_TRUE(CastInst::isCastable(X86MMXTy, V8x8Ty));
+ EXPECT_FALSE(CastInst::isCastable(Int64Ty, X86MMXTy));
+}
+
} // end anonymous namespace
} // end namespace llvm
OpenPOWER on IntegriCloud