Lines Matching refs:pseudo

211 static struct storage_hash *find_storage_hash(pseudo_t pseudo, struct storage_hash_list *list)
215 if (entry->pseudo == pseudo)
221 static struct storage_hash *find_or_create_hash(pseudo_t pseudo, struct storage_hash_list **listp)
225 entry = find_storage_hash(pseudo, *listp);
228 entry->pseudo = pseudo;
320 * Can we re-generate the pseudo, so that we don't need to
326 static int can_regenerate(struct bb_state *state, pseudo_t pseudo)
330 switch (pseudo->type) {
336 in = find_storage_hash(pseudo, state->inputs);
339 in = find_storage_hash(pseudo, state->internal);
346 static void flush_one_pseudo(struct bb_state *state, struct hardreg *hardreg, pseudo_t pseudo)
351 if (can_regenerate(state, pseudo))
354 output_comment(state, "flushing %s from %s", show_pseudo(pseudo), hardreg->name);
355 out = find_storage_hash(pseudo, state->internal);
357 out = find_storage_hash(pseudo, state->outputs);
359 out = find_or_create_hash(pseudo, &state->internal);
369 out = find_or_create_hash(pseudo, &state->internal);
384 pseudo_t pseudo;
392 FOR_EACH_PTR_TAG(reg->contains, pseudo) {
393 if (CURRENT_TAG(pseudo) & TAG_DEAD)
395 if (!(CURRENT_TAG(pseudo) & TAG_DIRTY))
397 flush_one_pseudo(state, reg, pseudo);
398 } END_FOR_EACH_PTR(pseudo);
402 static struct storage_hash *find_pseudo_storage(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
406 src = find_storage_hash(pseudo, state->internal);
408 src = find_storage_hash(pseudo, state->inputs);
410 src = find_storage_hash(pseudo, state->outputs);
425 * Incoming pseudo with out any pre-set storage allocation?
441 static void mark_reg_dead(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
446 if (p != pseudo)
450 output_comment(state, "marking pseudo %s in reg %s dead", show_pseudo(pseudo), reg->name);
456 static void add_pseudo_reg(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
458 output_comment(state, "added pseudo %s to reg %s", show_pseudo(pseudo), reg->name);
459 add_ptr_list_tag(&reg->contains, pseudo, TAG_DIRTY);
487 static struct hardreg *target_reg(struct bb_state *state, pseudo_t pseudo, pseudo_t target)
517 add_pseudo_reg(state, pseudo, reg);
521 static struct hardreg *find_in_reg(struct bb_state *state, pseudo_t pseudo)
531 if (p == pseudo) {
533 output_comment(state, "found pseudo %s in reg %s (busy=%d)", show_pseudo(pseudo), reg->name, reg->busy);
541 static void flush_pseudo(struct bb_state *state, pseudo_t pseudo, struct storage *storage)
543 struct hardreg *reg = find_in_reg(state, pseudo);
549 static void flush_cc_cache_to_reg(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
560 pseudo_t pseudo = state->cc_target;
562 if (pseudo) {
568 dst = target_reg(state, pseudo, pseudo);
569 flush_cc_cache_to_reg(state, pseudo, dst);
574 static void add_cc_cache(struct bb_state *state, int opcode, pseudo_t pseudo)
577 state->cc_target = pseudo;
583 /* Fill a hardreg with the pseudo it has */
584 static struct hardreg *fill_reg(struct bb_state *state, struct hardreg *hardreg, pseudo_t pseudo)
589 if (state->cc_target == pseudo) {
590 flush_cc_cache_to_reg(state, pseudo, hardreg);
594 switch (pseudo->type) {
596 output_insn(state, "movl $%lld,%s", pseudo->value, hardreg->name);
599 src = find_pseudo_storage(state, pseudo, NULL);
602 output_insn(state, "movl $<%s>,%s", show_pseudo(pseudo), hardreg->name);
608 src = find_or_create_hash(pseudo, &state->internal);
615 flush_pseudo(state, pseudo, src->storage);
622 def = pseudo->def;
627 src = find_pseudo_storage(state, pseudo, hardreg);
631 mark_reg_dead(state, pseudo, hardreg);
635 output_insn(state, "reload %s from %s", hardreg->name, show_pseudo(pseudo));
641 static struct hardreg *getreg(struct bb_state *state, pseudo_t pseudo, pseudo_t target)
645 reg = find_in_reg(state, pseudo);
648 reg = target_reg(state, pseudo, target);
649 return fill_reg(state, reg, pseudo);
715 static struct operand *get_register_operand(struct bb_state *state, pseudo_t pseudo, pseudo_t target)
719 op->reg = getreg(state, pseudo, target);
724 static int get_sym_frame_offset(struct bb_state *state, pseudo_t pseudo)
726 int offset = pseudo->nr;
729 pseudo->nr = offset;
734 static struct operand *get_generic_operand(struct bb_state *state, pseudo_t pseudo)
742 switch (pseudo->type) {
745 op->value = pseudo->value;
749 struct symbol *sym = pseudo->sym;
756 op->offset = get_sym_frame_offset(state, pseudo);
761 reg = find_in_reg(state, pseudo);
768 hash = find_pseudo_storage(state, pseudo, NULL);
796 static const char *generic(struct bb_state *state, pseudo_t pseudo)
799 struct operand *op = get_generic_operand(state, pseudo);
815 reg = target_reg(state, pseudo, NULL);
855 static const char *reg_or_imm(struct bb_state *state, pseudo_t pseudo)
857 switch(pseudo->type) {
859 return show_pseudo(pseudo);
861 return getreg(state, pseudo, NULL)->name;
907 static int is_dead_reg(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
911 if (p == pseudo)
953 * This marks a pseudo dead. It still stays on the hardreg list (the hardreg
957 static void mark_pseudo_dead(struct bb_state *state, pseudo_t pseudo)
962 if (state->cc_target == pseudo)
964 src = find_pseudo_storage(state, pseudo, NULL);
968 mark_reg_dead(state, pseudo, hardregs + i);
995 static void kill_pseudo(struct bb_state *state, pseudo_t pseudo)
1000 output_comment(state, "killing pseudo %s", show_pseudo(pseudo));
1006 if (p != pseudo)
1010 output_comment(state, "removing pseudo %s from reg %s",
1011 show_pseudo(pseudo), reg->name);
1160 pseudo_t pseudo;
1258 pseudo_t pseudo = entry->pseudo;
1266 string = getreg(state, pseudo, NULL)->name;
1271 orig = find_in_reg(state, pseudo);
1275 fill_reg(state, reg, pseudo);
1279 string = generic(state, pseudo);
1283 output_insn(state, "# asm input \"%s\": %s : %s", constraint, show_pseudo(pseudo), string);
1287 arg->pseudo = NULL;
1300 pseudo_t pseudo = entry->pseudo;
1311 reg = target_reg(state, pseudo, NULL);
1312 arg->pseudo = pseudo;
1318 output_insn(state, "# asm output \"%s\": %s : %s", constraint, show_pseudo(pseudo), string);
1380 * code. On use, the "def" of the pseudo will be
1466 static void write_reg_to_storage(struct bb_state *state, struct hardreg *reg, pseudo_t pseudo, struct storage *storage)
1523 static void fill_output(struct bb_state *state, pseudo_t pseudo, struct storage *out)
1529 /* Is that pseudo a constant value? */
1530 switch (pseudo->type) {
1532 write_val_to_storage(state, pseudo, out);
1535 def = pseudo->def;
1537 write_val_to_storage(state, pseudo, out);
1544 /* See if we have that pseudo in a register.. */
1550 if (p == pseudo) {
1551 write_reg_to_storage(state, reg, pseudo, out);
1558 in = find_storage_hash(pseudo, state->internal);
1560 in = find_storage_hash(pseudo, state->inputs);
1583 static int final_pseudo_flush(struct bb_state *state, pseudo_t pseudo, struct hardreg *reg)
1590 * Since this pseudo is live at exit, we'd better have output
1593 hash = find_storage_hash(pseudo, state->outputs);
1636 add_pseudo_reg(state, pseudo, dst);
1658 if (p == entry->pseudo) {
1665 /* Try to write back the pseudo to where it should go ... */
1679 fill_output(state, entry->pseudo, entry->storage);
1699 output_comment(state, "incoming %s in %s", show_pseudo(entry->pseudo), name);
1702 add_pseudo_reg(state, entry->pseudo, hardregs + regno);
1717 output_comment(state, "%s <- %s", show_pseudo(entry->pseudo), show_storage(entry->storage));
1721 output_comment(state, "%s <-> %s", show_pseudo(entry->pseudo), show_storage(entry->storage));
1725 output_comment(state, "%s -> %s", show_pseudo(entry->pseudo), show_storage(entry->storage));
1745 * parents to pass in another pseudo in one of those
1855 pseudo_t pseudo = ret->src;
1857 if (pseudo && pseudo != VOID) {
1858 struct storage *out = lookup_storage(bb, pseudo, STOR_OUT);
1861 add_storage(out, bb, pseudo, STOR_OUT);
1876 pseudo_t pseudo = insn->cond;
1877 struct storage *out = lookup_storage(bb, pseudo, STOR_OUT);
1880 add_storage(out, bb, pseudo, STOR_OUT);