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; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits