diff options
author | johnvg | 2016-04-06 13:51:10 +0000 |
---|---|---|
committer | johnvg | 2016-04-06 13:51:10 +0000 |
commit | ce2e2e0aeffc32c602ec1e141a1abff3335770e3 (patch) | |
tree | 1a7bde005e03570ed1b0f81183803d09b607e647 /backendC/CleanCompilerSources | |
parent | use {}'s instead of ()'s in element type string for unboxed records (diff) |
remove an unnecessary record copy in the abc code for some record updates
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@2684 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'backendC/CleanCompilerSources')
-rw-r--r-- | backendC/CleanCompilerSources/codegen2.c | 218 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/codegen2.h | 5 | ||||
-rw-r--r-- | backendC/CleanCompilerSources/codegen3.c | 47 |
3 files changed, 73 insertions, 197 deletions
diff --git a/backendC/CleanCompilerSources/codegen2.c b/backendC/CleanCompilerSources/codegen2.c index 25224eb..c23f867 100644 --- a/backendC/CleanCompilerSources/codegen2.c +++ b/backendC/CleanCompilerSources/codegen2.c @@ -698,12 +698,7 @@ void CoerceArgumentOnTopOfStack (int *asp_p,int *bsp_p,StateS argstate,StateS no ++*asp_p; break; } -#if UPDATE_POP GenUpdatePopA (0,asize); -#else - GenUpdateA (0,asize); - GenPopA (asize); -#endif *asp_p-=asize; GenPopB (bsize); *bsp_p-=bsize; @@ -3400,9 +3395,8 @@ void RemoveSelectorsFromUpdateNode (ArgS *previous_arg,ArgS *arg) previous_arg->arg_next=NULL; } -#if UPDATE_RECORD_NOT_ON_TOP void UpdateRecordAndAddSelectorsToUpdateNode - (ArgS *record_arg,ArgS *first_field_arg,StateS *field_states,int record_a_size,int record_b_size,int *n_a_elements_above_record_p,int *n_b_elements_above_record_p) + (ArgS *record_arg,ArgS *first_field_arg,StateS *field_states,int record_a_size,int record_b_size,int *end_args_a_offset_p,int *end_args_b_offset_p) { ArgS *arg,*previous_arg; int a_offset,b_offset,arg_a_offset,arg_b_offset,previous_field_number; @@ -3452,149 +3446,50 @@ void UpdateRecordAndAddSelectorsToUpdateNode } previous_arg->arg_next=NULL; - *n_a_elements_above_record_p = arg_a_offset-record_a_size; - *n_b_elements_above_record_p = arg_b_offset-record_b_size; + *end_args_a_offset_p = arg_a_offset; + *end_args_b_offset_p = arg_b_offset; } -void RemoveFieldsFromStackAfterUpdate (int n_a_elements_above_record,int n_b_elements_above_record,int record_a_size,int record_b_size,int *asp_p,int *bsp_p) -{ - if (n_a_elements_above_record!=0){ - int arg_a_offset,a_offset; - - arg_a_offset=record_a_size+n_a_elements_above_record; - a_offset=record_a_size; - while (a_offset>0){ - --a_offset; - --arg_a_offset; -#if UPDATE_POP - if (a_offset==0) - GenUpdatePopA (a_offset,arg_a_offset); - else -#endif - GenUpdateA (a_offset,arg_a_offset); - } -#if UPDATE_POP - if (record_a_size==0) -#endif - GenPopA (arg_a_offset); - - *asp_p -= arg_a_offset; - } - - if (n_b_elements_above_record!=0){ - int arg_b_offset,b_offset; - - arg_b_offset=record_b_size+n_b_elements_above_record; - b_offset=record_b_size; - while (b_offset>0){ - --b_offset; - --arg_b_offset; -#if UPDATE_POP - if (b_offset==0) - GenUpdatePopB (b_offset,arg_b_offset); - else -#endif - GenUpdateB (b_offset,arg_b_offset); - } -#if UPDATE_POP - if (record_b_size==0) -#endif - GenPopB (arg_b_offset); - *bsp_p -= arg_b_offset; - } -} -#else -void UpdateNodeAndAddSelectorsToUpdateNode - (ArgS *record_arg,ArgS *first_field_arg,StateS *field_states,int record_a_size,int record_b_size,int *asp_p,int *bsp_p) +void RemoveFieldsFromStackAfterUpdate (int arg_a_offset,int arg_b_offset,int record_a_size,int record_b_size,int *asp_p,int *bsp_p) { - ArgS *arg,*previous_arg; - int a_offset,b_offset,arg_a_offset,arg_b_offset,previous_field_number; - - a_offset=0; - b_offset=0; - arg_a_offset=record_a_size; - arg_b_offset=record_b_size; - - previous_field_number=0; - - previous_arg=record_arg; - for_l (arg,first_field_arg,arg_next){ - int field_number,arg_a_size,arg_b_size; - Node field_node; - - field_node=arg->arg_node; - field_node->node_arguments->arg_next=NULL; - - field_number=field_node->node_symbol->symb_def->sdef_sel_field_number; - - while (field_number!=previous_field_number){ - AddSizeOfState (field_states[previous_field_number],&a_offset,&b_offset); - ++previous_field_number; - } - - DetermineSizeOfState (field_states[field_number],&arg_a_size,&arg_b_size); - - while (arg_a_size){ - GenUpdateA (arg_a_offset,a_offset); - ++arg_a_offset; - ++a_offset; - --arg_a_size; - } - - while (arg_b_size){ - GenUpdateB (arg_b_offset,b_offset); - ++arg_b_offset; - ++b_offset; - --arg_b_size; - } - - ++previous_field_number; - - previous_arg->arg_next=arg; - previous_arg=arg; - } - previous_arg->arg_next=NULL; - if (arg_a_offset!=record_a_size){ - a_offset=record_a_size; - while (a_offset>0){ - --a_offset; - --arg_a_offset; -#if UPDATE_POP - if (a_offset==0) - GenUpdatePopA (a_offset,arg_a_offset); - else -#endif - GenUpdateA (a_offset,arg_a_offset); - } -#if UPDATE_POP - if (record_a_size==0) -#endif + if (record_a_size!=0){ + int a_offset; + + a_offset=record_a_size; + while (a_offset>0){ + --a_offset; + --arg_a_offset; + if (a_offset==0) + GenUpdatePopA (a_offset,arg_a_offset); + else + GenUpdateA (a_offset,arg_a_offset); + } + } else GenPopA (arg_a_offset); *asp_p -= arg_a_offset; } if (arg_b_offset!=record_b_size){ - b_offset=record_b_size; - while (b_offset>0){ - --b_offset; - --arg_b_offset; -#if UPDATE_POP - if (b_offset==0) - GenUpdatePopB (b_offset,arg_b_offset); - else -#endif - GenUpdateB (b_offset,arg_b_offset); - } -#if UPDATE_POP - if (record_b_size==0) -#endif + if (record_b_size!=0){ + int b_offset; + + b_offset=record_b_size; + while (b_offset>0){ + --b_offset; + --arg_b_offset; + if (b_offset==0) + GenUpdatePopB (b_offset,arg_b_offset); + else + GenUpdateB (b_offset,arg_b_offset); + } + } else GenPopB (arg_b_offset); + *bsp_p -= arg_b_offset; } } -#endif #ifdef DESTRUCTIVE_RECORD_UPDATES void compute_bits_and_add_selectors_to_update_node @@ -4020,41 +3915,27 @@ static void FillUpdateNode (Node node,int *asp_p,int *bsp_p,NodeId update_node_i #endif DetermineSizeOfState (*record_state_p,&record_a_size,&record_b_size); -#if UPDATE_RECORD_NOT_ON_TOP { - int n_a_elements_above_record,n_b_elements_above_record; + int end_args_a_offset,end_args_b_offset; UpdateRecordAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - record_state_p->state_record_arguments,record_a_size,record_b_size,&n_a_elements_above_record,&n_b_elements_above_record); -#else - UpdateNodeAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - record_state_p->state_record_arguments,record_a_size,record_b_size,asp_p,bsp_p); -#endif + record_state_p->state_record_arguments,record_a_size,record_b_size,&end_args_a_offset,&end_args_b_offset); + if (update_node_id==NULL){ BuildRecord (record_state_p->state_record_symbol,*asp_p,*bsp_p,*asp_p,*bsp_p,record_a_size,record_b_size, 0,node->node_state.state_kind==SemiStrict ? PartialFill : NormalFill,True); - *asp_p+=1; -#if UPDATE_RECORD_NOT_ON_TOP - GenUpdateA (0,record_a_size+n_a_elements_above_record); -#else - GenUpdateA (0,record_a_size); -#endif - } else + GenUpdatePopA (0,end_args_a_offset); + *asp_p+=1-end_args_a_offset; + } else { BuildRecord (record_state_p->state_record_symbol,*asp_p,*bsp_p,*asp_p,*bsp_p,record_a_size,record_b_size, *asp_p-update_node_id->nid_a_index,node->node_state.state_kind==SemiStrict ? PartialFill : NormalFill,False); - -#if UPDATE_RECORD_NOT_ON_TOP - GenPopA (record_a_size+n_a_elements_above_record); - *asp_p-=record_a_size+n_a_elements_above_record; - GenPopB (record_b_size+n_b_elements_above_record); - *bsp_p-=record_b_size+n_b_elements_above_record; + GenPopA (end_args_a_offset); + *asp_p-=end_args_a_offset; } -#else - GenPopA (record_a_size); - *asp_p-=record_a_size; - GenPopB (record_b_size); - *bsp_p-=record_b_size; -#endif + GenPopB (end_args_b_offset); + *bsp_p-=end_args_b_offset; + } + return; #if DESTRUCTIVE_RECORD_UPDATES } @@ -4264,9 +4145,7 @@ static void FillUpdateNode (Node node,int *asp_p,int *bsp_p,NodeId update_node_i *asp_p-=n_arguments; } } else { -#if UPDATE_RECORD_NOT_ON_TOP - int n_a_elements_above_record,n_b_elements_above_record; -#endif + int end_args_a_offset,end_args_b_offset; #if BOXED_RECORDS node->node_arguments->arg_state=node->node_symbol->symb_def->sdef_record_state; @@ -4274,14 +4153,9 @@ static void FillUpdateNode (Node node,int *asp_p,int *bsp_p,NodeId update_node_i BuildArgs (node->node_arguments,asp_p,bsp_p,code_gen_node_ids_p); DetermineSizeOfState (node->node_state,&record_a_size,&record_b_size); -#if UPDATE_RECORD_NOT_ON_TOP UpdateRecordAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - node->node_state.state_record_arguments,record_a_size,record_b_size,&n_a_elements_above_record,&n_b_elements_above_record); - RemoveFieldsFromStackAfterUpdate (n_a_elements_above_record,n_b_elements_above_record,record_a_size,record_b_size,asp_p,bsp_p); -#else - UpdateNodeAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - node->node_state.state_record_arguments,record_a_size,record_b_size,asp_p,bsp_p); -#endif + node->node_state.state_record_arguments,record_a_size,record_b_size,&end_args_a_offset,&end_args_b_offset); + RemoveFieldsFromStackAfterUpdate (end_args_a_offset,end_args_b_offset,record_a_size,record_b_size,asp_p,bsp_p); } } diff --git a/backendC/CleanCompilerSources/codegen2.h b/backendC/CleanCompilerSources/codegen2.h index dfaf07f..37922ee 100644 --- a/backendC/CleanCompilerSources/codegen2.h +++ b/backendC/CleanCompilerSources/codegen2.h @@ -127,8 +127,9 @@ void GenTypeError (void); void BuildArg (Args arg,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen_node_ids_p); Bool NodeOnACycleIsInRootNormalForm (Node node); void UpdateStackPointers (int old_asp,int old_bsp,int new_asp,int new_bsp); -void UpdateNodeAndAddSelectorsToUpdateNode - (ArgS *record_arg,ArgS *first_field_arg,StateS *field_states,int record_a_size,int record_b_size,int *asp_p,int *bsp_p); +void UpdateRecordAndAddSelectorsToUpdateNode + (ArgS *record_arg,ArgS *first_field_arg,StateS *field_states,int record_a_size,int record_b_size,int *end_args_a_offset_p,int *end_args_b_offset_p); +void RemoveFieldsFromStackAfterUpdate (int arg_a_offset,int arg_b_offset,int record_a_size,int record_b_size,int *asp_p,int *bsp_p); void RemoveSelectorsFromUpdateNode (ArgS *previous_arg,ArgS *arg); void BuildOrFillLazyFieldSelector (SymbDef selector_sdef,StateKind result_state_kind,int *asp_p,NodeId update_node_id); void CoerceArgumentOnTopOfStack (int *asp_p,int *bsp_p,StateS argstate,StateS nodestate,int asize,int bsize); diff --git a/backendC/CleanCompilerSources/codegen3.c b/backendC/CleanCompilerSources/codegen3.c index 0303b1b..4391c29 100644 --- a/backendC/CleanCompilerSources/codegen3.c +++ b/backendC/CleanCompilerSources/codegen3.c @@ -249,7 +249,6 @@ void RedirectResultAndReturn (int asp,int bsp,int source_a_index,int source_b_in } } } else if (IsSimpleState (demstate)){ -#if 1 /*JVG 29-5-2000 for Clean 2.0*/ if (demstate.state_kind==StrictRedirection){ switch (offstate.state_type){ case TupleState: @@ -267,25 +266,22 @@ void RedirectResultAndReturn (int asp,int bsp,int source_a_index,int source_b_in GenUpdatePopA (0,asp); GenPopB (bsp); } else { -#endif - switch (offstate.state_type){ - case TupleState: - BuildTuple (source_a_index,source_b_index,asp,bsp, - offstate.state_arity, offstate.state_tuple_arguments, - offasize, offbsize, 0, ReleaseAndFill,False); - break; - case RecordState: - BuildRecord (offstate.state_record_symbol,source_a_index,source_b_index, asp, bsp, - offasize, offbsize, 0, ReleaseAndFill,False); - break; - case ArrayState: - GenFillArray (asp-source_a_index,asp,ReleaseAndFill); - } - GenPopA (asp); - GenPopB (bsp); -#if 1 /*JVG 29-5-2000 for Clean 2.0*/ + switch (offstate.state_type){ + case TupleState: + BuildTuple (source_a_index,source_b_index,asp,bsp, + offstate.state_arity, offstate.state_tuple_arguments, + offasize, offbsize, 0, ReleaseAndFill,False); + break; + case RecordState: + BuildRecord (offstate.state_record_symbol,source_a_index,source_b_index, asp, bsp, + offasize, offbsize, 0, ReleaseAndFill,False); + break; + case ArrayState: + GenFillArray (asp-source_a_index,asp,ReleaseAndFill); + } + GenPopA (asp); + GenPopB (bsp); } -#endif } else { switch (demstate.state_type){ case RecordState: @@ -1404,11 +1400,13 @@ static void CodeRootUpdateNode (Node root,NodeId rootid,int asp,int bsp,CodeGenN if (IsSimpleState (root->node_state)){ LabDef record_label; + int end_args_a_offset,end_args_b_offset; DetermineSizeOfState (*record_state_p,&record_a_size,&record_b_size); - UpdateNodeAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - record_state_p->state_record_arguments,record_a_size,record_b_size,&asp,&bsp); + UpdateRecordAndAddSelectorsToUpdateNode (record_arg,first_field_arg, + record_state_p->state_record_arguments,record_a_size,record_b_size,&end_args_a_offset,&end_args_b_offset); + RemoveFieldsFromStackAfterUpdate (end_args_a_offset,end_args_b_offset,record_a_size,record_b_size,&asp,&bsp); ConvertSymbolToRLabel (&record_label,record_sdef); @@ -1418,10 +1416,13 @@ static void CodeRootUpdateNode (Node root,NodeId rootid,int asp,int bsp,CodeGenN GenPopB (bsp); GenRtn (1,0, OnAState); } else { + int end_args_a_offset,end_args_b_offset; + DetermineSizeOfState (result_state,&record_a_size,&record_b_size); - UpdateNodeAndAddSelectorsToUpdateNode (record_arg,first_field_arg, - result_state.state_record_arguments,record_a_size,record_b_size,&asp,&bsp); + UpdateRecordAndAddSelectorsToUpdateNode (record_arg,first_field_arg, + result_state.state_record_arguments,record_a_size,record_b_size,&end_args_a_offset,&end_args_b_offset); + RemoveFieldsFromStackAfterUpdate (end_args_a_offset,end_args_b_offset,record_a_size,record_b_size,&asp,&bsp); if (!function_called_only_curried_or_lazy_with_one_return) GenRtn (record_a_size,record_b_size,result_state); |