[llvm-commits] [llvm-gcc-4.2] r45754 - /llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
Chris Lattner
sabre at nondot.org
Tue Jan 8 13:00:46 PST 2008
Author: lattner
Date: Tue Jan 8 15:00:44 2008
New Revision: 45754
URL: http://llvm.org/viewvc/llvm-project?rev=45754&view=rev
Log:
Fix the MMX related shift/rotate regressions (PR1902)
Patch by Anders Carlsson, thanks!
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp?rev=45754&r1=45753&r2=45754&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386.cpp Tue Jan 8 15:00:44 2008
@@ -79,7 +79,10 @@
case IX86_BUILTIN_PSLLWI: {
Function *psllw =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psll_w);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psllw, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -97,7 +100,10 @@
case IX86_BUILTIN_PSLLDI: {
Function *pslld =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psll_d);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(pslld, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -114,7 +120,10 @@
case IX86_BUILTIN_PSLLQI: {
Function *psllq =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psll_q);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psllq, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -132,7 +141,10 @@
case IX86_BUILTIN_PSRLWI: {
Function *psrlw =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psrl_w);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psrlw, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -150,7 +162,10 @@
case IX86_BUILTIN_PSRLDI: {
Function *psrld =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psrl_d);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psrld, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -167,7 +182,10 @@
case IX86_BUILTIN_PSRLQI: {
Function *psrlq =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psrl_q);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psrlq, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -185,7 +203,10 @@
case IX86_BUILTIN_PSRAWI: {
Function *psraw =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psra_w);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psraw, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
@@ -203,7 +224,10 @@
case IX86_BUILTIN_PSRADI: {
Function *psrad =
Intrinsic::getDeclaration(TheModule, Intrinsic::x86_mmx_psra_d);
- Ops[1] = BuildVector(Ops[1], UndefValue::get(Type::Int32Ty), NULL);
+ Ops[1] = Builder.CreateZExt(Ops[1], Type::Int64Ty, "zext");
+ Ops[1] = Builder.CreateBitCast(Ops[1],
+ VectorType::get(Type::Int64Ty, 1),
+ "bitcast");
Result = Builder.CreateCall(psrad, Ops.begin(), Ops.begin()+2, "tmp");
Result = Builder.CreateBitCast(Result, ResultType, "tmp");
return true;
More information about the llvm-commits
mailing list