+ return ir_nodemap_get(ir_node, &env->stack_order, node);
+}
+
+void be_free_stackorder(be_stackorder_t *env)
+{
+ ir_nodemap_destroy(&env->stack_order);
+ free(env);
+}
+
+static void create_stores_for_type(ir_graph *irg, ir_type *type)
+{
+ size_t n = get_compound_n_members(type);
+ ir_node *frame = get_irg_frame(irg);
+ ir_node *initial_mem = get_irg_initial_mem(irg);
+ ir_node *mem = initial_mem;
+ ir_node *first_store = NULL;
+ ir_node *start_block = get_irg_start_block(irg);
+ ir_node *args = get_irg_args(irg);
+ size_t i;
+
+ /* all parameter entities left in the frame type require stores.
+ * (The ones passed on the stack have been moved to the arg type) */
+ for (i = 0; i < n; ++i) {
+ ir_entity *entity = get_compound_member(type, i);
+ ir_node *addr;
+ size_t arg;
+ if (!is_parameter_entity(entity))
+ continue;
+
+ arg = get_entity_parameter_number(entity);
+ if (arg == IR_VA_START_PARAMETER_NUMBER)
+ continue;
+
+ addr = new_r_Sel(start_block, mem, frame, 0, NULL, entity);
+ if (entity->attr.parameter.doubleword_low_mode != NULL) {
+ ir_mode *mode = entity->attr.parameter.doubleword_low_mode;
+ ir_node *val0 = new_r_Proj(args, mode, arg);
+ ir_node *val1 = new_r_Proj(args, mode, arg+1);
+ ir_node *store0 = new_r_Store(start_block, mem, addr, val0,
+ cons_none);
+ ir_node *mem0 = new_r_Proj(store0, mode_M, pn_Store_M);
+ size_t offset = get_mode_size_bits(mode)/8;
+ ir_mode *addr_mode = get_irn_mode(addr);
+ ir_node *cnst = new_r_Const_long(irg, addr_mode, offset);
+ ir_node *next_addr = new_r_Add(start_block, addr, cnst, addr_mode);
+ ir_node *store1 = new_r_Store(start_block, mem0, next_addr, val1,
+ cons_none);
+ mem = new_r_Proj(store1, mode_M, pn_Store_M);
+ if (first_store == NULL)
+ first_store = store0;
+ } else {
+ ir_type *tp = get_entity_type(entity);
+ ir_mode *mode = is_compound_type(tp) ? mode_P : get_type_mode(tp);
+ ir_node *val = new_r_Proj(args, mode, arg);
+ ir_node *store = new_r_Store(start_block, mem, addr, val, cons_none);
+ mem = new_r_Proj(store, mode_M, pn_Store_M);
+ if (first_store == NULL)
+ first_store = store;
+ }
+ }
+
+ if (mem != initial_mem)
+ edges_reroute_except(initial_mem, mem, first_store);
+}
+
+void be_add_parameter_entity_stores(ir_graph *irg)
+{
+ ir_type *frame_type = get_irg_frame_type(irg);
+ be_stack_layout_t *layout = be_get_irg_stack_layout(irg);
+ ir_type *between_type = layout->between_type;
+
+ create_stores_for_type(irg, frame_type);
+ if (between_type != NULL) {
+ create_stores_for_type(irg, between_type);
+ }