Lines Matching defs:Builder
27 /// remainder, which will have the sign of the dividend. Builder's insert point
29 /// instruction. This will generate a urem in the process, and Builder's insert
33 IRBuilder<> &Builder) {
35 ConstantInt *Shift = Builder.getIntN(BitWidth, BitWidth - 1);
49 Dividend = Builder.CreateFreeze(Dividend);
50 Divisor = Builder.CreateFreeze(Divisor);
51 Value *DividendSign = Builder.CreateAShr(Dividend, Shift);
52 Value *DivisorSign = Builder.CreateAShr(Divisor, Shift);
53 Value *DvdXor = Builder.CreateXor(Dividend, DividendSign);
54 Value *DvsXor = Builder.CreateXor(Divisor, DivisorSign);
55 Value *UDividend = Builder.CreateSub(DvdXor, DividendSign);
56 Value *UDivisor = Builder.CreateSub(DvsXor, DivisorSign);
57 Value *URem = Builder.CreateURem(UDividend, UDivisor);
58 Value *Xored = Builder.CreateXor(URem, DividendSign);
59 Value *SRem = Builder.CreateSub(Xored, DividendSign);
62 Builder.SetInsertPoint(URemInst);
69 /// remainder. Builder's insert point should be pointing where the caller wants
71 /// the process, and Builder's insert point will be pointing at the udiv (if
74 IRBuilder<> &Builder) {
82 Dividend = Builder.CreateFreeze(Dividend);
83 Divisor = Builder.CreateFreeze(Divisor);
84 Value *Quotient = Builder.CreateUDiv(Dividend, Divisor);
85 Value *Product = Builder.CreateMul(Divisor, Quotient);
86 Value *Remainder = Builder.CreateSub(Dividend, Product);
89 Builder.SetInsertPoint(UDiv);
95 /// towards 0. Builder's insert point should be pointing where the caller wants
97 /// the process, and Builder's insert point will be pointing at the udiv (if
100 IRBuilder<> &Builder) {
104 ConstantInt *Shift = Builder.getIntN(BitWidth, BitWidth - 1);
119 Dividend = Builder.CreateFreeze(Dividend);
120 Divisor = Builder.CreateFreeze(Divisor);
121 Value *Tmp = Builder.CreateAShr(Dividend, Shift);
122 Value *Tmp1 = Builder.CreateAShr(Divisor, Shift);
123 Value *Tmp2 = Builder.CreateXor(Tmp, Dividend);
124 Value *U_Dvnd = Builder.CreateSub(Tmp2, Tmp);
125 Value *Tmp3 = Builder.CreateXor(Tmp1, Divisor);
126 Value *U_Dvsr = Builder.CreateSub(Tmp3, Tmp1);
127 Value *Q_Sgn = Builder.CreateXor(Tmp1, Tmp);
128 Value *Q_Mag = Builder.CreateUDiv(U_Dvnd, U_Dvsr);
129 Value *Tmp4 = Builder.CreateXor(Q_Mag, Q_Sgn);
130 Value *Q = Builder.CreateSub(Tmp4, Q_Sgn);
133 Builder.SetInsertPoint(UDiv);
139 /// Returns the quotient, rounded towards 0. Builder's insert point should
142 IRBuilder<> &Builder) {
156 ConstantInt *True = Builder.getTrue();
158 BasicBlock *IBB = Builder.GetInsertBlock();
195 BasicBlock *SpecialCases = Builder.GetInsertBlock();
197 BasicBlock *End = SpecialCases->splitBasicBlock(Builder.GetInsertPoint(),
199 BasicBlock *LoopExit = BasicBlock::Create(Builder.getContext(),
201 BasicBlock *DoWhile = BasicBlock::Create(Builder.getContext(),
203 BasicBlock *Preheader = BasicBlock::Create(Builder.getContext(),
205 BasicBlock *BB1 = BasicBlock::Create(Builder.getContext(),
228 Builder.SetInsertPoint(SpecialCases);
229 Divisor = Builder.CreateFreeze(Divisor);
230 Dividend = Builder.CreateFreeze(Dividend);
231 Value *Ret0_1 = Builder.CreateICmpEQ(Divisor, Zero);
232 Value *Ret0_2 = Builder.CreateICmpEQ(Dividend, Zero);
233 Value *Ret0_3 = Builder.CreateOr(Ret0_1, Ret0_2);
234 Value *Tmp0 = Builder.CreateCall(CTLZ, {Divisor, True});
235 Value *Tmp1 = Builder.CreateCall(CTLZ, {Dividend, True});
236 Value *SR = Builder.CreateSub(Tmp0, Tmp1);
237 Value *Ret0_4 = Builder.CreateICmpUGT(SR, MSB);
238 Value *Ret0 = Builder.CreateLogicalOr(Ret0_3, Ret0_4);
239 Value *RetDividend = Builder.CreateICmpEQ(SR, MSB);
240 Value *RetVal = Builder.CreateSelect(Ret0, Zero, Dividend);
241 Value *EarlyRet = Builder.CreateLogicalOr(Ret0, RetDividend);
242 Builder.CreateCondBr(EarlyRet, End, BB1);
250 Builder.SetInsertPoint(BB1);
251 Value *SR_1 = Builder.CreateAdd(SR, One);
252 Value *Tmp2 = Builder.CreateSub(MSB, SR);
253 Value *Q = Builder.CreateShl(Dividend, Tmp2);
254 Value *SkipLoop = Builder.CreateICmpEQ(SR_1, Zero);
255 Builder.CreateCondBr(SkipLoop, LoopExit, Preheader);
261 Builder.SetInsertPoint(Preheader);
262 Value *Tmp3 = Builder.CreateLShr(Dividend, SR_1);
263 Value *Tmp4 = Builder.CreateAdd(Divisor, NegOne);
264 Builder.CreateBr(DoWhile);
284 Builder.SetInsertPoint(DoWhile);
285 PHINode *Carry_1 = Builder.CreatePHI(DivTy, 2);
286 PHINode *SR_3 = Builder.CreatePHI(DivTy, 2);
287 PHINode *R_1 = Builder.CreatePHI(DivTy, 2);
288 PHINode *Q_2 = Builder.CreatePHI(DivTy, 2);
289 Value *Tmp5 = Builder.CreateShl(R_1, One);
290 Value *Tmp6 = Builder.CreateLShr(Q_2, MSB);
291 Value *Tmp7 = Builder.CreateOr(Tmp5, Tmp6);
292 Value *Tmp8 = Builder.CreateShl(Q_2, One);
293 Value *Q_1 = Builder.CreateOr(Carry_1, Tmp8);
294 Value *Tmp9 = Builder.CreateSub(Tmp4, Tmp7);
295 Value *Tmp10 = Builder.CreateAShr(Tmp9, MSB);
296 Value *Carry = Builder.CreateAnd(Tmp10, One);
297 Value *Tmp11 = Builder.CreateAnd(Tmp10, Divisor);
298 Value *R = Builder.CreateSub(Tmp7, Tmp11);
299 Value *SR_2 = Builder.CreateAdd(SR_3, NegOne);
300 Value *Tmp12 = Builder.CreateICmpEQ(SR_2, Zero);
301 Builder.CreateCondBr(Tmp12, LoopExit, DoWhile);
309 Builder.SetInsertPoint(LoopExit);
310 PHINode *Carry_2 = Builder.CreatePHI(DivTy, 2);
311 PHINode *Q_3 = Builder.CreatePHI(DivTy, 2);
312 Value *Tmp13 = Builder.CreateShl(Q_3, One);
313 Value *Q_4 = Builder.CreateOr(Carry_2, Tmp13);
314 Builder.CreateBr(End);
319 Builder.SetInsertPoint(End, End->begin());
320 PHINode *Q_5 = Builder.CreatePHI(DivTy, 2);
359 IRBuilder<> Builder(Rem);
366 Rem->getOperand(1), Builder);
369 bool IsInsertPoint = Rem->getIterator() == Builder.GetInsertPoint();
376 // Builder insertion point was unchanged
380 BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint());
385 Rem->getOperand(1), Builder);
392 if (BinaryOperator *UDiv = dyn_cast<BinaryOperator>(Builder.GetInsertPoint())) {
411 IRBuilder<> Builder(Div);
419 Div->getOperand(1), Builder);
422 bool IsInsertPoint = Div->getIterator() == Builder.GetInsertPoint();
429 // Builder insertion point was unchanged
433 BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint());
440 Builder);
473 IRBuilder<> Builder(Rem);
479 Type *Int32Ty = Builder.getInt32Ty();
482 ExtDividend = Builder.CreateSExt(Rem->getOperand(0), Int32Ty);
483 ExtDivisor = Builder.CreateSExt(Rem->getOperand(1), Int32Ty);
484 ExtRem = Builder.CreateSRem(ExtDividend, ExtDivisor);
486 ExtDividend = Builder.CreateZExt(Rem->getOperand(0), Int32Ty);
487 ExtDivisor = Builder.CreateZExt(Rem->getOperand(1), Int32Ty);
488 ExtRem = Builder.CreateURem(ExtDividend, ExtDivisor);
490 Trunc = Builder.CreateTrunc(ExtRem, RemTy);
519 IRBuilder<> Builder(Rem);
525 Type *Int64Ty = Builder.getInt64Ty();
528 ExtDividend = Builder.CreateSExt(Rem->getOperand(0), Int64Ty);
529 ExtDivisor = Builder.CreateSExt(Rem->getOperand(1), Int64Ty);
530 ExtRem = Builder.CreateSRem(ExtDividend, ExtDivisor);
532 ExtDividend = Builder.CreateZExt(Rem->getOperand(0), Int64Ty);
533 ExtDivisor = Builder.CreateZExt(Rem->getOperand(1), Int64Ty);
534 ExtRem = Builder.CreateURem(ExtDividend, ExtDivisor);
536 Trunc = Builder.CreateTrunc(ExtRem, RemTy);
568 IRBuilder<> Builder(Div);
574 Type *Int32Ty = Builder.getInt32Ty();
577 ExtDividend = Builder.CreateSExt(Div->getOperand(0), Int32Ty);
578 ExtDivisor = Builder.CreateSExt(Div->getOperand(1), Int32Ty);
579 ExtDiv = Builder.CreateSDiv(ExtDividend, ExtDivisor);
581 ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int32Ty);
582 ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int32Ty);
583 ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);
585 Trunc = Builder.CreateTrunc(ExtDiv, DivTy);
614 IRBuilder<> Builder(Div);
620 Type *Int64Ty = Builder.getInt64Ty();
623 ExtDividend = Builder.CreateSExt(Div->getOperand(0), Int64Ty);
624 ExtDivisor = Builder.CreateSExt(Div->getOperand(1), Int64Ty);
625 ExtDiv = Builder.CreateSDiv(ExtDividend, ExtDivisor);
627 ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int64Ty);
628 ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int64Ty);
629 ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);
631 Trunc = Builder.CreateTrunc(ExtDiv, DivTy);