summaryrefslogtreecommitdiff
path: root/cgsas.c
diff options
context:
space:
mode:
authorJohn van Groningen2006-04-25 12:37:23 +0000
committerJohn van Groningen2006-04-25 12:37:23 +0000
commitb5e76028cd32f7f1cabfb640adcd6fa1b14a88c7 (patch)
treea889705a6f6390f5d6bc6faa8ac3d1183b21253e /cgsas.c
parentenable NEW_DESCRIPTORS for sparc (diff)
optimize apply with >1 arguments
Diffstat (limited to 'cgsas.c')
-rw-r--r--cgsas.c26
1 files changed, 26 insertions, 0 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);