summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2011-11-13 03:22:33 +0000
committerAdrian Thurston <thurston@complang.org>2011-11-13 03:22:33 +0000
commit463d17ac6b31219b640ae6fb6f73f505d6114eb7 (patch)
treefb683278acb091205b291de56a83138ab67bf61e
parentd9370160a0584c5913b3c1aa4d985e3d4afe9730 (diff)
downloadcolm-463d17ac6b31219b640ae6fb6f73f505d6114eb7.tar.gz
Some prep for factoring generation actions out of the parse loop. refs #332.
-rw-r--r--colm/bytecode.c375
1 files changed, 222 insertions, 153 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c
index bbf93bb1..4d13ece6 100644
--- a/colm/bytecode.c
+++ b/colm/bytecode.c
@@ -2186,32 +2186,42 @@ again:
PdaRun *pdaRun = (PdaRun*)vm_pop();
if ( pcr != PcrDone ) {
- /* Push the execution. */
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
- /* Execution environment for the reduction code. */
- initReductionExecution( exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+ /* Execution environment for the reduction code. */
+ initReductionExecution( exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
- vm_push( stream );
- vm_push( accum );
+ vm_push( stream );
+ vm_push( accum );
- /* Push the instruction. */
- vm_push( (SW)instr );
+ /* Push the instruction. */
+ vm_push( (SW)instr );
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
- /* Call execution. */
- instr = exec->code;
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+
+ vm_push( stream );
+ vm_push( accum );
+ }
}
else {
treeDownref( prg, sp, stream );
@@ -2297,32 +2307,44 @@ again:
PdaRun *pdaRun = (PdaRun*)vm_pop();
if ( pcr != PcrDone ) {
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
-
- /* Execution environment for the reduction code. */
- initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
-
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
- vm_push( (SW)consumed );
-
- vm_push( stream );
- vm_push( accum );
-
- /* Push the instruction. */
- vm_push( (SW)instr );
-
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
-
- /* Call execution. */
- instr = exec->code;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
+
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( stream );
+ vm_push( accum );
+
+ /* Execution environment for the reduction code. */
+ initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+
+ /* Push the instruction. */
+ vm_push( (SW)instr );
+
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
+
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( stream );
+ vm_push( accum );
+ }
}
else {
instr += SIZEOF_CODE + SIZEOF_HALF;
@@ -2412,32 +2434,44 @@ again:
debug( REALM_BYTECODE, "IN_PARSE_FRAG_BKT2 %ld", consumed );
if ( pcr != PcrDone ) {
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
-
- /* Execution environment for the reduction code. */
- initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
-
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
- vm_push( (SW)consumed );
-
- vm_push( input );
- vm_push( accum );
-
- /* Push the instruction. */
- vm_push( (SW)instr );
-
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
-
- /* Call execution. */
- instr = exec->code;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
+
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( input );
+ vm_push( accum );
+
+ /* Execution environment for the reduction code. */
+ initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+
+ /* Push the instruction. */
+ vm_push( (SW)instr );
+
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
+
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( input );
+ vm_push( accum );
+ }
}
else {
instr += SIZEOF_CODE;
@@ -2527,33 +2561,44 @@ again:
PdaRun *pdaRun = (PdaRun*)vm_pop();
if ( pcr != PcrDone ) {
- /* Push the execution. */
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
-
- /* Execution environment for the reduction code. */
- initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
-
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
- vm_push( result );
-
- vm_push( stream );
- vm_push( accum );
-
- /* Push the instruction. */
- vm_push( (SW)instr );
-
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
-
- /* Call execution. */
- instr = exec->code;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
+
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( result );
+
+ vm_push( stream );
+ vm_push( accum );
+
+ /* Execution environment for the reduction code. */
+ initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+
+ /* Push the instruction. */
+ vm_push( (SW)instr );
+
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
+
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( result );
+
+ vm_push( stream );
+ vm_push( accum );
+ }
}
else {
instr += SIZEOF_CODE;
@@ -2635,34 +2680,46 @@ again:
PdaRun *pdaRun = (PdaRun*)vm_pop();
if ( pcr != PcrDone ) {
- /* Push the execution. */
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
-
- /* Execution environment for the reduction code. */
- initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
-
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
- vm_push( (SW)consumed );
- vm_push( result );
-
- vm_push( stream );
- vm_push( accum );
-
- /* Push the instruction. */
- vm_push( (SW)instr );
-
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
-
- /* Call execution. */
- instr = exec->code;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
+
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+ vm_push( result );
+
+ vm_push( stream );
+ vm_push( accum );
+
+ /* Execution environment for the reduction code. */
+ initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+
+ /* Push the instruction. */
+ vm_push( (SW)instr );
+
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
+
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+ vm_push( result );
+
+ vm_push( stream );
+ vm_push( accum );
+ }
}
else {
instr += SIZEOF_CODE;
@@ -2754,32 +2811,44 @@ again:
debug( REALM_BYTECODE, "IN_PARSE_FINISH_BKT2\n" );
if ( pcr != PcrDone ) {
- vm_pushn( SIZEOF_WORD * 20 );
- Execution *pushedExec = (Execution*)vm_ptop();
- memcpy( pushedExec, exec, sizeof(Execution) );
- pdaRun->exec = exec;
-
- /* Execution environment for the reduction code. */
- initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
- pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
- pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
-
- vm_push( (SW)pdaRun );
- vm_push( (SW)fsmRun );
- vm_push( (SW)pcr );
- vm_push( (SW)consumed );
-
- vm_push( tree );
- vm_push( accum );
-
- /* Push the instruction. */
- vm_push( (SW)instr );
-
- /* Push the LHS onto the stack. */
- vm_push( exec->lhs );
-
- /* Call execution. */
- instr = exec->code;
+ if ( pcr == PcrReduction ) {
+ /* Push the execution. */
+ vm_pushn( SIZEOF_WORD * 20 );
+ Execution *pushedExec = (Execution*)vm_ptop();
+ memcpy( pushedExec, exec, sizeof(Execution) );
+ pdaRun->exec = exec;
+
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( tree );
+ vm_push( accum );
+
+ /* Execution environment for the reduction code. */
+ initReductionExecution( pdaRun->exec, prg, &pdaRun->rcodeCollect,
+ pdaRun, fsmRun, prg->rtd->prodInfo[pdaRun->reduction].frameId,
+ pdaRun->fi->codeWV, pdaRun->redLel->tree, 0, 0, fsmRun->mark );
+
+ /* Push the instruction. */
+ vm_push( (SW)instr );
+
+ /* Push the LHS onto the stack. */
+ vm_push( exec->lhs );
+
+ /* Call execution. */
+ instr = exec->code;
+ }
+ else {
+ vm_push( (SW)pdaRun );
+ vm_push( (SW)fsmRun );
+ vm_push( (SW)pcr );
+ vm_push( (SW)consumed );
+
+ vm_push( tree );
+ vm_push( accum );
+ }
}
else {
instr += SIZEOF_CODE;