mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Refactoring removing cast types.
This commit is contained in:
@@ -1475,35 +1475,12 @@ void llvm_emit_cast(GenContext *c, CastKind cast_kind, Expr *expr, BEValue *valu
|
||||
value->value = LLVMBuildIsNotNull(c->builder, value->value, "ptrbool");
|
||||
value->kind = BE_BOOLEAN;
|
||||
break;
|
||||
case CAST_BOOLFP:
|
||||
llvm_value_rvalue(c, value);
|
||||
value->value = LLVMBuildUIToFP(c->builder, value->value, llvm_get_type(c, to_type), "boolfp");
|
||||
value->kind = BE_VALUE;
|
||||
break;
|
||||
case CAST_FPFP:
|
||||
llvm_value_rvalue(c, value);
|
||||
value->value = type_convert_will_trunc(to_type, from_type)
|
||||
? LLVMBuildFPTrunc(c->builder, value->value, llvm_get_type(c, to_type), "fpfptrunc")
|
||||
: LLVMBuildFPExt(c->builder, value->value, llvm_get_type(c, to_type), "fpfpext");
|
||||
break;
|
||||
case CAST_FPINT:
|
||||
llvm_value_rvalue(c, value);
|
||||
if (type_is_signed(to_type))
|
||||
{
|
||||
value->value = LLVMBuildFPToSI(c->builder, value->value, llvm_get_type(c, to_type), "fpsi");
|
||||
break;
|
||||
}
|
||||
value->value = LLVMBuildFPToUI(c->builder, value->value, llvm_get_type(c, to_type), "fpui");
|
||||
break;
|
||||
case CAST_INTFP:
|
||||
llvm_value_rvalue(c, value);
|
||||
if (type_is_signed(value->type))
|
||||
{
|
||||
value->value = LLVMBuildSIToFP(c->builder, value->value, llvm_get_type(c, to_type), "sifp");
|
||||
break;
|
||||
}
|
||||
value->value = LLVMBuildUIToFP(c->builder, value->value, llvm_get_type(c, to_type), "uifp");
|
||||
break;
|
||||
case CAST_IDPTR:
|
||||
case CAST_ERPTR:
|
||||
case CAST_INTPTR:
|
||||
@@ -7291,6 +7268,28 @@ void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr)
|
||||
case EXPR_MAKE_ANY:
|
||||
llvm_emit_make_any(c, value, expr);
|
||||
return;
|
||||
case EXPR_FLOAT_TO_INT:
|
||||
llvm_emit_expr(c, value, expr->inner_expr);
|
||||
llvm_value_rvalue(c, value);
|
||||
if (type_is_signed(type_lowering(expr->type)))
|
||||
{
|
||||
llvm_value_set(value, LLVMBuildFPToSI(c->builder, value->value, llvm_get_type(c, expr->type), "fpsi"), expr->type);
|
||||
return;
|
||||
}
|
||||
llvm_value_set(value, LLVMBuildFPToUI(c->builder, value->value, llvm_get_type(c, expr->type), "fpui"), expr->type);
|
||||
return;
|
||||
case EXPR_INT_TO_FLOAT:
|
||||
llvm_emit_expr(c, value, expr->inner_expr);
|
||||
llvm_value_rvalue(c, value);
|
||||
if (type_is_signed(value->type))
|
||||
{
|
||||
llvm_value_set(value, LLVMBuildSIToFP(c->builder, value->value, llvm_get_type(c, expr->type), "sifp"), expr->type);
|
||||
}
|
||||
else
|
||||
{
|
||||
llvm_value_set(value, LLVMBuildUIToFP(c->builder, value->value, llvm_get_type(c, expr->type), "uifp"), expr->type);
|
||||
}
|
||||
return;
|
||||
case EXPR_DISCARD:
|
||||
llvm_value_set(value, NULL, type_void);
|
||||
llvm_emit_ignored_expr(c, expr->inner_expr);
|
||||
|
||||
Reference in New Issue
Block a user