static void sparc_sp_sim(ir_node *const node, stack_pointer_state_t *state) { sparc_determine_frameoffset(node, state->offset); if (is_sparc_Save(node)) { sparc_attr_t *const attr = get_sparc_attr(node); if (get_irn_arity(node) == 3) panic("no support for _reg variant yet"); /* Adjust for alignment */ assert(state->misalign == 0); int const prev_offset = state->offset; int const new_offset = prev_offset - state->align_padding - attr->immediate_value; int const aligned = round_up2(new_offset, 1u << state->p2align); attr->immediate_value = -(aligned - prev_offset); state->align_padding = aligned - new_offset; state->offset = aligned; } else if (is_sparc_SubSP(node) || is_sparc_AddSP(node)) { state->align_padding = 0; } else if (is_sparc_RestoreZero(node)) { state->offset = 0; state->align_padding = 0; } }
static void set_irn_sp_bias(ir_node *node, int new_bias) { if (be_is_IncSP(node)) { be_set_IncSP_offset(node, new_bias); } else if (is_sparc_Save(node)) { sparc_attr_t *attr = get_sparc_attr(node); attr->immediate_value = -new_bias; } else if (is_sparc_Restore(node)) { sparc_attr_t *attr = get_sparc_attr(node); attr->immediate_value = new_bias; } }
static int sparc_get_sp_bias(const ir_node *node) { if (be_is_IncSP(node)) return be_get_IncSP_offset(node); if (is_sparc_Save(node)) { const sparc_attr_t *attr = get_sparc_attr_const(node); if (get_irn_arity(node) == 3) panic("no support for _reg variant yet"); return -attr->immediate_value; } if (is_sparc_RestoreZero(node)) return SP_BIAS_RESET; return 0; }