case pn_sparc_AddCC_t_flags:
return new_r_Proj(new_pred, mode_flags, pn_sparc_AddCC_flags);
default:
- panic("Invalid AddCC_t proj found");
+ panic("Invalid proj found");
}
}
case pn_sparc_SubCC_t_flags:
return new_r_Proj(new_pred, mode_flags, pn_sparc_SubCC_flags);
default:
- panic("Invalid SubCC_t proj found");
+ panic("Invalid proj found");
}
}
address_t address;
if (get_Load_unaligned(node) == align_non_aligned) {
- panic("sparc: transformation of unaligned Loads not implemented yet");
+ panic("transformation of unaligned Loads not implemented yet");
}
if (mode_is_float(mode)) {
address_t address;
if (get_Store_unaligned(node) == align_non_aligned) {
- panic("sparc: transformation of unaligned Stores not implemented yet");
+ panic("transformation of unaligned Stores not implemented yet");
}
if (mode_is_float(mode)) {
{
ir_mode *mode = get_irn_mode(node);
if (get_mode_modulo_shift(mode) != 32)
- panic("modulo_shift!=32 not supported by sparc backend");
+ panic("modulo_shift!=32 not supported");
return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Sll_reg, new_bd_sparc_Sll_imm);
}
{
ir_mode *mode = get_irn_mode(node);
if (get_mode_modulo_shift(mode) != 32)
- panic("modulo_shift!=32 not supported by sparc backend");
+ panic("modulo_shift!=32 not supported");
return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Srl_reg, new_bd_sparc_Srl_imm);
}
{
ir_mode *mode = get_irn_mode(node);
if (get_mode_modulo_shift(mode) != 32)
- panic("modulo_shift!=32 not supported by sparc backend");
+ panic("modulo_shift!=32 not supported");
return gen_helper_binop(node, MATCH_NONE, new_bd_sparc_Sra_reg, new_bd_sparc_Sra_imm);
}
{
const arch_env_t *arch_env = be_get_irg_arch_env(current_ir_graph);
sparc_isa_t *isa = (sparc_isa_t*) arch_env;
- ir_entity *entity = (ir_entity*) pmap_get(isa->constants, tv);
+ ir_entity *entity = pmap_get(ir_entity, isa->constants, tv);
ir_initializer_t *initializer;
ir_mode *mode;
ir_type *type;
if (mode_is_float(mode)) {
return gen_float_const(dbgi, block, tv);
}
+
+ assert(get_mode_size_bits(get_tarval_mode(tv)) <= 32);
val = (int32_t)get_tarval_long(tv);
- assert((long)val == get_tarval_long(tv));
return create_int_const(block, val);
}
} else {
/* float -> int conv */
if (!mode_is_signed(dst_mode))
- panic("float to unsigned not implemented yet");
+ panic("float to unsigned not lowered");
return create_ftoi(dbgi, block, new_op, src_mode);
}
} else {
}
be_transform_node(stack_pred);
- stack = (ir_node*)pmap_get(node_to_stack, stack_pred);
+ stack = pmap_get(ir_node, node_to_stack, stack_pred);
if (stack == NULL) {
return get_stack_pointer_for(stack_pred);
}
ir_type *type = get_Alloc_type(node);
ir_node *size = get_Alloc_count(node);
ir_node *stack_pred = get_stack_pointer_for(node);
+ ir_node *mem = get_Alloc_mem(node);
+ ir_node *new_mem = be_transform_node(mem);
ir_node *subsp;
+
if (get_Alloc_where(node) != stack_alloc)
panic("only stack-alloc supported in sparc backend (at %+F)", node);
/* lowerer should have transformed all allocas to byte size */
if (is_Const(size)) {
ir_tarval *tv = get_Const_tarval(size);
long sizel = get_tarval_long(tv);
- subsp = be_new_IncSP(sp_reg, new_block, stack_pred, sizel, 0);
- set_irn_dbg_info(subsp, dbgi);
+
+ assert((sizel & (SPARC_STACK_ALIGNMENT - 1)) == 0 && "Found Alloc with misaligned constant");
+ subsp = new_bd_sparc_SubSP_imm(dbgi, new_block, stack_pred, new_mem, NULL, sizel);
} else {
ir_node *new_size = be_transform_node(size);
- subsp = new_bd_sparc_SubSP(dbgi, new_block, stack_pred, new_size);
- arch_set_irn_register(subsp, sp_reg);
+ subsp = new_bd_sparc_SubSP_reg(dbgi, new_block, stack_pred, new_size, new_mem);
}
- /* if we are the last IncSP producer in a block then we have to keep
- * the stack value.
- * Note: This here keeps all producers which is more than necessary */
- keep_alive(subsp);
+ ir_node *stack_proj = new_r_Proj(subsp, mode_gp, pn_sparc_SubSP_stack);
+ arch_set_irn_register(stack_proj, sp_reg);
+ /* If we are the last stack producer in a block, we have to keep the
+ * stack value. This keeps all producers, which is more than necessary. */
+ keep_alive(stack_proj);
- pmap_insert(node_to_stack, node, subsp);
- /* the "result" is the unmodified sp value */
- return stack_pred;
+ pmap_insert(node_to_stack, node, stack_proj);
+
+ return subsp;
}
static ir_node *gen_Proj_Alloc(ir_node *node)
{
- ir_node *alloc = get_Proj_pred(node);
- long pn = get_Proj_proj(node);
+ ir_node *alloc = get_Proj_pred(node);
+ ir_node *new_alloc = be_transform_node(alloc);
+ long pn = get_Proj_proj(node);
switch ((pn_Alloc)pn) {
- case pn_Alloc_M: {
- ir_node *alloc_mem = get_Alloc_mem(alloc);
- return be_transform_node(alloc_mem);
- }
+ case pn_Alloc_M:
+ return new_r_Proj(new_alloc, mode_M, pn_sparc_SubSP_M);
case pn_Alloc_res: {
- ir_node *new_alloc = be_transform_node(alloc);
- return new_alloc;
+ ir_node *addr_proj = new_r_Proj(new_alloc, mode_gp, pn_sparc_SubSP_addr);
+ arch_set_irn_register(addr_proj, arch_get_irn_register(node));
+ return addr_proj;
}
case pn_Alloc_X_regular:
case pn_Alloc_X_except:
- panic("sparc backend: exception output of alloc not supported (at %+F)",
+ panic("exception output of alloc not supported (at %+F)",
node);
}
- panic("sparc backend: invalid Proj->Alloc");
+ panic("invalid Proj->Alloc");
}
static ir_node *gen_Free(ir_node *node)
} else if (is_sparc_fdiv(new_pred)) {
res_mode = get_Div_resmode(pred);
} else {
- panic("sparc backend: Div transformed to something unexpected: %+F",
+ panic("Div transformed to something unexpected: %+F",
new_pred);
}
assert((int)pn_sparc_SDiv_res == (int)pn_sparc_UDiv_res);
/* do code placement, to optimize the position of constants */
place_code(irg);
/* backend expects outedges to be always on */
- edges_assure(irg);
+ assure_edges(irg);
}
void sparc_init_transform(void)