ir_node *new_load = NULL;
address_t address;
+ if (get_Load_unaligned(node) == align_non_aligned) {
+ panic("sparc: transformation of unaligned Loads not implemented yet");
+ }
+
if (mode_is_float(mode)) {
match_address(ptr, &address, false);
new_load = create_ldf(dbgi, block, address.ptr, new_mem, mode,
ir_node *new_store = NULL;
address_t address;
+ if (get_Store_unaligned(node) == align_non_aligned) {
+ panic("sparc: transformation of unaligned Stores not implemented yet");
+ }
+
if (mode_is_float(mode)) {
/* TODO: variants with reg+reg address mode */
match_address(ptr, &address, false);
{
ir_entity *entity = create_float_const_entity(tv);
ir_node *hi = new_bd_sparc_SetHi(dbgi, block, entity, 0);
- ir_node *mem = new_r_NoMem(current_ir_graph);
+ ir_node *mem = get_irg_no_mem(current_ir_graph);
ir_mode *mode = get_tarval_mode(tv);
ir_node *new_op
= create_ldf(dbgi, block, hi, mem, mode, entity, 0, false);
{
ir_node *hi = new_bd_sparc_SetHi(dbgi, block, entity, offset);
ir_node *low = new_bd_sparc_Or_imm(dbgi, block, hi, entity, offset);
+
+ if (get_entity_owner(entity) == get_tls_type())
+ panic("thread local storage not supported yet in sparc backend");
return low;
}
index = new_bd_sparc_Sll_imm(dbgi, block, new_selector, NULL, 2);
/* load from jumptable */
load = new_bd_sparc_Ld_reg(dbgi, block, table_address, index,
- new_r_NoMem(current_ir_graph),
+ get_irg_no_mem(current_ir_graph),
mode_gp);
address = new_r_Proj(load, mode_gp, pn_sparc_Ld_res);
{
ir_graph *irg = get_irn_irg(block);
ir_node *sp = get_irg_frame(irg);
- ir_node *nomem = new_r_NoMem(irg);
+ ir_node *nomem = get_irg_no_mem(irg);
ir_node *stf = create_stf(dbgi, block, ftoi, sp, nomem, src_mode,
NULL, 0, true);
ir_node *ld = new_bd_sparc_Ld_imm(dbgi, block, sp, stf, mode_gp,
{
ir_graph *irg = get_irn_irg(block);
ir_node *sp = get_irg_frame(irg);
- ir_node *nomem = new_r_NoMem(irg);
+ ir_node *nomem = get_irg_no_mem(irg);
ir_node *st = new_bd_sparc_St_imm(dbgi, block, op, sp, nomem,
mode_gp, NULL, 0, true);
ir_node *ldf = new_bd_sparc_Ldf_s(dbgi, block, sp, st, mode_fp,
layout->arg_type = arg_type;
layout->initial_offset = 0;
layout->initial_bias = 0;
- layout->stack_dir = -1;
layout->sp_relative = cconv->omit_fp;
assert(N_FRAME_TYPES == 3);
ir_node *block = get_nodes_block(node);
ir_node *new_block = be_transform_node(block);
dbg_info *dbgi = get_irn_dbg_info(node);
- ir_node *mem;
ir_node *start;
- ir_node *sp;
size_t i;
/* stackpointer is important at function prolog */
}
start = be_prolog_create_start(abihelper, dbgi, new_block);
- mem = be_prolog_get_memory(abihelper);
- sp = be_prolog_get_reg_value(abihelper, sp_reg);
-
- if (!cconv->omit_fp) {
- ir_node *save = new_bd_sparc_Save_imm(NULL, block, sp, NULL,
- -SPARC_MIN_STACKSIZE);
- arch_irn_add_flags(save, arch_irn_flags_prolog);
- arch_set_irn_register(save, sp_reg);
- sp = save;
- keep_alive(save);
- }
-
- sp = be_new_IncSP(sp_reg, new_block, sp, BE_STACK_FRAME_SIZE_EXPAND, 0);
- arch_irn_add_flags(sp, arch_irn_flags_prolog);
- be_prolog_set_reg_value(abihelper, sp_reg, sp);
- be_prolog_set_memory(abihelper, mem);
-
return start;
}
}
}
- /* we need a restore instruction */
- if (!cconv->omit_fp) {
- ir_node *fp = be_prolog_get_reg_value(abihelper, fp_reg);
- ir_node *restore = new_bd_sparc_RestoreZero(NULL, block, fp);
- arch_irn_add_flags(restore, arch_irn_flags_epilog);
- arch_set_irn_register(restore, sp_reg);
- be_epilog_set_reg_value(abihelper, sp_reg, restore);
- } else {
- /* epilog code: an incsp */
- sp = be_epilog_get_reg_value(abihelper, sp_reg);
- sp = be_new_IncSP(sp_reg, new_block, sp,
- BE_STACK_FRAME_SIZE_SHRINK, 0);
- arch_irn_add_flags(sp, arch_irn_flags_epilog);
- be_epilog_set_reg_value(abihelper, sp_reg, sp);
- }
-
bereturn = be_epilog_create_return(abihelper, dbgi, new_block);
- arch_irn_add_flags(bereturn, arch_irn_flags_epilog);
-
return bereturn;
}
{
ir_graph *irg = current_ir_graph;
ir_node *sp = get_irg_frame(irg);
- ir_node *nomem = new_r_NoMem(irg);
+ ir_node *nomem = get_irg_no_mem(irg);
ir_node *st = new_bd_sparc_St_imm(dbgi, block, value0, sp, nomem,
mode_gp, NULL, 0, true);
ir_mode *mode;
{
ir_graph *irg = current_ir_graph;
ir_node *stack = get_irg_frame(irg);
- ir_node *nomem = new_r_NoMem(irg);
+ ir_node *nomem = get_irg_no_mem(irg);
ir_node *stf = create_stf(dbgi, block, node, stack, nomem, float_mode,
NULL, 0, true);
int bits = get_mode_size_bits(float_mode);
case pn_Start_M:
return be_prolog_get_memory(abihelper);
case pn_Start_T_args:
- /* we should never need this explicitely */
- return new_r_Bad(get_irn_irg(block));
+ break;
case pn_Start_P_frame_base:
return get_frame_base();
- case pn_Start_P_tls:
- return new_r_Bad(current_ir_graph);
case pn_Start_max:
break;
}
case pn_Call_X_regular:
case pn_Call_X_except:
case pn_Call_T_result:
- case pn_Call_P_value_res_base:
case pn_Call_max:
break;
}