• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++ codegen函数代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文整理汇总了C++中codegen函数的典型用法代码示例。如果您正苦于以下问题:C++ codegen函数的具体用法?C++ codegen怎么用?C++ codegen使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。



在下文中一共展示了codegen函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: gen_right

LLVMValueRef gen_right(struct node *ast)
{
	return LLVMBuildLShr(builder,
			codegen(ast->one),
			codegen(ast->two),
			"");
}
开发者ID:dobyrch,项目名称:dbc,代码行数:7,代码来源:codegen.c


示例2: gen_switch

LLVMValueRef gen_switch(struct node *ast)
{
	LLVMValueRef func, switch_;
	LLVMBasicBlockRef this_block, switch_first_block, switch_last_block, end_block;
	int i;

	this_block = LLVMGetInsertBlock(builder);
	func = LLVMGetBasicBlockParent(this_block);
	switch_first_block = LLVMAppendBasicBlock(func, "");
	LLVMPositionBuilderAtEnd(builder, switch_first_block);

	case_count = 0;
	codegen(ast->two);

	switch_last_block = LLVMGetLastBasicBlock(func);
	end_block = LLVMAppendBasicBlock(func, "");

	LLVMPositionBuilderAtEnd(builder, switch_last_block);
	LLVMBuildBr(builder, end_block);

	LLVMPositionBuilderAtEnd(builder, this_block);
	switch_ = LLVMBuildSwitch(builder, codegen(ast->one), end_block, case_count);

	for (i = 0; i < case_count; i++)
		LLVMAddCase(switch_, case_vals[i], case_blocks[i]);

	LLVMPositionBuilderAtEnd(builder, end_block);

	return NULL;
}
开发者ID:dobyrch,项目名称:dbc,代码行数:30,代码来源:codegen.c


示例3: gen_div

LLVMValueRef gen_div(struct node *ast)
{
	return LLVMBuildSDiv(builder,
			codegen(ast->one),
			codegen(ast->two),
			"");
}
开发者ID:dobyrch,项目名称:dbc,代码行数:7,代码来源:codegen.c


示例4: gen_mod

LLVMValueRef gen_mod(struct node *ast)
{
	return LLVMBuildSRem(builder,
			codegen(ast->one),
			codegen(ast->two),
			"");
}
开发者ID:dobyrch,项目名称:dbc,代码行数:7,代码来源:codegen.c


示例5: gen_if

LLVMValueRef gen_if(struct node *ast)
{
	LLVMValueRef condition, func;
	LLVMBasicBlockRef then_block, else_block, end;

	condition = codegen(ast->one);
	condition = LLVMBuildICmp(builder, LLVMIntNE, condition, CONST(0), "");
	func = LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder));

	then_block = LLVMAppendBasicBlock(func, "");
	else_block = LLVMAppendBasicBlock(func, "");
	end = LLVMAppendBasicBlock(func, "");
	LLVMBuildCondBr(builder, condition, then_block, else_block);

	LLVMPositionBuilderAtEnd(builder, then_block);
	codegen(ast->two);
	LLVMBuildBr(builder, end);

	LLVMPositionBuilderAtEnd(builder, else_block);
	if (ast->three)
		codegen(ast->three);
	LLVMBuildBr(builder, end);

	LLVMPositionBuilderAtEnd(builder, end);

	return NULL;
}
开发者ID:dobyrch,项目名称:dbc,代码行数:27,代码来源:codegen.c


示例6: gen_auto

LLVMValueRef gen_auto(struct node *ast)
{
	codegen(ast->one);
	codegen(ast->two);

	return NULL;
}
开发者ID:dobyrch,项目名称:dbc,代码行数:7,代码来源:codegen.c


示例7: gen_case

LLVMValueRef gen_case(struct node *ast)
{
	LLVMValueRef func;
	LLVMBasicBlockRef this_block, next_block;

	this_block = LLVMGetInsertBlock(builder);
	func = LLVMGetBasicBlockParent(this_block);
	next_block = LLVMAppendBasicBlock(func, "");
	LLVMMoveBasicBlockAfter(next_block, this_block);

	case_blocks[case_count] = next_block;
	case_vals[case_count] = codegen(ast->one);

	LLVMBuildBr(builder, next_block);
	LLVMPositionBuilderAtEnd(builder, next_block);

	case_count++;

	if (case_count >= MAX_CASES)
		generror(">c");

	codegen(ast->two);

	return NULL;
}
开发者ID:dobyrch,项目名称:dbc,代码行数:25,代码来源:codegen.c


