Lines Matching refs:expr

195 static struct storage *x86_address_gen(struct expression *expr);
199 static struct storage *x86_expression(struct expression *expr);
328 static struct regclass *get_regclass(struct expression *expr)
330 return get_regclass_bits(expr->ctype->bit_size);
914 static void emit_scalar(struct expression *expr, unsigned int bit_size)
919 assert(expr->type == EXPR_VALUE);
921 if (expr->value == 0ULL) {
926 ll = (long long) expr->value;
960 struct expression *expr)
967 if (expr->type == EXPR_VALUE) {
971 emit_scalar(expr, sym->bit_size / get_expression_value(base_type->array_size));
974 if (expr->type != EXPR_INITIALIZER)
994 static void sort_array(struct expression *expr)
999 elem = expression_list_size(expr->expr_list);
1013 FOR_EACH_PTR(expr->expr_list, entry) {
1041 FOR_EACH_PTR(expr->expr_list, entry) {
1052 struct expression *expr = sym->initializer;
1065 sort_array(expr);
1067 FOR_EACH_PTR(expr->expr_list, entry) {
1229 static struct storage *emit_compare(struct expression *expr)
1231 struct storage *left = x86_expression(expr->left);
1232 struct storage *right = x86_expression(expr->right);
1236 unsigned int right_bits = expr->right->ctype->bit_size;
1238 switch(expr->op) {
1268 reg2 = get_reg_value(left, get_regclass(expr->left));
1285 static struct storage *emit_value(struct expression *expr)
1292 val->value = (long long) expr->value;
1301 val->value = (long long) expr->value;
1307 static struct storage *emit_divide(struct expression *expr, struct storage *left, struct storage *right)
1320 new = stack_alloc(expr->ctype->bit_size / 8);
1332 if (expr->op == '%')
1341 static struct storage *emit_binop(struct expression *expr)
1343 struct storage *left = x86_expression(expr->left);
1344 struct storage *right = x86_expression(expr->right);
1353 if ((expr->op == '/') || (expr->op == '%'))
1354 return emit_divide(expr, left, right);
1356 is_signed = is_signed_type(expr->ctype);
1358 switch (expr->op) {
1390 warning(expr->pos, "bogus bitwise and for logical op (should use '2*setne + and' or something)");
1394 warning(expr->pos, "bogus bitwise or for logical op (should use 'or + setne' or something)");
1398 error_die(expr->pos, "unhandled binop '%s'\n", show_special(expr->op));
1404 switch (expr->ctype->bit_size) {
1429 new = stack_alloc(expr->ctype->bit_size / 8);
1506 static struct storage *emit_inc_dec(struct expression *expr, int postop)
1508 struct storage *addr = x86_address_gen(expr->unop);
1512 strcpy(opname, opbits(expr->op == SPECIAL_INCREMENT ? "inc" : "dec",
1513 expr->ctype->bit_size));
1518 emit_copy(new, addr, expr->unop->ctype);
1529 static struct storage *emit_postop(struct expression *expr)
1531 return emit_inc_dec(expr, 1);
1537 struct expression *expr = stmt->ret_value;
1540 if (expr && expr->ctype) {
1541 val = x86_expression(expr);
1543 emit_move(val, REG_EAX, expr->ctype, "return");
1554 static struct storage *emit_conditional_expr(struct expression *expr)
1557 struct storage *new = stack_alloc(expr->ctype->bit_size / 8);
1561 cond = x86_expression(expr->conditional);
1565 stot = x86_expression(expr->cond_true);
1567 emit_copy(new, stot, expr->ctype);
1572 stof = x86_expression(expr->cond_false);
1574 emit_copy(new, stof, expr->ctype);
1582 static struct storage *emit_select_expr(struct expression *expr)
1584 struct storage *cond = x86_expression(expr->conditional);
1585 struct storage *stot = x86_expression(expr->cond_true);
1586 struct storage *stof = x86_expression(expr->cond_false);
1591 reg_cond = get_reg_value(cond, get_regclass(expr->conditional));
1592 reg_true = get_reg_value(stot, get_regclass(expr));
1593 reg_false = get_reg_value(stof, get_regclass(expr));
1603 emit_move(reg_true, new, expr->ctype, NULL);
1613 struct expression *expr = sym->initializer;
1620 if (expr == NULL) {
1627 priv->addr = x86_expression(expr);
1634 static struct storage *emit_string_expr(struct expression *expr)
1640 push_cstring(f, expr->string, label);
1648 static struct storage *emit_cast_expr(struct expression *expr)
1651 struct storage *op = x86_expression(expr->cast_expression);
1655 old_type = expr->cast_expression->ctype;
1656 new_type = expr->cast_type;
1671 static struct storage *emit_regular_preop(struct expression *expr)
1673 struct storage *target = x86_expression(expr->unop);
1677 switch (expr->op) {
1682 emit_move(target, REG_EAX, expr->unop->ctype, NULL);
1685 emit_move(REG_EDX, new, expr->unop->ctype, NULL);
1693 emit_move(target, REG_EAX, expr->unop->ctype, NULL);
1695 emit_move(REG_EAX, new, expr->unop->ctype, NULL);
1727 struct expression *expr = case_stmt->case_expression;
1731 if (!expr)
1736 struct storage *case_val = new_val(expr->value);
1738 assert (expr->type == EXPR_VALUE);
2064 static struct storage *x86_call_expression(struct expression *expr)
2073 if (!expr->ctype) {
2074 warning(expr->pos, "\tcall with no type!");
2079 FOR_EACH_PTR_REVERSE(expr->args, arg) {
2098 fn = expr->fn;
2136 static struct storage *x86_address_gen(struct expression *expr)
2143 addr = x86_expression(expr->unop);
2144 if (expr->unop->type == EXPR_SYMBOL)
2159 static struct storage *x86_assignment(struct expression *expr)
2161 struct expression *target = expr->left;
2164 if (!expr->ctype)
2167 val = x86_expression(expr->right);
2174 emit_copy(addr, val, expr->ctype);
2182 emit_move(val, addr, expr->left->ctype, NULL);
2192 static int x86_initialization(struct symbol *sym, struct expression *expr)
2197 if (!expr->ctype)
2200 bits = expr->ctype->bit_size;
2201 val = x86_expression(expr);
2209 static struct storage *x86_access(struct expression *expr)
2211 return x86_address_gen(expr);
2214 static struct storage *x86_preop(struct expression *expr)
2221 if (expr->op == '*')
2222 return x86_access(expr);
2223 if (expr->op == SPECIAL_INCREMENT || expr->op == SPECIAL_DECREMENT)
2224 return emit_inc_dec(expr, 0);
2225 return emit_regular_preop(expr);
2247 struct expression *expr = sym->initializer;
2250 if (expr)
2251 new = x86_expression(expr);
2265 static struct storage *x86_label_expr(struct expression *expr)
2268 printf("\tmovi.%d\t\tv%d,.L%p\n", bits_in_pointer, new->pseudo, expr->label_symbol);
2272 static struct storage *x86_statement_expr(struct expression *expr)
2274 return x86_statement(expr->statement);
2277 static int x86_position_expr(struct expression *expr, struct symbol *base)
2279 struct storage *new = x86_expression(expr->init_expr);
2280 struct symbol *ctype = expr->init_expr->ctype;
2283 expr->init_offset, ctype->bit_offset,
2288 static void x86_initializer_expr(struct expression *expr, struct symbol *ctype)
2292 FOR_EACH_PTR(expr->expr_list, entry) {
2316 static struct storage *x86_expression(struct expression *expr)
2318 if (!expr)
2321 if (!expr->ctype) {
2322 struct position *pos = &expr->pos;
2329 switch (expr->type) {
2333 return x86_call_expression(expr);
2336 return x86_assignment(expr);
2339 return emit_compare(expr);
2343 return emit_binop(expr);
2345 return x86_preop(expr);
2347 return emit_postop(expr);
2349 return emit_symbol_expr_init(expr->symbol);
2353 warning(expr->pos, "invalid expression after evaluation");
2358 return emit_cast_expr(expr);
2360 return emit_value(expr);
2362 return emit_string_expr(expr);
2364 x86_initializer_expr(expr, expr->ctype);
2367 return emit_select_expr(expr);
2369 return emit_conditional_expr(expr);
2371 return x86_statement_expr(expr);
2373 return x86_label_expr(expr);
2378 warning(expr->pos, "unable to show plain initializer position expression");
2381 warning(expr->pos, "unable to show identifier expression");
2384 warning(expr->pos, "unable to show index expression");
2387 warning(expr->pos, "unable to show type expression");
2390 warning(expr->pos, "floating point support is not implemented");