Revert "CodeGeneration: Implement ceild/floord exactly as CLooG does"

I think I did not get the implementation right. As the current implementation
works well, we will just stick with it for now.

llvm-svn: 150691
This commit is contained in:
Tobias Grosser 2012-02-16 14:13:19 +00:00
parent ea51f62e4b
commit 9a44b97913
1 changed files with 13 additions and 31 deletions

View File

@ -802,43 +802,25 @@ Value *ClastExpCodeGen::codegen(const clast_binary *e, Type *Ty) {
return Builder.CreateSRem(LHS, RHS);
case clast_bin_fdiv:
{
// floord(N,D) ((N<0) ? -((-N+D-1)/D) : N/D)
Value *N = LHS;
Value *D = RHS;
// floord(n,d) ((n < 0) ? (n - d + 1) : n) / d
Value *One = ConstantInt::get(Ty, 1);
Value *Zero = ConstantInt::get(Ty, 0);
Value *NegativeCase = Builder.CreateNeg(N);
NegativeCase = Builder.CreateAdd(NegativeCase, D);
NegativeCase = Builder.CreateSub(NegativeCase, One);
NegativeCase = Builder.CreateSDiv(NegativeCase, NegativeCase);
Value *PositiveCase = Builder.CreateSDiv(N, D);
Value *IsNegative = Builder.CreateICmpSLT(N, Zero);
return Builder.CreateSelect(IsNegative, NegativeCase, PositiveCase);
Value *Sum1 = Builder.CreateSub(LHS, RHS);
Value *Sum2 = Builder.CreateAdd(Sum1, One);
Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
Value *Dividend = Builder.CreateSelect(isNegative, Sum2, LHS);
return Builder.CreateSDiv(Dividend, RHS);
}
case clast_bin_cdiv:
{
// ceild(N,D) ( (N<0) ? -((-N)/D) : (N+D-1)/D)
Value *N = LHS;
Value *D = RHS;
// ceild(n,d) ((n < 0) ? n : (n + d - 1)) / d
Value *One = ConstantInt::get(Ty, 1);
Value *Zero = ConstantInt::get(Ty, 0);
Value *MinusOne = ConstantInt::getSigned(Ty, -1);
Value *NegativeCase = Builder.CreateNeg(N);
NegativeCase = Builder.CreateSDiv(NegativeCase, D);
NegativeCase = Builder.CreateNeg(NegativeCase);
Value *PositiveCase = Builder.CreateAdd(N, D);
PositiveCase = Builder.CreateAdd(PositiveCase, MinusOne);
PositiveCase = Builder.CreateSDiv(PositiveCase, D);
Value *IsNegative = Builder.CreateICmpSLT(N, Zero);
return Builder.CreateSelect(IsNegative, NegativeCase, PositiveCase);
Value *Sum1 = Builder.CreateAdd(LHS, RHS);
Value *Sum2 = Builder.CreateSub(Sum1, One);
Value *isNegative = Builder.CreateICmpSLT(LHS, Zero);
Value *Dividend = Builder.CreateSelect(isNegative, LHS, Sum2);
return Builder.CreateSDiv(Dividend, RHS);
}
case clast_bin_div:
return Builder.CreateSDiv(LHS, RHS);