本文整理汇总了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;未经允许,请勿转载。 |
请发表评论