From b5e76028cd32f7f1cabfb640adcd6fa1b14a88c7 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Tue, 25 Apr 2006 12:37:23 +0000 Subject: optimize apply with >1 arguments --- cgsas.c | 26 ++++++++++++++++++++++++++ cgswas.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/cgsas.c b/cgsas.c index 5a7bba5..9f60c7e 100644 --- a/cgsas.c +++ b/cgsas.c @@ -2734,6 +2734,28 @@ static void as_indirect_node_entry_jumps (struct label_node *label_node) as_indirect_node_entry_jumps (label_node->label_node_right); } +#ifdef NEW_APPLY +extern LABEL *add_empty_node_labels[]; + +static void as_apply_update_entry (struct basic_block *block) +{ + if (block->block_n_node_arguments==-200){ + as_i_bica (0,A_COND); + as_branch_label (block->block_ea_label,BRANCH_RELOCATION); + as_nop(); + as_nop(); + as_nop(); + } else { + as_dec (4,B_STACK_POINTER); + as_i_call (0); + as_branch_label (add_empty_node_labels[block->block_n_node_arguments+200],CALL_RELOCATION); + as_st (REGISTER_O7,0,B_STACK_POINTER); + as_i_bica (0,A_COND); + as_branch_label (block->block_ea_label,BRANCH_RELOCATION); + } +} +#endif + void write_code (void) { struct basic_block *block; @@ -2815,6 +2837,10 @@ void write_code (void) as_number_of_arguments (block->block_n_node_arguments); } +#ifdef NEW_APPLY + else if (block->block_n_node_arguments<-100) + as_apply_update_entry (block); +#endif as_labels (block->block_labels); diff --git a/cgswas.c b/cgswas.c index 4ad8992..c738280 100644 --- a/cgswas.c +++ b/cgswas.c @@ -2546,9 +2546,9 @@ static void w_as_indirect_node_entry_jump (LABEL *label) w_as_instruction_without_parameters ("nop"); } -static void w_as_indirect_node_entry_jumps (register struct label_node *label_node) +static void w_as_indirect_node_entry_jumps (struct label_node *label_node) { - register LABEL *label; + LABEL *label; if (label_node==NULL) return; @@ -2568,6 +2568,42 @@ static int next_section_number; extern char *this_module_name; #endif +#ifdef NEW_APPLY +extern LABEL *add_empty_node_labels[]; + +static void w_as_apply_update_entry (struct basic_block *block) +{ + if (block->block_n_node_arguments==-200){ + w_as_opcode ("ba,a"); + w_as_label (block->block_ea_label->label_name); + w_as_newline(); + + w_as_instruction_without_parameters ("nop"); + w_as_instruction_without_parameters ("nop"); + w_as_instruction_without_parameters ("nop"); + } else { + w_as_opcode ("dec"); + w_as_immediate (4); + w_as_comma(); + w_as_register_newline (B_STACK_POINTER); + + w_as_opcode ("call"); + w_as_label (add_empty_node_labels[block->block_n_node_arguments+200]->label_name); + w_as_newline(); + + w_as_opcode ("st"); + w_as_register (REGISTER_O7); + w_as_comma(); + w_as_indirect (0,B_STACK_POINTER); + w_as_newline(); + + w_as_opcode ("ba,a"); + w_as_label (block->block_ea_label->label_name); + w_as_newline(); + } +} +#endif + void write_assembly (VOID) { struct basic_block *block; @@ -2654,6 +2690,10 @@ void write_assembly (VOID) w_as_number_of_arguments (block->block_n_node_arguments); } +#ifdef NEW_APPLY + else if (block->block_n_node_arguments<-100) + w_as_apply_update_entry (block); +#endif w_as_labels (block->block_labels); -- cgit v1.2.3