summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn van Groningen2007-09-03 11:49:18 +0000
committerJohn van Groningen2007-09-03 11:49:18 +0000
commitf65b701bae99e85261ed1fd1357e8dcd5961582d (patch)
tree78908e48ee46d1945cd3327f1f9f1542e459a9f1
parentfix code_get_desc_arity (diff)
add code_desc0, code_jmp_upd and code_jmp_ap_upd
-rw-r--r--cgcode.c139
1 files changed, 139 insertions, 0 deletions
diff --git a/cgcode.c b/cgcode.c
index bfacd23..de605fa 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -3580,6 +3580,15 @@ void code_get_desc_arity (int a_offset)
s_push_b (graph_7);
}
+void code_get_desc0_number (void)
+{
+ INSTRUCTION_GRAPH graph_1,graph_2;
+
+ graph_1=s_pop_b();
+ graph_2=g_load_id (-2-2*STACK_ELEMENT_SIZE,graph_1);
+ s_push_b (graph_2);
+}
+
void code_get_node_arity (int a_offset)
{
INSTRUCTION_GRAPH graph_1,graph_2,graph_3,graph_4,graph_5,graph_6;
@@ -3954,12 +3963,79 @@ void code_jmp (char label_name[])
}
}
+void code_jmp_upd (char label_name[])
+{
+ LABEL *label;
+ int a_stack_size,b_stack_size,n_a_and_f_registers;
+ ULONG *vector;
+
+ label=enter_label (label_name,0);
+
+ if (demand_flag){
+ a_stack_size=demanded_a_stack_size;
+ b_stack_size=demanded_b_stack_size;
+ vector=demanded_vector;
+
+ end_basic_block_with_registers (a_stack_size,b_stack_size,vector);
+ } else
+ error ("Directive .d missing before jmp_upd instruction");
+
+ n_a_and_f_registers=0;
+
+ if (mc68881_flag){
+ int parameter_n;
+
+ for (parameter_n=0; parameter_n<b_stack_size; ++parameter_n)
+ if (test_bit (vector,parameter_n))
+ if (n_a_and_f_registers<N_FLOAT_PARAMETER_REGISTERS){
+ ++n_a_and_f_registers;
+#ifndef G_A64
+ ++parameter_n;
+#endif
+ } else
+ break;
+ }
+
+ n_a_and_f_registers+=
+ (a_stack_size<=N_ADDRESS_PARAMETER_REGISTERS) ? (a_stack_size<<4) : (N_ADDRESS_PARAMETER_REGISTERS<<4);
+
+ i_lea_l_i_r (label,0,REGISTER_A2);
+
+ {
+ char jmpupd_label_name[32];
+ LABEL *jmpupd_label;
+
+ sprintf (jmpupd_label_name,"jmpupd_%d",a_stack_size);
+
+ jmpupd_label=enter_label (jmpupd_label_name,IMPORT_LABEL);
+
+ i_jmp_l (jmpupd_label,n_a_and_f_registers);
+ }
+
+ profile_flag=PROFILE_NORMAL;
+ demand_flag=0;
+
+ reachable=0;
+
+ begin_new_basic_block();
+}
+
void code_jmp_ap (int n_apply_args)
{
code_d (1+n_apply_args,0,e_vector);
code_jmp_ap_ (n_apply_args);
}
+void code_jmp_ap_upd (int n_apply_args)
+{
+ char apupd_label_name[32];
+
+ code_d (1+n_apply_args,0,e_vector);
+
+ sprintf (apupd_label_name,"apupd_%d",n_apply_args);
+ code_jmp (apupd_label_name);
+}
+
void code_label (char *label_name);
void code_jmp_eval (VOID)
@@ -8843,6 +8919,69 @@ void code_desc (char label_name[],char node_entry_label_name[],char *code_label_
w_descriptor_string (descriptor_name,descriptor_name_length,string_code_label_id,string_label);
}
+void code_desc0 (char label_name[],int desc0_number,char descriptor_name[],int descriptor_name_length)
+{
+ LABEL *string_label,*label;
+ int string_code_label_id;
+
+#if defined (NO_FUNCTION_NAMES)
+ descriptor_name_length=0;
+#endif
+
+ string_code_label_id=next_label_id++;
+ string_label=new_local_label (0
+#ifdef G_POWER
+ | DATA_LABEL
+#endif
+ );
+
+ label=enter_label (label_name,LOCAL_LABEL | DATA_LABEL);
+
+ if (label->label_id>=0)
+ error_s ("Label %d defined twice\n",label_name);
+ label->label_id=next_label_id++;
+
+ label->label_descriptor=string_label;
+
+#ifdef FUNCTION_LEVEL_LINKING
+ as_new_data_module();
+ if (assembly_flag)
+ w_as_new_data_module();
+#endif
+
+#ifdef G_A64
+ store_word64_in_data_section (desc0_number);
+#else
+ store_long_word_in_data_section (desc0_number);
+#endif
+ if (assembly_flag)
+#ifdef G_A64
+ w_as_word64_in_data_section ((int_64)desc0_number);
+#else
+ w_as_long_in_data_section (desc0_number);
+#endif
+
+ if (!parallel_flag){
+ store_descriptor_in_data_section (label);
+ if (assembly_flag)
+ w_as_descriptor_in_data_section (label->label_name);
+ }
+
+ define_data_label (label);
+ if (assembly_flag)
+ w_as_define_label (label);
+
+ store_2_words_in_data_section (0,0);
+ if (assembly_flag){
+ w_as_word_in_data_section (0);
+ w_as_word_in_data_section (0);
+ }
+
+ code_new_descriptor (0,0);
+
+ w_descriptor_string (descriptor_name,descriptor_name_length,string_code_label_id,string_label);
+}
+
void code_descn (char label_name[],char node_entry_label_name[],int arity,int lazy_record_flag,char descriptor_name[],
int descriptor_name_length)
{