diff options
Diffstat (limited to 'backendC')
-rw-r--r-- | backendC/CleanCompilerSources/codegen3.c | 185 |
1 files changed, 82 insertions, 103 deletions
diff --git a/backendC/CleanCompilerSources/codegen3.c b/backendC/CleanCompilerSources/codegen3.c index 5a5d370..cef0807 100644 --- a/backendC/CleanCompilerSources/codegen3.c +++ b/backendC/CleanCompilerSources/codegen3.c @@ -860,7 +860,7 @@ static void CodeNormalRootNode (Node root,NodeId rootid,int asp,int bsp,CodeGenN CodeRootSelection (root, rootid, asp, bsp,code_gen_node_ids_p,resultstate); return; case fail_symb: -#if CLEAN2 +#ifdef CLEAN2 { IdentS case_ident_s; SymbDefS case_def_s; @@ -1343,21 +1343,10 @@ static Bool ExamineRootNodeOnACycle (NodeId rhsid,Node rhsroot,int *asp_p,StateS #if TAIL_CALL_MODULO_CONS_OPTIMIZATION extern int tail_call_modulo_cons; -static void generate_code_for_tail_call_modulo_cons (NodeP node_p,NodeId node_def_id,NodeP root_node, -#if STRICT_LISTS - NodeP fill_unique_node, -#else - NodeP push_node, -#endif - int asp,int bsp,struct code_gen_node_ids *code_gen_node_ids_p) +static void generate_code_for_tail_call_modulo_cons (NodeP node_p,NodeId node_def_id,NodeP root_node,NodeP push_node,int asp,int bsp,struct code_gen_node_ids *code_gen_node_ids_p) { LabDef name; int a_size,b_size; -#if STRICT_LISTS - NodeP push_node; - - push_node=fill_unique_node->node_node; -#endif ConvertSymbolToLabel (&name,node_p->node_symbol->symb_def); @@ -1383,79 +1372,93 @@ static void generate_code_for_tail_call_modulo_cons (NodeP node_p,NodeId node_de BuildArgs (root_node->node_arguments,&asp,&bsp,code_gen_node_ids_p); - if (root_node->node_symbol->symb_kind==cons_symb){ - GenFillh (&cons_lab,root_node->node_arity,asp,ReleaseAndFill); - asp-=root_node->node_arity; - } else { - LabDef constructor_name; +#if STRICT_LISTS + if (root_node->node_symbol->symb_kind==cons_symb ? root_node->node_symbol->symb_head_strictness!=4 : !root_node->node_symbol->symb_def->sdef_strict_constructor){ +#else + if (root_node->node_symbol->symb_kind==cons_symb || !root_node->node_symbol->symb_def->sdef_strict_constructor){ +#endif + LabDef constructor_name,*constructor_name_p; - if (!root_node->node_symbol->symb_def->sdef_strict_constructor){ + if (root_node->node_symbol->symb_kind==cons_symb) + constructor_name_p=&cons_lab; + else { ConvertSymbolToConstructorDLabel (&constructor_name,root_node->node_symbol->symb_def); - GenFillh (&constructor_name,root_node->node_arity,asp,ReleaseAndFill); - asp-=root_node->node_arity; - } else { - int asize,bsize; - + constructor_name_p=&constructor_name; + } + GenFillh (constructor_name_p,root_node->node_arity,asp,ReleaseAndFill); + asp-=root_node->node_arity; + } else { + LabDef constructor_name,*constructor_name_p; + int asize,bsize; + +#if STRICT_LISTS + if (root_node->node_symbol->symb_kind==cons_symb) + constructor_name_p=unboxed_cons_label (root_node->node_symbol); + else +#endif + { ConvertSymbolToKLabel (&constructor_name,root_node->node_symbol->symb_def); + constructor_name_p=&constructor_name; + } - DetermineSizeOfArguments (root_node->node_arguments,&asize,&bsize); - + DetermineSizeOfArguments (root_node->node_arguments,&asize,&bsize); + #if STRICT_LISTS - if (asize+bsize>2 && push_node!=NULL && push_node->node_push_size>=asize+bsize){ + if (asize+bsize>2 && push_node!=NULL && push_node->node_push_size>=asize+bsize){ #else - if (asize+bsize>2 && push_node!=NULL && push_node->node_line>=asize+bsize){ + if (asize+bsize>2 && push_node!=NULL && push_node->node_line>=asize+bsize){ #endif - NodeIdListElementP node_id_list; - char bits[MaxNodeArity+2]; - unsigned int a_bits,b_bits,a_size,b_size,n,arg_n; - int n_a_fill_bits,n_b_fill_bits,node_arity; - ArgP arg_p; - - a_bits=0; - b_bits=0; - a_size=0; - b_size=0; - n_a_fill_bits=0; - n_b_fill_bits=0; - - arg_p=root_node->node_arguments; - node_arity=root_node->node_arity; - node_id_list=push_node->node_node_ids; - - for (arg_n=0; arg_n<node_arity; ++arg_n){ - int arg_a_size,arg_b_size; - - DetermineSizeOfState (arg_p->arg_state,&arg_a_size,&arg_b_size); - - if (arg_n==0 || !(arg_p->arg_node->node_kind==NodeIdNode && arg_p->arg_node->node_node_id==node_id_list->nidl_node_id)){ - a_bits |= (~((~0)<<arg_a_size))<<a_size; - b_bits |= (~((~0)<<arg_b_size))<<b_size; + NodeIdListElementP node_id_list; + char bits[MaxNodeArity+2]; + unsigned int a_bits,b_bits,a_size,b_size,n,arg_n; + int n_a_fill_bits,n_b_fill_bits,node_arity; + ArgP arg_p; + + a_bits=0; + b_bits=0; + a_size=0; + b_size=0; + n_a_fill_bits=0; + n_b_fill_bits=0; + + arg_p=root_node->node_arguments; + node_arity=root_node->node_arity; + node_id_list=push_node->node_node_ids; + + for (arg_n=0; arg_n<node_arity; ++arg_n){ + int arg_a_size,arg_b_size; + + DetermineSizeOfState (arg_p->arg_state,&arg_a_size,&arg_b_size); + + if (arg_n==0 || !(arg_p->arg_node->node_kind==NodeIdNode && arg_p->arg_node->node_node_id==node_id_list->nidl_node_id)){ + a_bits |= (~((~0)<<arg_a_size))<<a_size; + b_bits |= (~((~0)<<arg_b_size))<<b_size; - n_a_fill_bits+=arg_a_size; - n_b_fill_bits+=arg_b_size; - } - - arg_p=arg_p->arg_next; - a_size+=arg_a_size; - b_size+=arg_b_size; - node_id_list=node_id_list->nidl_next; + n_a_fill_bits+=arg_a_size; + n_b_fill_bits+=arg_b_size; } - - for (n=0; n<a_size; ++n) - bits[n]='0' + ((a_bits>>n) & 1); - for (n=0; n<b_size; ++n) - bits[n+a_size]='0' + ((b_bits>>n) & 1); + arg_p=arg_p->arg_next; + a_size+=arg_a_size; + b_size+=arg_b_size; + node_id_list=node_id_list->nidl_next; + } - bits[a_size+b_size]='\0'; - - GenPushA (asp-node_def_id->nid_a_index); - GenFill3R (&constructor_name,asize,bsize,asp+1,bits); - } else - GenFillR (&constructor_name,asize,bsize,asp,0,0,ReleaseAndFill,True); - asp-=asize; - bsp-=bsize; - } + for (n=0; n<a_size; ++n) + bits[n]='0' + ((a_bits>>n) & 1); + + for (n=0; n<b_size; ++n) + bits[n+a_size]='0' + ((b_bits>>n) & 1); + + bits[a_size+b_size]='\0'; + + GenPushA (asp-node_def_id->nid_a_index); + GenFill3R (constructor_name_p,asize,bsize,asp+1,bits); + } else + GenFillR (constructor_name_p,asize,bsize,asp,0,0,ReleaseAndFill,True); + + asp-=asize; + bsp-=bsize; } if (tail_call_modulo_cons) @@ -2023,23 +2026,14 @@ int CodeRhsNodeDefs if (node_p!=NULL){ NodeIdP node_def_id; -#if STRICT_LISTS - NodeP fill_unique_node; - - fill_unique_node=NULL; -#else NodeP push_node; push_node=NULL; -#endif + node_def_id=last_node_def_p->def_id; if (node_p->node_kind==FillUniqueNode){ -#if STRICT_LISTS - fill_unique_node=node_p; -#else push_node=node_p->node_node; -#endif node_p=node_p->node_arguments->arg_node; } @@ -2047,11 +2041,9 @@ int CodeRhsNodeDefs *last_node_def_h=NULL; CodeSharedNodeDefs (defs,NULL,&asp,&bsp,&code_gen_node_ids); *last_node_def_h=last_node_def_p; -#if STRICT_LISTS - generate_code_for_tail_call_modulo_cons (node_p,node_def_id,root_node,fill_unique_node,asp,bsp,&code_gen_node_ids); -#else + generate_code_for_tail_call_modulo_cons (node_p,node_def_id,root_node,push_node,asp,bsp,&code_gen_node_ids); -#endif + while (moved_node_ids!=NULL){ moved_node_ids->mnid_node_id->nid_a_index_=moved_node_ids->mnid_a_stack_offset; moved_node_ids=moved_node_ids->mnid_next; @@ -2064,23 +2056,13 @@ int CodeRhsNodeDefs } else { NodeP node_p; NodeIdP node_id_p; -#if STRICT_LISTS - NodeP fill_unique_node_p; - - fill_unique_node_p=NULL; -#else NodeP push_node_p; push_node_p=NULL; -#endif node_p=arg_p2->arg_node; if (node_p->node_kind==FillUniqueNode){ -#if STRICT_LISTS - fill_unique_node_p=node_p->node_node; -#else push_node_p=node_p->node_node; -#endif node_p=node_p->node_arguments->arg_node; } @@ -2095,11 +2077,8 @@ int CodeRhsNodeDefs arg_p2->arg_node=NewNodeIdNode (node_id_p); CodeSharedNodeDefs (defs,NULL,&asp,&bsp,&code_gen_node_ids); -#if STRICT_LISTS - generate_code_for_tail_call_modulo_cons (node_p,node_id_p,root_node,fill_unique_node_p,asp,bsp,&code_gen_node_ids); -#else generate_code_for_tail_call_modulo_cons (node_p,node_id_p,root_node,push_node_p,asp,bsp,&code_gen_node_ids); -#endif + while (moved_node_ids!=NULL){ moved_node_ids->mnid_node_id->nid_a_index_=moved_node_ids->mnid_a_stack_offset; moved_node_ids=moved_node_ids->mnid_next; |