aboutsummaryrefslogtreecommitdiff
path: root/backendC/CleanCompilerSources
diff options
context:
space:
mode:
Diffstat (limited to 'backendC/CleanCompilerSources')
-rw-r--r--backendC/CleanCompilerSources/codegen1.c62
-rw-r--r--backendC/CleanCompilerSources/codegen2.c119
-rw-r--r--backendC/CleanCompilerSources/codegen3.c41
-rw-r--r--backendC/CleanCompilerSources/compiledefines.h2
-rw-r--r--backendC/CleanCompilerSources/instructions.c2
-rw-r--r--backendC/CleanCompilerSources/instructions.h3
6 files changed, 210 insertions, 19 deletions
diff --git a/backendC/CleanCompilerSources/codegen1.c b/backendC/CleanCompilerSources/codegen1.c
index fc0a66e..26977f2 100644
--- a/backendC/CleanCompilerSources/codegen1.c
+++ b/backendC/CleanCompilerSources/codegen1.c
@@ -1619,7 +1619,7 @@ Bool NodeEntryUnboxed (StateS *const function_state_p,NodeP call_node_p,int args
void ApplyEntry (StateS *const function_state_p,int arity,Label ea_lab,int ea_label_follows)
{
- CurrentAltLabel.lab_pref = l_pref;
+ CurrentAltLabel.lab_pref = l_pref;
if (arity==0){
GenOAStackLayout (1);
@@ -1635,6 +1635,30 @@ void ApplyEntry (StateS *const function_state_p,int arity,Label ea_lab,int ea_la
GenPL();
}
+#ifdef NEW_APPLY
+ if (arity>=2){
+ if (IsSimpleState (function_state_p[-1])){
+ if (function_state_p[-1].state_kind==OnB){
+ LabDef a_lab;
+
+ a_lab=*ea_lab;
+ a_lab.lab_pref="a";
+ GenApplyEntryDirective (0,&a_lab);
+ } else if (function_state_p[-1].state_kind==StrictRedirection || function_state_p[-1].state_kind==LazyRedirection){
+ GenApplyEntryDirective (0,ea_lab);
+ } else {
+ GenApplyEntryDirective (arity,ea_lab);
+ }
+ } else {
+ LabDef a_lab;
+
+ a_lab=*ea_lab;
+ a_lab.lab_pref="a";
+ GenApplyEntryDirective (0,&a_lab);
+ }
+ }
+#endif
+
GenOAStackLayout (2);
GenLabelDefinition (&CurrentAltLabel);
@@ -1645,17 +1669,26 @@ void ApplyEntry (StateS *const function_state_p,int arity,Label ea_lab,int ea_la
#endif
GenReplArgs (arity-1,arity-1);
+#ifdef NEW_APPLY
+ if (arity>=2){
+ LabDef a_lab;
+
+ a_lab=*ea_lab;
+ a_lab.lab_pref="a";
+ GenOAStackLayout (arity);
+ if (DoTimeProfiling)
+ GenPN();
+ GenLabelDefinition (&a_lab);
+ }
+#endif
+
if (function_called_only_curried_or_lazy_with_one_return)
return;
-
+
CallEvalArgsEntry (arity,function_state_p,0,ObjectSizes [function_state_p[-1].state_object],ea_lab);
#if SHARE_UPDATE_CODE
-# if 1
result=get_label_number_from_result_state_database (&function_state_p[-1],2,&label_number);
-# else
- result=get_label_number_from_result_state_database (type,2,&label_number);
-# endif
if (result==2){
LabDef update_label;
@@ -1699,6 +1732,19 @@ void ApplyEntry (StateS *const function_state_p,int arity,Label ea_lab,int ea_la
#endif
GenReplArgs (arity-1, arity-1);
+#ifdef NEW_APPLY
+ if (arity>=2){
+ LabDef a_lab;
+
+ a_lab=*ea_lab;
+ a_lab.lab_pref="a";
+ GenOAStackLayout (arity);
+ if (DoTimeProfiling)
+ GenPN();
+ GenLabelDefinition (&a_lab);
+ }
+#endif
+
if (function_called_only_curried_or_lazy_with_one_return)
return;
@@ -1706,11 +1752,7 @@ void ApplyEntry (StateS *const function_state_p,int arity,Label ea_lab,int ea_la
CallEvalArgsEntry (arity,function_state_p,asize,bsize,ea_lab);
#if SHARE_UPDATE_CODE
-# if 1
result=get_label_number_from_result_state_database (&function_state_p[-1],2,&label_number);
-# else
- result=get_label_number_from_result_state_database (type,2,&label_number);
-# endif
if (result==2){
LabDef update_label;
diff --git a/backendC/CleanCompilerSources/codegen2.c b/backendC/CleanCompilerSources/codegen2.c
index 7d55c3e..c9199a5 100644
--- a/backendC/CleanCompilerSources/codegen2.c
+++ b/backendC/CleanCompilerSources/codegen2.c
@@ -2166,6 +2166,14 @@ static void SubSizeOfArguments (ArgS *args,int *a_offset_p,int *b_offset_p)
SubSizeOfState (arg->arg_state,a_offset_p,b_offset_p);
}
+static void AddSizeOfArguments (ArgS *args,int *a_offset_p,int *b_offset_p)
+{
+ ArgS *arg;
+
+ for_l (arg,args,arg_next)
+ AddSizeOfState (arg->arg_state,a_offset_p,b_offset_p);
+}
+
void DetermineSizeOfArguments (ArgS *args,int *a_offset_p,int *b_offset_p)
{
ArgS *arg;
@@ -2368,7 +2376,7 @@ static void FillSymbol (Node node,SymbDef sdef,int *asp_p,int *bsp_p,NodeId upda
BuildArgs (node->node_arguments,asp_p,bsp_p,code_gen_node_ids_p);
- *asp_p-=a_size+1; /* changed 20-7-1999, was a_size */
+ *asp_p-=a_size+1;
*bsp_p-=b_size;
if (! (sdef->sdef_kind==SYSRULE
@@ -2566,6 +2574,93 @@ static void FillSymbol (Node node,SymbDef sdef,int *asp_p,int *bsp_p,NodeId upda
}
}
+#ifdef NEW_APPLY
+int build_apply_arguments (ArgP node_args,int *a_size_p,int *b_size_p,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen_node_ids_p)
+{
+ if (node_args->arg_node->node_kind==NormalNode && node_args->arg_node->node_symbol->symb_kind==apply_symb){
+ ArgP next_arg;
+
+ next_arg=node_args->arg_next;
+ AddSizeOfState (next_arg->arg_state,a_size_p,b_size_p);
+ BuildArg (next_arg,asp_p,bsp_p,code_gen_node_ids_p);
+
+ return 1+build_apply_arguments (node_args->arg_node->node_arguments,a_size_p,b_size_p,asp_p,bsp_p,code_gen_node_ids_p);
+ } else {
+ AddSizeOfArguments (node_args,a_size_p,b_size_p);
+ BuildArgs (node_args,asp_p,bsp_p,code_gen_node_ids_p);
+ return 1;
+ }
+}
+
+static void generate_code_for_apply_in_strict_context (NodeP node,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen_node_ids_p)
+{
+ int a_size,b_size,n_apply_args;
+ ArgP node_args;
+
+ node_args=node->node_arguments;
+ a_size=0;
+ b_size=0;
+ n_apply_args=build_apply_arguments (node_args,&a_size,&b_size,asp_p,bsp_p,code_gen_node_ids_p);
+
+ *asp_p-=a_size;
+ *bsp_p-=b_size;
+ cleanup_stack (asp_p,bsp_p,a_size,b_size,&code_gen_node_ids_p->a_node_ids,&code_gen_node_ids_p->b_node_ids,
+ &code_gen_node_ids_p->free_node_ids,code_gen_node_ids_p->moved_node_ids_l,
+ code_gen_node_ids_p->doesnt_fail);
+
+ GenJsrAp (n_apply_args);
+
+ AddSizeOfState (node->node_state,asp_p,bsp_p);
+}
+
+static void FillApply (Node node,int *asp_p,int *bsp_p,NodeId update_node_id,CodeGenNodeIdsP code_gen_node_ids_p)
+{
+ LabDef name;
+
+ if (IsLazyState (node->node_state)){
+ LabDef codelab;
+
+ ConvertSymbolToDandNLabel (&name,&codelab,ApplyDef);
+
+ BuildArgs (node->node_arguments,asp_p,bsp_p,code_gen_node_ids_p);
+
+ if (update_node_id==NULL){
+ *asp_p += 1-2;
+ GenBuild (&name,2,&codelab);
+ } else {
+ GenFill (&name,2,&codelab,*asp_p-update_node_id->nid_a_index,node->node_state.state_kind==SemiStrict ? PartialFill : NormalFill);
+ *asp_p -= 2;
+ }
+ } else {
+ if (update_node_id!=NULL && update_node_id->nid_a_index!=*asp_p){
+ int a_size,b_size;
+
+ DetermineSizeOfArguments (node->node_arguments,&a_size,&b_size);
+
+ GenPushA (*asp_p-update_node_id->nid_a_index);
+ *asp_p += SizeOfAStackElem;
+
+ BuildArgs (node->node_arguments,asp_p,bsp_p,code_gen_node_ids_p);
+
+ *asp_p-=a_size+1;
+ *bsp_p-=b_size;
+
+ cleanup_stack (asp_p,bsp_p,a_size+1,b_size,&code_gen_node_ids_p->a_node_ids,&code_gen_node_ids_p->b_node_ids,
+ &code_gen_node_ids_p->free_node_ids,code_gen_node_ids_p->moved_node_ids_l,
+ code_gen_node_ids_p->doesnt_fail);
+
+ GenJsrAp (1);
+
+ AddSizeOfState (node->node_state,asp_p,bsp_p);
+
+ GenPopA (1);
+ *asp_p-=1;
+ } else
+ generate_code_for_apply_in_strict_context (node,asp_p,bsp_p,code_gen_node_ids_p);
+ }
+}
+#endif
+
void GenTypeError (void)
{
GenDAStackLayout (0);
@@ -2927,7 +3022,11 @@ static void FillNormalNode (Node node,int *asp_p,int *bsp_p,NodeId update_node_i
FillOrReduceSelectSymbol (node,asp_p,bsp_p,update_node_id,code_gen_node_ids_p);
return;
case apply_symb:
+#ifdef NEW_APPLY
+ FillApply (node,asp_p,bsp_p,update_node_id,code_gen_node_ids_p);
+#else
FillSymbol (node,ApplyDef,asp_p,bsp_p,update_node_id,code_gen_node_ids_p);
+#endif
return;
case if_symb:
#ifdef FASTER_STRICT_IF
@@ -4734,8 +4833,16 @@ void build_and_cleanup (Node node,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen
sdef=node->node_symbol->symb_def;
break;
case apply_symb:
+#ifdef NEW_APPLY
+ if (!IsLazyState (node->node_state))
+ generate_code_for_apply_in_strict_context (node,asp_p,bsp_p,code_gen_node_ids_p);
+ else
+ Build (node,asp_p,bsp_p,code_gen_node_ids_p);
+ return;
+#else
sdef=ApplyDef;
break;
+#endif
#ifndef FASTER_STRICT_IF
case if_symb:
sdef=IfDef;
@@ -4760,17 +4867,11 @@ void build_and_cleanup (Node node,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen
node_args=node->node_arguments;
DetermineSizeOfArguments (node_args,&a_size,&b_size);
-#if 1
+
if (ExpectsResultNode (node->node_state))
BuildArgsWithNewResultNode (node_args,asp_p,bsp_p,code_gen_node_ids_p,&a_size,&b_size);
else
-#else
- if (ExpectsResultNode (node->node_state)){
- NewEmptyNode (asp_p,-1);
- ++a_size;
- }
-#endif
- BuildArgs (node_args,asp_p,bsp_p,code_gen_node_ids_p);
+ BuildArgs (node_args,asp_p,bsp_p,code_gen_node_ids_p);
*asp_p-=a_size;
*bsp_p-=b_size;
diff --git a/backendC/CleanCompilerSources/codegen3.c b/backendC/CleanCompilerSources/codegen3.c
index f2a2504..bf1b445 100644
--- a/backendC/CleanCompilerSources/codegen3.c
+++ b/backendC/CleanCompilerSources/codegen3.c
@@ -597,6 +597,43 @@ static void CodeRootSymbolApplication (Node root,NodeId rootid,SymbDef def,int a
}
}
+#ifdef NEW_APPLY
+extern int build_apply_arguments (ArgP node_args,int *a_size_p,int *b_size_p,int *asp_p,int *bsp_p,CodeGenNodeIdsP code_gen_node_ids_p);
+
+static void CodeRootApply (Node root,NodeId rootid,int asp,int bsp,CodeGenNodeIdsP code_gen_node_ids_p,StateS resultstate)
+{
+ if (IsSemiStrictState (root->node_state)){
+ LabDef name,codelab;
+
+ ConvertSymbolToDandNLabel (&name,&codelab,ApplyDef);
+
+ CreateSemiStrictRootNode (&name,&codelab,root,rootid,asp,bsp,code_gen_node_ids_p,resultstate);
+ } else {
+ int a_size,b_size,n_apply_args;
+
+ a_size=0;
+ b_size=0;
+ n_apply_args=build_apply_arguments (root->node_arguments,&a_size,&b_size,&asp,&bsp,code_gen_node_ids_p);
+
+ UpdateAAndBStack (asp,bsp,a_size,b_size,&asp,&bsp);
+
+ if (!IsSimpleState (resultstate) || resultstate.state_kind!=StrictRedirection){
+ int result_a_size,result_b_size;
+
+ GenJsrAp (n_apply_args);
+
+ DetermineSizeOfState (root->node_state,&result_a_size,&result_b_size);
+
+ asp+=result_a_size-a_size;
+ bsp+=result_b_size-b_size;
+
+ RedirectResultAndReturn (asp,bsp,asp,bsp,root->node_state,resultstate,result_a_size,result_b_size);
+ } else
+ GenJmpAp (n_apply_args);
+ }
+}
+#endif
+
static void CodeRootSelection (Node root, NodeId rootid,int asp,int bsp,CodeGenNodeIdsP code_gen_node_ids_p,StateS demstate)
{
Args args;
@@ -844,7 +881,11 @@ static void CodeNormalRootNode (Node root,NodeId rootid,int asp,int bsp,CodeGenN
FillRhsRoot (&nil_lab, root, asp, bsp,code_gen_node_ids_p);
return;
case apply_symb:
+#ifdef NEW_APPLY
+ CodeRootApply (root, rootid, asp, bsp,code_gen_node_ids_p,resultstate);
+#else
CodeRootSymbolApplication (root, rootid, ApplyDef, asp, bsp,code_gen_node_ids_p,resultstate);
+#endif
return;
case if_symb:
#ifdef FASTER_STRICT_IF
diff --git a/backendC/CleanCompilerSources/compiledefines.h b/backendC/CleanCompilerSources/compiledefines.h
index 1430026..38639dd 100644
--- a/backendC/CleanCompilerSources/compiledefines.h
+++ b/backendC/CleanCompilerSources/compiledefines.h
@@ -23,4 +23,6 @@
#define STRICT_LISTS 1
#define BOXED_RECORDS 1
+#undef NEW_APPLY
+
#define KARBON
diff --git a/backendC/CleanCompilerSources/instructions.c b/backendC/CleanCompilerSources/instructions.c
index b2bb6ba..5e9f104 100644
--- a/backendC/CleanCompilerSources/instructions.c
+++ b/backendC/CleanCompilerSources/instructions.c
@@ -2648,12 +2648,14 @@ void GenNodeEntryDirective (int arity,Label label,Label label2)
}
}
+#ifdef NEW_APPLY
void GenApplyEntryDirective (int arity,Label label)
{
put_directive_b (a);
put_arguments_n__b (arity);
GenLabel (label);
}
+#endif
void GenLazyRecordNodeEntryDirective (int arity,Label label)
{
diff --git a/backendC/CleanCompilerSources/instructions.h b/backendC/CleanCompilerSources/instructions.h
index 67768ad..205e62f 100644
--- a/backendC/CleanCompilerSources/instructions.h
+++ b/backendC/CleanCompilerSources/instructions.h
@@ -159,6 +159,9 @@ void GenNodeEntryDirective (int arity,Label label,Label label2);
void GenNodeEntryDirectiveForLabelWithoutSymbol (int arity,Label label,Label label2);
void GenNodeEntryDirectiveUnboxed (int a_size,int b_size,Label label,Label label2);
void GenApplyEntryDirective (int arity,Label label);
+#ifdef NEW_APPLY
+void GenApplyEntryDirective (int arity,Label label);
+#endif
void GenLazyRecordNodeEntryDirective (int arity,Label label);
void GenFieldNodeEntryDirective (int arity, Label label, Label label2,char *record_name);
void GenConstructorDescriptorAndExport (SymbDef sdef);