#include "config.h"
#include <stdint.h>
+#include <stdbool.h>
#include "irnode_t.h"
#include "irgraph_t.h"
//static ir_mode *mode_fp4;
static pmap *node_to_stack;
-static inline int mode_needs_gp_reg(ir_mode *mode)
+static inline bool mode_needs_gp_reg(ir_mode *mode)
{
- return mode_is_int(mode) || mode_is_reference(mode);
+ if (mode_is_int(mode) || mode_is_reference(mode)) {
+ /* we should only see 32bit code */
+ assert(get_mode_size_bits(mode) <= 32);
+ return true;
+ }
+ return false;
}
/**
}
mode1 = get_irn_mode(op1);
mode2 = get_irn_mode(op2);
+ /* we shouldn't see 64bit code */
+ assert(get_mode_size_bits(mode1) <= 32);
+ assert(get_mode_size_bits(mode2) <= 32);
if (is_imm_encodeable(op2)) {
ir_node *new_op1 = be_transform_node(op1);
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);
new_store = create_stf(dbgi, block, new_val, address.ptr, new_mem,
mode, address.entity, address.offset, false);
} else {
+ assert(get_mode_size_bits(mode) <= 32);
match_address(ptr, &address, true);
if (address.ptr2 != NULL) {
assert(address.entity == NULL && address.offset == 0);
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);
dbg_info *dbgi = get_irn_dbg_info(node);
ir_node *mem;
ir_node *start;
- ir_node *sp;
+ir_node *sp;
size_t i;
/* stackpointer is important at function prolog */
}
start = be_prolog_create_start(abihelper, dbgi, new_block);
+#if 0
mem = be_prolog_get_memory(abihelper);
sp = be_prolog_get_reg_value(abihelper, sp_reg);
arch_irn_add_flags(sp, arch_irn_flags_prolog);
be_prolog_set_reg_value(abihelper, sp_reg, sp);
be_prolog_set_memory(abihelper, mem);
+#endif
return start;
}
}
}
+#if 0
/* we need a restore instruction */
if (!cconv->omit_fp) {
ir_node *fp = be_prolog_get_reg_value(abihelper, fp_reg);
arch_irn_add_flags(sp, arch_irn_flags_epilog);
be_epilog_set_reg_value(abihelper, sp_reg, sp);
}
+#endif
bereturn = be_epilog_create_return(abihelper, dbgi, new_block);
- arch_irn_add_flags(bereturn, arch_irn_flags_epilog);
-
return bereturn;
}
return new_r_Bad(get_irn_irg(block));
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;
}