diff options
author | Adrian Thurston <thurston@complang.org> | 2011-11-13 03:22:33 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2011-11-13 03:22:33 +0000 |
commit | 463d17ac6b31219b640ae6fb6f73f505d6114eb7 (patch) | |
tree | fb683278acb091205b291de56a83138ab67bf61e | |
parent | d9370160a0584c5913b3c1aa4d985e3d4afe9730 (diff) | |
download | colm-463d17ac6b31219b640ae6fb6f73f505d6114eb7.tar.gz |
Some prep for factoring generation actions out of the parse loop. refs #332.
-rw-r--r-- | colm/bytecode.c | 375 |
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; |