if (env->flags.try_omit_fp) {
/* simply remove the stack frame here */
curr_sp = be_new_IncSP(arch_env->sp, irg, bl, curr_sp, BE_STACK_FRAME_SIZE_SHRINK, 0);
- add_irn_dep(curr_sp, *mem);
} else {
ir_mode *mode_bp = arch_env->bp->reg_class->mode;
static ir_type *ia32_abi_get_between_type(void *self)
{
#define IDENT(s) new_id_from_chars(s, sizeof(s)-1)
- static ir_type *omit_fp_between_type = NULL;
- static ir_type *between_type = NULL;
-
- ia32_abi_env_t *env = self;
+ static ir_type *between_type = NULL;
+ (void) self;
if (! between_type) {
- ir_entity *old_bp_ent;
ir_entity *ret_addr_ent;
- ir_entity *omit_fp_ret_addr_ent;
+ ir_type *ret_addr_type;
- ir_type *old_bp_type = new_type_primitive(IDENT("bp"), mode_Iu);
- ir_type *ret_addr_type = new_type_primitive(IDENT("return_addr"), mode_Iu);
+ ret_addr_type = new_type_primitive(IDENT("return_addr"), mode_Iu);
+ between_type = new_type_struct(IDENT("ia32_between_type"));
+ ret_addr_ent = new_entity(between_type, IDENT("ret_addr"), ret_addr_type);
- between_type = new_type_struct(IDENT("ia32_between_type"));
- old_bp_ent = new_entity(between_type, IDENT("old_bp"), old_bp_type);
- ret_addr_ent = new_entity(between_type, IDENT("ret_addr"), ret_addr_type);
-
- set_entity_offset(old_bp_ent, 0);
- set_entity_offset(ret_addr_ent, get_type_size_bytes(old_bp_type));
- set_type_size_bytes(between_type, get_type_size_bytes(old_bp_type) + get_type_size_bytes(ret_addr_type));
+ set_entity_offset(ret_addr_ent, 0);
+ set_type_size_bytes(between_type, get_type_size_bytes(ret_addr_type));
set_type_state(between_type, layout_fixed);
-
- omit_fp_between_type = new_type_struct(IDENT("ia32_between_type_omit_fp"));
- omit_fp_ret_addr_ent = new_entity(omit_fp_between_type, IDENT("ret_addr"), ret_addr_type);
-
- set_entity_offset(omit_fp_ret_addr_ent, 0);
- set_type_size_bytes(omit_fp_between_type, get_type_size_bytes(ret_addr_type));
- set_type_state(omit_fp_between_type, layout_fixed);
}
- return env->flags.try_omit_fp ? omit_fp_between_type : between_type;
+ return between_type;
#undef IDENT
}
(we assume they are in cache), other memory operations cost 20
cycles.
*/
- if(is_ia32_use_frame(irn) ||
- (is_ia32_NoReg_GP(get_irn_n(irn, 0)) &&
- is_ia32_NoReg_GP(get_irn_n(irn, 1)))) {
+ if (is_ia32_use_frame(irn) || (
+ is_ia32_NoReg_GP(get_irn_n(irn, n_ia32_base)) &&
+ is_ia32_NoReg_GP(get_irn_n(irn, n_ia32_index))
+ )) {
cost += 5;
} else {
cost += 20;
static void ia32_perform_memory_operand(ir_node *irn, ir_node *spill,
unsigned int i)
{
+ ir_mode *load_mode;
+ ir_mode *dest_op_mode;
+
ia32_code_gen_t *cg = ia32_current_cg;
assert(ia32_possible_memory_operand(irn, i) && "Cannot perform memory operand change");
}
set_ia32_op_type(irn, ia32_AddrModeS);
- set_ia32_ls_mode(irn, get_irn_mode(get_irn_n(irn, i)));
+
+ load_mode = get_irn_mode(get_irn_n(irn, i));
+ dest_op_mode = get_ia32_ls_mode(irn);
+ if (get_mode_size_bits(load_mode) <= get_mode_size_bits(dest_op_mode)) {
+ set_ia32_ls_mode(irn, load_mode);
+ }
set_ia32_use_frame(irn);
set_ia32_need_stackent(irn);
set_irn_n(irn, n_ia32_base, get_irg_frame(get_irn_irg(irn)));
set_irn_n(irn, n_ia32_binary_right, ia32_get_admissible_noreg(cg, irn, n_ia32_binary_right));
set_irn_n(irn, n_ia32_mem, spill);
+ set_ia32_is_reload(irn);
/* immediates are only allowed on the right side */
if (i == n_ia32_binary_left && is_ia32_Immediate(get_irn_n(irn, n_ia32_binary_left))) {
/* transform nodes into assembler instructions by PBQP magic */
ia32_transform_graph_by_pbqp(cg);
- if (cg->dump)
- be_dump(cg->irg, "-after_pbqp_transform", dump_ir_block_graph_sched);
set_opt_cse(1);
break;
#endif
if (is_ia32_need_stackent(node) || is_ia32_Load(node)) {
const ir_mode *mode = get_ia32_ls_mode(node);
const ia32_attr_t *attr = get_ia32_attr_const(node);
- int align = get_mode_size_bytes(mode);
+ int align;
+
+ if (is_ia32_is_reload(node)) {
+ mode = get_spill_mode_mode(mode);
+ }
if(attr->data.need_64bit_stackent) {
mode = mode_Ls;
if(attr->data.need_32bit_stackent) {
mode = mode_Is;
}
+ align = get_mode_size_bytes(mode);
be_node_needs_frame_entity(env, node, mode, align);
} else if (is_ia32_vfild(node) || is_ia32_xLoad(node)
|| is_ia32_vfld(node)) {
cc = cc_cdecl_set;
} else {
cc = get_method_calling_convention(method_type);
- if (!(cc & cc_fixed) &&
- get_method_additional_properties(method_type) & mtp_property_private &&
+ if (get_method_additional_properties(method_type) & mtp_property_private &&
ia32_cg_config.optimize_cc) {
/* set the calling conventions to register parameter */
cc = (cc & ~cc_bits) | cc_reg_param;