示例8: assert

Value *ClastExpCodeGen::codegen(const clast_reduction *r, Type *Ty) {
  assert((r->type == clast_red_min || r->type == clast_red_max ||
          r->type == clast_red_sum) && "Clast reduction type not supported");
  Value *old = codegen(r->elts[0], Ty);

  for (int i = 1; i < r->n; ++i) {
    Value *exprValue = codegen(r->elts[i], Ty);

    switch (r->type) {
    case clast_red_min: {
      Value *cmp = Builder.CreateICmpSLT(old, exprValue);
      old = Builder.CreateSelect(cmp, old, exprValue);
      break;
    }
    case clast_red_max: {
      Value *cmp = Builder.CreateICmpSGT(old, exprValue);
      old = Builder.CreateSelect(cmp, old, exprValue);
      break;
    }
    case clast_red_sum:
      old = Builder.CreateAdd(old, exprValue);
      break;
    }
  }

  return old;
}
开发者ID:tepelmann,项目名称:polly,代码行数:27,代码来源:CodeGeneration.cpp


示例9: CHECK

llvm::Value* Executor::codegenArrayAt(const Analyzer::BinOper* array_at, const CompilationOptions& co) {
  const auto arr_expr = array_at->get_left_operand();
  const auto idx_expr = array_at->get_right_operand();
  const auto& idx_ti = idx_expr->get_type_info();
  CHECK(idx_ti.is_integer());
  auto idx_lvs = codegen(idx_expr, true, co);
  CHECK_EQ(size_t(1), idx_lvs.size());
  auto idx_lv = idx_lvs.front();
  if (idx_ti.get_logical_size() < 8) {
    idx_lv = cgen_state_->ir_builder_.CreateCast(
        llvm::Instruction::CastOps::SExt, idx_lv, get_int_type(64, cgen_state_->context_));
  }
  const auto& array_ti = arr_expr->get_type_info();
  CHECK(array_ti.is_array());
  const auto& elem_ti = array_ti.get_elem_type();
  const std::string array_at_fname{
      elem_ti.is_fp() ? "array_at_" + std::string(elem_ti.get_type() == kDOUBLE ? "double_checked" : "float_checked")
                      : "array_at_int" + std::to_string(elem_ti.get_logical_size() * 8) + "_t_checked"};
  const auto ret_ty = elem_ti.is_fp() ? (elem_ti.get_type() == kDOUBLE ? llvm::Type::getDoubleTy(cgen_state_->context_)
                                                                       : llvm::Type::getFloatTy(cgen_state_->context_))
                                      : get_int_type(elem_ti.get_logical_size() * 8, cgen_state_->context_);
  const auto arr_lvs = codegen(arr_expr, true, co);
  CHECK_EQ(size_t(1), arr_lvs.size());
  return cgen_state_->emitExternalCall(array_at_fname,
                                       ret_ty,
                                       {arr_lvs.front(),
                                        posArg(arr_expr),
                                        idx_lv,
                                        elem_ti.is_fp() ? static_cast<llvm::Value*>(inlineFpNull(elem_ti))
                                                        : static_cast<llvm::Value*>(inlineIntNull(elem_ti))});
}
开发者ID:kanak,项目名称:mapd-core,代码行数:31,代码来源:ArrayIR.cpp


示例10: FNTRACE

void IRGenerator::accept(MatchStmt& stmt)
{
    FNTRACE();

    Value* cond = codegen(stmt.condition());
    BasicBlock* contBlock = createBlock("match.cont");
    MatchInstr* matchInstr = createMatch(stmt.op(), cond);

    for (const MatchCase& one: stmt.cases()) {
        BasicBlock* bb = createBlock("match.case");
        setInsertPoint(bb);
        codegen(one.second.get());
        createBr(contBlock);

        for (auto& labelNode: one.first) {
            Constant* label = getConstant(labelNode.get());
            matchInstr->addCase(label, bb);
        }
    }

    if (stmt.elseStmt()) {
        BasicBlock* elseBlock = createBlock("match.else");
        setInsertPoint(elseBlock);
        codegen(stmt.elseStmt());
        createBr(contBlock);

        matchInstr->setElseBlock(elseBlock);
    }

    setInsertPoint(contBlock);
}
开发者ID:TwinkleStars,项目名称:x0,代码行数:31,代码来源:IRGenerator.cpp


