LLVMValueRef gen_int(compile_t* c, ast_t* ast) { ast_t* type = ast_type(ast); gentype_t g; if(!gentype(c, type, &g)) return NULL; __uint128_t value = ast_int(ast); uint64_t low, high; #if !defined(HAVE_STRUCT_INT128) low = (uint64_t)value; high = (uint64_t)(value >> 64); #else low = value.low; high = value.high; #endif LLVMValueRef vlow = LLVMConstInt(c->i128, low, false); LLVMValueRef vhigh = LLVMConstInt(c->i128, high, false); LLVMValueRef shift = LLVMConstInt(c->i128, 64, false); vhigh = LLVMConstShl(vhigh, shift); vhigh = LLVMConstAdd(vhigh, vlow); if(g.primitive == c->i128) return vhigh; if((g.primitive == c->f32) || (g.primitive == c->f64)) return LLVMConstUIToFP(vhigh, g.primitive); return LLVMConstTrunc(vhigh, g.primitive); }
LLVMValueRef gen_simpledef(struct node *ast) { LLVMValueRef global, init; global = find_or_add_global(ast->one->val); init = LLVMConstShl(codegen(ast->two), CONST(WORDPOW)); LLVMSetInitializer(global, init); return NULL; }
LLVMValueRef gen_shl(compile_t* c, ast_t* left, ast_t* right) { LLVMValueRef l_value = gen_expr(c, left); LLVMValueRef r_value = gen_expr(c, right); if((l_value == NULL) || (r_value == NULL)) return NULL; if(LLVMIsConstant(l_value) && LLVMIsConstant(r_value)) return LLVMConstShl(l_value, r_value); return LLVMBuildShl(c->builder, l_value, r_value, ""); }
LLVMValueRef gen_int(compile_t* c, ast_t* ast) { ast_t* type = ast_type(ast); reach_type_t* t = reach_type(c->reach, type); lexint_t* value = ast_int(ast); LLVMValueRef vlow = LLVMConstInt(c->i128, value->low, false); LLVMValueRef vhigh = LLVMConstInt(c->i128, value->high, false); LLVMValueRef shift = LLVMConstInt(c->i128, 64, false); vhigh = LLVMConstShl(vhigh, shift); vhigh = LLVMConstAdd(vhigh, vlow); if(t->primitive == c->i128) return vhigh; if((t->primitive == c->f32) || (t->primitive == c->f64)) return LLVMConstUIToFP(vhigh, t->primitive); return LLVMConstTrunc(vhigh, t->primitive); }
LLVMValueRef gen_int(compile_t* c, ast_t* ast) { ast_t* type = deferred_reify(c->frame->reify, ast_type(ast), c->opt); reach_type_t* t = reach_type(c->reach, type); ast_free_unattached(type); compile_type_t* c_t = (compile_type_t*)t->c_type; lexint_t* value = ast_int(ast); LLVMValueRef vlow = LLVMConstInt(c->i128, value->low, false); LLVMValueRef vhigh = LLVMConstInt(c->i128, value->high, false); LLVMValueRef shift = LLVMConstInt(c->i128, 64, false); vhigh = LLVMConstShl(vhigh, shift); vhigh = LLVMConstAdd(vhigh, vlow); if(c_t->primitive == c->i128) return vhigh; if((c_t->primitive == c->f32) || (c_t->primitive == c->f64)) return LLVMConstUIToFP(vhigh, c_t->primitive); return LLVMConstTrunc(vhigh, c_t->primitive); }