summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgsas.c26
-rw-r--r--cgswas.c44
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);