示例11: codegen

void CodeGen_X86::visit(const EQ *op) {
    Type t = op->a.type();
    int bits = t.lanes() * t.bits();
    if (t.lanes() == 1 || bits % 128 == 0) {
        // LLVM is fine for native vector widths or scalars
        CodeGen_Posix::visit(op);
    } else {
        // Non-native vector widths get legalized poorly by llvm. We
        // split it up ourselves.
        Value *a = codegen(op->a), *b = codegen(op->b);

        int slice_size = 128 / t.bits();
        if (target.has_feature(Target::AVX) && bits > 128) {
            slice_size = 256 / t.bits();
        }

        vector<Value *> result;
        for (int i = 0; i < op->type.lanes(); i += slice_size) {
            Value *sa = slice_vector(a, i, slice_size);
            Value *sb = slice_vector(b, i, slice_size);
            Value *slice_value;
            if (t.is_float()) {
                slice_value = builder->CreateFCmpOEQ(sa, sb);
            } else {
                slice_value = builder->CreateICmpEQ(sa, sb);
            }
            result.push_back(slice_value);
        }

        value = concat_vectors(result);
        value = slice_vector(value, 0, t.lanes());
    }
}
开发者ID:chathurawidanage,项目名称:Halide,代码行数:33,代码来源:CodeGen_X86.cpp


示例12: codegen

void CodeGen_X86::visit(const Select *op) {
    if (op->condition.type().is_vector()) {
        // LLVM handles selects on vector conditions much better at native width
        Value *cond = codegen(op->condition);
        Value *true_val = codegen(op->true_value);
        Value *false_val = codegen(op->false_value);
        Type t = op->true_value.type();
        int slice_size = 128 / t.bits();
        if (slice_size < t.lanes()) {
            slice_size = target.natural_vector_size(t);
        }

        vector<Value *> result;
        for (int i = 0; i < t.lanes(); i += slice_size) {
            Value *st = slice_vector(true_val, i, slice_size);
            Value *sf = slice_vector(false_val, i, slice_size);
            Value *sc = slice_vector(cond, i, slice_size);
            Value *slice_value = builder->CreateSelect(sc, st, sf);
            result.push_back(slice_value);
        }

        value = concat_vectors(result);
        value = slice_vector(value, 0, t.lanes());
    } else {
        CodeGen_Posix::visit(op);
    }
}
开发者ID:white-pony,项目名称:Halide,代码行数:27,代码来源:CodeGen_X86.cpp


示例13: genlst

int genlst(Error_printer *err, char **argv, Pseudo ** initv, char *quote, Node * n)
{
	switch (n->what) {
		case nEMPTY: {
			return 0;
		} case nADDR: {
			quote[0] = 1;
			return genlst(err, argv, initv, quote, n->r);
		} case nPAREN: {
			return genlst(err, argv, initv, quote, n->r);
		} case nSEMI: case nCOMMA: case nCALL: {
			int x = genlst(err, argv, initv, quote, n->l);
			return x + genlst(err, argv + x, initv + x, quote + x, n->r);
/*		} case nCALL: {
			if (n->l->what == nNAM && n->r->what == nEMPTY)
				return argv[0] = strdup(n->l->s), initv[0] = 0, 1;
			break;
*/
		} case nNAM: {
			return argv[0] = strdup(n->s), initv[0] = 0, 1;
		} case nSET: {
			if (n->l->what == nNAM)
				return argv[0] = strdup(n->l->s), initv[0] = codegen(err, n->r), 1;
			else if (n->l->what == nADDR && n->l->r->what == nNAM) {
				quote[0] = 1;
				return argv[0] = strdup(n->l->r->s), initv[0] = codegen(err, n->r), 1;
			}
			break;
		}
	}
	error_3(err, "\"%s\" %d: incorrect argument list %s", n->loc->name, n->loc->line, what_tab[n->what].name);
	return 0;
}
开发者ID:jhallen,项目名称:ivy,代码行数:33,代码来源:ivy_codegen.c


