}
}
-ir_mode *get_atomic_mode(atomic_type_kind_t kind)
-{
- assert(kind <= ATOMIC_TYPE_LAST);
- return atomic_modes[kind];
-}
-
static ir_node *get_vla_size(array_type_t *const type)
{
ir_node *size_node = type->size_node;
return type;
}
+static ir_type *get_ir_type(type_t *type);
+
static ir_type *create_method_type(const function_type_t *function_type, bool for_closure)
{
type_t *return_type = skip_typeref(function_type->return_type);
}
}
-ir_type *get_ir_type(type_t *type)
+static ir_type *get_ir_type(type_t *type)
{
type = skip_typeref(type);
static ir_node *create_cast(unary_expression_t const *const expr)
{
- type_t *const type = skip_typeref(expr->base.type);
- if (is_type_void(type))
- return NULL;
-
type_t *const from_type = skip_typeref(expr->value->base.type);
ir_node *value = is_type_complex(from_type)
? expression_to_complex(expr->value).real
: expression_to_value(expr->value);
+ type_t *const type = skip_typeref(expr->base.type);
+ if (is_type_void(type))
+ return NULL;
+
dbg_info *const dbgi = get_dbg_info(&expr->base.pos);
ir_mode *const mode = get_ir_mode_storage(type);
/* check for conversion from / to __based types */
switch (expr->kind) {
case EXPR_UNARY_CAST:
- if (is_type_atomic(skip_typeref(expr->base.type), ATOMIC_TYPE_BOOL)) {
+ if (!is_type_atomic(skip_typeref(expr->base.type), ATOMIC_TYPE_BOOL))
+ return create_cast(&expr->unary);
+ /* FALLTHROUGH */
case EXPR_BINARY_EQUAL:
case EXPR_BINARY_GREATER:
case EXPR_BINARY_GREATEREQUAL:
case EXPR_BINARY_LOGICAL_AND:
case EXPR_BINARY_LOGICAL_OR:
case EXPR_BINARY_NOTEQUAL:
- case EXPR_UNARY_NOT:;
- jump_target true_target;
- jump_target false_target;
- init_jump_target(&true_target, NULL);
- init_jump_target(&false_target, NULL);
- expression_to_control_flow(expr, &true_target, &false_target);
- return control_flow_to_1_0(expr, &true_target, &false_target);
- } else {
- return create_cast(&expr->unary);
- }
+ case EXPR_UNARY_NOT: {
+ jump_target true_target;
+ jump_target false_target;
+ init_jump_target(&true_target, NULL);
+ init_jump_target(&false_target, NULL);
+ expression_to_control_flow(expr, &true_target, &false_target);
+ return control_flow_to_1_0(expr, &true_target, &false_target);
+ }
case EXPR_BINARY_ADD:
case EXPR_BINARY_BITWISE_AND:
if (is_type_atomic(skip_typeref(expr->base.type), ATOMIC_TYPE_BOOL)) {
expression_to_control_flow(expr->unary.value, true_target, false_target);
return NULL;
- } else {
- default:;
- type_t *const type = skip_typeref(expr->base.type);
- if (is_type_complex(type)) {
- complex_to_control_flow(expr, true_target, false_target);
- return NULL;
- }
-
- dbg_info *const dbgi = get_dbg_info(&expr->base.pos);
- ir_mode *const mode = get_ir_mode_arithmetic(type);
- ir_node *const val = create_conv(dbgi, expression_to_value(expr), mode);
- ir_node *const left = val;
- ir_node *const right = new_Const(get_mode_null(get_irn_mode(val)));
- ir_relation const relation = ir_relation_unordered_less_greater;
- compare_to_control_flow(expr, left, right, relation, true_target, false_target);
- return val;
}
+ /* FALLTHROUGH */
+ default: {
+ type_t *const type = skip_typeref(expr->base.type);
+ if (is_type_complex(type)) {
+ complex_to_control_flow(expr, true_target, false_target);
+ return NULL;
+ }
+
+ dbg_info *const dbgi = get_dbg_info(&expr->base.pos);
+ ir_mode *const mode = get_ir_mode_arithmetic(type);
+ ir_node *const val = create_conv(dbgi, expression_to_value(expr), mode);
+ ir_node *const left = val;
+ ir_node *const right = new_Const(get_mode_null(get_irn_mode(val)));
+ ir_relation const relation = ir_relation_unordered_less_greater;
+ compare_to_control_flow(expr, left, right, relation, true_target, false_target);
+ return val;
+ }
}
}