Lines Matching full: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) { in generateSignedRemainderCode() argument
35 ConstantInt *Shift = Builder.getIntN(BitWidth, BitWidth - 1); in generateSignedRemainderCode()
49 Dividend = Builder.CreateFreeze(Dividend); in generateSignedRemainderCode()
50 Divisor = Builder.CreateFreeze(Divisor); in generateSignedRemainderCode()
51 Value *DividendSign = Builder.CreateAShr(Dividend, Shift); in generateSignedRemainderCode()
52 Value *DivisorSign = Builder.CreateAShr(Divisor, Shift); in generateSignedRemainderCode()
53 Value *DvdXor = Builder.CreateXor(Dividend, DividendSign); in generateSignedRemainderCode()
54 Value *DvsXor = Builder.CreateXor(Divisor, DivisorSign); in generateSignedRemainderCode()
55 Value *UDividend = Builder.CreateSub(DvdXor, DividendSign); in generateSignedRemainderCode()
56 Value *UDivisor = Builder.CreateSub(DvsXor, DivisorSign); in generateSignedRemainderCode()
57 Value *URem = Builder.CreateURem(UDividend, UDivisor); in generateSignedRemainderCode()
58 Value *Xored = Builder.CreateXor(URem, DividendSign); in generateSignedRemainderCode()
59 Value *SRem = Builder.CreateSub(Xored, DividendSign); in generateSignedRemainderCode()
62 Builder.SetInsertPoint(URemInst); in generateSignedRemainderCode()
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) { in generatedUnsignedRemainderCode() argument
82 Dividend = Builder.CreateFreeze(Dividend); in generatedUnsignedRemainderCode()
83 Divisor = Builder.CreateFreeze(Divisor); in generatedUnsignedRemainderCode()
84 Value *Quotient = Builder.CreateUDiv(Dividend, Divisor); in generatedUnsignedRemainderCode()
85 Value *Product = Builder.CreateMul(Divisor, Quotient); in generatedUnsignedRemainderCode()
86 Value *Remainder = Builder.CreateSub(Dividend, Product); in generatedUnsignedRemainderCode()
89 Builder.SetInsertPoint(UDiv); in generatedUnsignedRemainderCode()
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) { in generateSignedDivisionCode() argument
104 ConstantInt *Shift = Builder.getIntN(BitWidth, BitWidth - 1); in generateSignedDivisionCode()
119 Dividend = Builder.CreateFreeze(Dividend); in generateSignedDivisionCode()
120 Divisor = Builder.CreateFreeze(Divisor); in generateSignedDivisionCode()
121 Value *Tmp = Builder.CreateAShr(Dividend, Shift); in generateSignedDivisionCode()
122 Value *Tmp1 = Builder.CreateAShr(Divisor, Shift); in generateSignedDivisionCode()
123 Value *Tmp2 = Builder.CreateXor(Tmp, Dividend); in generateSignedDivisionCode()
124 Value *U_Dvnd = Builder.CreateSub(Tmp2, Tmp); in generateSignedDivisionCode()
125 Value *Tmp3 = Builder.CreateXor(Tmp1, Divisor); in generateSignedDivisionCode()
126 Value *U_Dvsr = Builder.CreateSub(Tmp3, Tmp1); in generateSignedDivisionCode()
127 Value *Q_Sgn = Builder.CreateXor(Tmp1, Tmp); in generateSignedDivisionCode()
128 Value *Q_Mag = Builder.CreateUDiv(U_Dvnd, U_Dvsr); in generateSignedDivisionCode()
129 Value *Tmp4 = Builder.CreateXor(Q_Mag, Q_Sgn); in generateSignedDivisionCode()
130 Value *Q = Builder.CreateSub(Tmp4, Q_Sgn); in generateSignedDivisionCode()
133 Builder.SetInsertPoint(UDiv); in generateSignedDivisionCode()
139 /// Returns the quotient, rounded towards 0. Builder's insert point should
142 IRBuilder<> &Builder) { in generateUnsignedDivisionCode() argument
156 ConstantInt *True = Builder.getTrue(); in generateUnsignedDivisionCode()
158 BasicBlock *IBB = Builder.GetInsertBlock(); in generateUnsignedDivisionCode()
195 BasicBlock *SpecialCases = Builder.GetInsertBlock(); in generateUnsignedDivisionCode()
197 BasicBlock *End = SpecialCases->splitBasicBlock(Builder.GetInsertPoint(), in generateUnsignedDivisionCode()
199 BasicBlock *LoopExit = BasicBlock::Create(Builder.getContext(), in generateUnsignedDivisionCode()
201 BasicBlock *DoWhile = BasicBlock::Create(Builder.getContext(), in generateUnsignedDivisionCode()
203 BasicBlock *Preheader = BasicBlock::Create(Builder.getContext(), in generateUnsignedDivisionCode()
205 BasicBlock *BB1 = BasicBlock::Create(Builder.getContext(), in generateUnsignedDivisionCode()
228 Builder.SetInsertPoint(SpecialCases); in generateUnsignedDivisionCode()
229 Divisor = Builder.CreateFreeze(Divisor); in generateUnsignedDivisionCode()
230 Dividend = Builder.CreateFreeze(Dividend); in generateUnsignedDivisionCode()
231 Value *Ret0_1 = Builder.CreateICmpEQ(Divisor, Zero); in generateUnsignedDivisionCode()
232 Value *Ret0_2 = Builder.CreateICmpEQ(Dividend, Zero); in generateUnsignedDivisionCode()
233 Value *Ret0_3 = Builder.CreateOr(Ret0_1, Ret0_2); in generateUnsignedDivisionCode()
234 Value *Tmp0 = Builder.CreateCall(CTLZ, {Divisor, True}); in generateUnsignedDivisionCode()
235 Value *Tmp1 = Builder.CreateCall(CTLZ, {Dividend, True}); in generateUnsignedDivisionCode()
236 Value *SR = Builder.CreateSub(Tmp0, Tmp1); in generateUnsignedDivisionCode()
237 Value *Ret0_4 = Builder.CreateICmpUGT(SR, MSB); in generateUnsignedDivisionCode()
238 Value *Ret0 = Builder.CreateLogicalOr(Ret0_3, Ret0_4); in generateUnsignedDivisionCode()
239 Value *RetDividend = Builder.CreateICmpEQ(SR, MSB); in generateUnsignedDivisionCode()
240 Value *RetVal = Builder.CreateSelect(Ret0, Zero, Dividend); in generateUnsignedDivisionCode()
241 Value *EarlyRet = Builder.CreateLogicalOr(Ret0, RetDividend); in generateUnsignedDivisionCode()
242 Builder.CreateCondBr(EarlyRet, End, BB1); in generateUnsignedDivisionCode()
250 Builder.SetInsertPoint(BB1); in generateUnsignedDivisionCode()
251 Value *SR_1 = Builder.CreateAdd(SR, One); in generateUnsignedDivisionCode()
252 Value *Tmp2 = Builder.CreateSub(MSB, SR); in generateUnsignedDivisionCode()
253 Value *Q = Builder.CreateShl(Dividend, Tmp2); in generateUnsignedDivisionCode()
254 Value *SkipLoop = Builder.CreateICmpEQ(SR_1, Zero); in generateUnsignedDivisionCode()
255 Builder.CreateCondBr(SkipLoop, LoopExit, Preheader); in generateUnsignedDivisionCode()
261 Builder.SetInsertPoint(Preheader); in generateUnsignedDivisionCode()
262 Value *Tmp3 = Builder.CreateLShr(Dividend, SR_1); in generateUnsignedDivisionCode()
263 Value *Tmp4 = Builder.CreateAdd(Divisor, NegOne); in generateUnsignedDivisionCode()
264 Builder.CreateBr(DoWhile); in generateUnsignedDivisionCode()
284 Builder.SetInsertPoint(DoWhile); in generateUnsignedDivisionCode()
285 PHINode *Carry_1 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
286 PHINode *SR_3 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
287 PHINode *R_1 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
288 PHINode *Q_2 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
289 Value *Tmp5 = Builder.CreateShl(R_1, One); in generateUnsignedDivisionCode()
290 Value *Tmp6 = Builder.CreateLShr(Q_2, MSB); in generateUnsignedDivisionCode()
291 Value *Tmp7 = Builder.CreateOr(Tmp5, Tmp6); in generateUnsignedDivisionCode()
292 Value *Tmp8 = Builder.CreateShl(Q_2, One); in generateUnsignedDivisionCode()
293 Value *Q_1 = Builder.CreateOr(Carry_1, Tmp8); in generateUnsignedDivisionCode()
294 Value *Tmp9 = Builder.CreateSub(Tmp4, Tmp7); in generateUnsignedDivisionCode()
295 Value *Tmp10 = Builder.CreateAShr(Tmp9, MSB); in generateUnsignedDivisionCode()
296 Value *Carry = Builder.CreateAnd(Tmp10, One); in generateUnsignedDivisionCode()
297 Value *Tmp11 = Builder.CreateAnd(Tmp10, Divisor); in generateUnsignedDivisionCode()
298 Value *R = Builder.CreateSub(Tmp7, Tmp11); in generateUnsignedDivisionCode()
299 Value *SR_2 = Builder.CreateAdd(SR_3, NegOne); in generateUnsignedDivisionCode()
300 Value *Tmp12 = Builder.CreateICmpEQ(SR_2, Zero); in generateUnsignedDivisionCode()
301 Builder.CreateCondBr(Tmp12, LoopExit, DoWhile); in generateUnsignedDivisionCode()
309 Builder.SetInsertPoint(LoopExit); in generateUnsignedDivisionCode()
310 PHINode *Carry_2 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
311 PHINode *Q_3 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
312 Value *Tmp13 = Builder.CreateShl(Q_3, One); in generateUnsignedDivisionCode()
313 Value *Q_4 = Builder.CreateOr(Carry_2, Tmp13); in generateUnsignedDivisionCode()
314 Builder.CreateBr(End); in generateUnsignedDivisionCode()
319 Builder.SetInsertPoint(End, End->begin()); in generateUnsignedDivisionCode()
320 PHINode *Q_5 = Builder.CreatePHI(DivTy, 2); in generateUnsignedDivisionCode()
359 IRBuilder<> Builder(Rem); in expandRemainder() local
366 Rem->getOperand(1), Builder); in expandRemainder()
369 bool IsInsertPoint = Rem->getIterator() == Builder.GetInsertPoint(); in expandRemainder()
376 // Builder insertion point was unchanged in expandRemainder()
380 BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint()); in expandRemainder()
386 Builder); in expandRemainder()
393 if (BinaryOperator *UDiv = dyn_cast<BinaryOperator>(Builder.GetInsertPoint())) { in expandRemainder()
412 IRBuilder<> Builder(Div); in expandDivision() local
420 Div->getOperand(1), Builder); in expandDivision()
423 bool IsInsertPoint = Div->getIterator() == Builder.GetInsertPoint(); in expandDivision()
430 // Builder insertion point was unchanged in expandDivision()
434 BinaryOperator *BO = dyn_cast<BinaryOperator>(Builder.GetInsertPoint()); in expandDivision()
441 Builder); in expandDivision()
474 IRBuilder<> Builder(Rem); in expandRemainderUpTo32Bits() local
480 Type *Int32Ty = Builder.getInt32Ty(); in expandRemainderUpTo32Bits()
483 ExtDividend = Builder.CreateSExt(Rem->getOperand(0), Int32Ty); in expandRemainderUpTo32Bits()
484 ExtDivisor = Builder.CreateSExt(Rem->getOperand(1), Int32Ty); in expandRemainderUpTo32Bits()
485 ExtRem = Builder.CreateSRem(ExtDividend, ExtDivisor); in expandRemainderUpTo32Bits()
487 ExtDividend = Builder.CreateZExt(Rem->getOperand(0), Int32Ty); in expandRemainderUpTo32Bits()
488 ExtDivisor = Builder.CreateZExt(Rem->getOperand(1), Int32Ty); in expandRemainderUpTo32Bits()
489 ExtRem = Builder.CreateURem(ExtDividend, ExtDivisor); in expandRemainderUpTo32Bits()
491 Trunc = Builder.CreateTrunc(ExtRem, RemTy); in expandRemainderUpTo32Bits()
520 IRBuilder<> Builder(Rem); in expandRemainderUpTo64Bits() local
526 Type *Int64Ty = Builder.getInt64Ty(); in expandRemainderUpTo64Bits()
529 ExtDividend = Builder.CreateSExt(Rem->getOperand(0), Int64Ty); in expandRemainderUpTo64Bits()
530 ExtDivisor = Builder.CreateSExt(Rem->getOperand(1), Int64Ty); in expandRemainderUpTo64Bits()
531 ExtRem = Builder.CreateSRem(ExtDividend, ExtDivisor); in expandRemainderUpTo64Bits()
533 ExtDividend = Builder.CreateZExt(Rem->getOperand(0), Int64Ty); in expandRemainderUpTo64Bits()
534 ExtDivisor = Builder.CreateZExt(Rem->getOperand(1), Int64Ty); in expandRemainderUpTo64Bits()
535 ExtRem = Builder.CreateURem(ExtDividend, ExtDivisor); in expandRemainderUpTo64Bits()
537 Trunc = Builder.CreateTrunc(ExtRem, RemTy); in expandRemainderUpTo64Bits()
569 IRBuilder<> Builder(Div); in expandDivisionUpTo32Bits() local
575 Type *Int32Ty = Builder.getInt32Ty(); in expandDivisionUpTo32Bits()
578 ExtDividend = Builder.CreateSExt(Div->getOperand(0), Int32Ty); in expandDivisionUpTo32Bits()
579 ExtDivisor = Builder.CreateSExt(Div->getOperand(1), Int32Ty); in expandDivisionUpTo32Bits()
580 ExtDiv = Builder.CreateSDiv(ExtDividend, ExtDivisor); in expandDivisionUpTo32Bits()
582 ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int32Ty); in expandDivisionUpTo32Bits()
583 ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int32Ty); in expandDivisionUpTo32Bits()
584 ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor); in expandDivisionUpTo32Bits()
586 Trunc = Builder.CreateTrunc(ExtDiv, DivTy); in expandDivisionUpTo32Bits()
615 IRBuilder<> Builder(Div); in expandDivisionUpTo64Bits() local
621 Type *Int64Ty = Builder.getInt64Ty(); in expandDivisionUpTo64Bits()
624 ExtDividend = Builder.CreateSExt(Div->getOperand(0), Int64Ty); in expandDivisionUpTo64Bits()
625 ExtDivisor = Builder.CreateSExt(Div->getOperand(1), Int64Ty); in expandDivisionUpTo64Bits()
626 ExtDiv = Builder.CreateSDiv(ExtDividend, ExtDivisor); in expandDivisionUpTo64Bits()
628 ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int64Ty); in expandDivisionUpTo64Bits()
629 ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int64Ty); in expandDivisionUpTo64Bits()
630 ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor); in expandDivisionUpTo64Bits()
632 Trunc = Builder.CreateTrunc(ExtDiv, DivTy); in expandDivisionUpTo64Bits()