示例14: gen_left

LLVMValueRef gen_left(struct node *ast)
{
	return LLVMBuildShl(builder,
			codegen(ast->one),
			codegen(ast->two),
			"");
}
开发者ID:dobyrch,项目名称:dbc,代码行数:7,代码来源:codegen.c


示例15: lvalue_index

static LLVMValueRef lvalue_index(struct node *ast)
{
	LLVMValueRef ptr;

	ptr = LLVMBuildAdd(builder, codegen(ast->one), codegen(ast->two), "");

	return rvalue_to_lvalue(ptr);
}
开发者ID:dobyrch,项目名称:dbc,代码行数:8,代码来源:codegen.c


示例16: genMod

static ValueType genMod(Func *, Cons *cons, CodeBuilder *cb, int sp) {
	codegen(cons, cb, sp);
	cons = cons->cdr;
	for(; cons != NULL; cons = cons->cdr) {
		codegen(cons, cb, sp + 1);
		cb->createIMod(sp, sp + 1);
	}
	return VT_INT;
}
开发者ID:wakama2,项目名称:lisp2,代码行数:9,代码来源:codegen.cpp


示例17: gen_inits

LLVMValueRef gen_inits(struct node *ast)
{
	codegen(ast->one);

	if (ast->two)
		codegen(ast->two);

	return NULL;
}
开发者ID:dobyrch,项目名称:dbc,代码行数:9,代码来源:codegen.c


示例18: gen_ge

LLVMValueRef gen_ge(struct node *ast)
{
	LLVMValueRef truth;

	truth = LLVMBuildICmp(builder,
			LLVMIntSGE,
			codegen(ast->one),
			codegen(ast->two),
			"");

	return LLVMBuildZExt(builder, truth, TYPE_INT, "");
}
开发者ID:dobyrch,项目名称:dbc,代码行数:12,代码来源:codegen.c


示例19: switch

Value *ClastExpCodeGen::codegen(const clast_expr *e, Type *Ty) {
  switch (e->type) {
  case clast_expr_name:
    return codegen((const clast_name *)e, Ty);
  case clast_expr_term:
    return codegen((const clast_term *)e, Ty);
  case clast_expr_bin:
    return codegen((const clast_binary *)e, Ty);
  case clast_expr_red:
    return codegen((const clast_reduction *)e, Ty);
  }

  llvm_unreachable("Unknown clast expression!");
}
开发者ID:tepelmann,项目名称:polly,代码行数:14,代码来源:CodeGeneration.cpp


示例20: gen_u8_cvt

static void
gen_u8_cvt(const casemap &cm, const char *ftmpl)
{
	static const struct {
		unsigned	first, last;
	} u8r[] = {
		{0, 0x7f},
		{0x80, 0x7ff},
		{0x800, 0xffff},
		{0x10000, 0x1fffff}
	};
	for (unsigned i = 0; i < sizeof(u8r) / sizeof(*u8r); i++) {
		casemap::const_iterator b, e;
		char fname[1024];
		snprintf(fname, sizeof(fname), "%s_%04X_%04X.h", ftmpl, u8r[i].first, u8r[i].last);
		FILE *out = fopen(fname, "w");
		if (!out) {
			perror("fopen");
			exit(EXIT_FAILURE);
		}
		fprintf(out, "do {\n");
		b = cm.lower_bound(u8r[i].first);
		if (b != cm.end()) {
			e = cm.upper_bound(u8r[i].last);
			codegen(b, e, out, "ic", gen_var_cb, spanu8);
		}
		fprintf(out, "} while (0);\n");
		fclose(out);
	}
}
开发者ID:radioneko,项目名称:ucase,代码行数:30,代码来源:cf.cpp



注:本文中的codegen函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++ codegen_finishfun函数代码示例发布时间:2022-05-30
下一篇:
C++ codec_init函数代码示例发布时间:2022-05-30
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap