static std::pair<Value*, Value*> getMul64(IRBuilder<> &Builder, Value *LHS, Value *RHS) { Type *I32Ty = Builder.getInt32Ty(); Type *I64Ty = Builder.getInt64Ty(); Value *LHS_EXT64 = Builder.CreateZExt(LHS, I64Ty); Value *RHS_EXT64 = Builder.CreateZExt(RHS, I64Ty); Value *MUL64 = Builder.CreateMul(LHS_EXT64, RHS_EXT64); Value *Lo = Builder.CreateTrunc(MUL64, I32Ty); Value *Hi = Builder.CreateLShr(MUL64, Builder.getInt64(32)); Hi = Builder.CreateTrunc(Hi, I32Ty); return std::make_pair(Lo, Hi); }
/// compile_get - Emit code for ',' void BrainFTraceRecorder::compile_get(BrainFTraceNode *node, IRBuilder<>& builder) { Value *Ret = builder.CreateCall(getchar_func); Value *Trunc = builder.CreateTrunc(Ret, IntegerType::get(Ret->getContext(), 8)); builder.CreateStore(Ret, Trunc); if (node->left != (BrainFTraceNode*)~0ULL) compile_opcode(node->left, builder); else { HeaderPHI->addIncoming(DataPtr, builder.GetInsertBlock()); builder.CreateBr(Header); } }