blob: 94ee97212f50f2f91103d4bc71edbe147c44da8d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created on: 26 nov. 2011
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#include "AvmcodeLoopCompiler.h"
#include <builder/primitive/AvmcodeCompiler.h>
#include <fml/expression/AvmCode.h>
#include <fml/expression/StatementConstructor.h>
namespace sep
{
////////////////////////////////////////////////////////////////////////////////
// AVMCODE FOR COMPILATION
////////////////////////////////////////////////////////////////////////////////
BFCode AvmcodeForCompiler::compileStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
return( StatementConstructor::newCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->first()),
compileArgRvalue(aCTX, TypeManager::BOOLEAN, aCode->second()),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->third()),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->fourth())) );
}
BFCode AvmcodeForCompiler::optimizeStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->second()),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->third()),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->fourth()) );
AvmInstruction * argsInstruction = optimizedCode->genInstruction();
setArgcodeStatement(aCTX, argsInstruction->at(0), optimizedCode->first());
argsInstruction->at(1).dtype = TypeManager::BOOLEAN;
setArgcodeRValue(aCTX, argsInstruction->at(1), optimizedCode->second());
setArgcodeStatement(aCTX, argsInstruction->at(2), optimizedCode->third());
setArgcodeStatement(aCTX, argsInstruction->at(3), optimizedCode->fourth());
argsInstruction->setMainBytecode(
/*operation*/ AVM_ARG_NOPS,
/*operand */ AVM_ARG_STATEMENT_KIND );
return( optimizedCode );
}
////////////////////////////////////////////////////////////////////////////////
// AVMCODE FOREACH COMPILATION
////////////////////////////////////////////////////////////////////////////////
BFCode AvmcodeForeachCompiler::compileStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
return( StatementConstructor::newCode( aCode->getOperator(),
compileArgLvalue(aCTX, aCode->first()),
compileArgRvalue(aCTX, aCode->second()),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->third()) ) );
}
BFCode AvmcodeForeachCompiler::optimizeStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->second()),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->third()) );
AvmInstruction * argsInstruction = optimizedCode->genInstruction();
setArgcodeLValue(aCTX, argsInstruction->at(0), optimizedCode->first(), false);
setArgcodeRValue(aCTX, argsInstruction->at(1), optimizedCode->second());
setArgcodeStatement(aCTX, argsInstruction->at(2), optimizedCode->third());
argsInstruction->computeMainBytecode(
/*context */ AVM_ARG_STANDARD_CTX,
/*processor*/ AVM_ARG_STATEMENT_CPU,
/*operation*/ AVM_ARG_SEVAL_VALUE,
/*operand */ AVM_ARG_STATEMENT_KIND);
return( optimizedCode );
}
////////////////////////////////////////////////////////////////////////////////
// AVMCODE WHILE DO COMPILATION
////////////////////////////////////////////////////////////////////////////////
BFCode AvmcodeWhileDoCompiler::compileStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
return( StatementConstructor::newCode(aCode->getOperator(),
compileArgRvalue(aCTX, TypeManager::BOOLEAN, aCode->first()),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->second())) );
}
BFCode AvmcodeWhileDoCompiler::optimizeStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode(StatementConstructor::newCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->second())) );
AvmInstruction * argsInstruction = optimizedCode->genInstruction();
argsInstruction->at(0).dtype = TypeManager::BOOLEAN;
setArgcodeRValue(aCTX, argsInstruction->at(0), optimizedCode->first());
setArgcodeStatement(aCTX, argsInstruction->at(1), optimizedCode->second());
argsInstruction->setMainBytecode(
/*operation*/ AVM_ARG_NOPS,
/*operand */ AVM_ARG_STATEMENT_KIND );
return( optimizedCode );
}
////////////////////////////////////////////////////////////////////////////////
// AVMCODE DO WHILE COMPILATION
////////////////////////////////////////////////////////////////////////////////
BFCode AvmcodeDoWhileCompiler::compileStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
return( StatementConstructor::newCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->first()),
compileArgRvalue(aCTX, TypeManager::BOOLEAN, aCode->second())) );
}
BFCode AvmcodeDoWhileCompiler::optimizeStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode(StatementConstructor::newCode(aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->second())) );
AvmInstruction * argsInstruction = optimizedCode->genInstruction();
setArgcodeStatement(aCTX, argsInstruction->at(0), optimizedCode->first());
argsInstruction->at(1).dtype = TypeManager::BOOLEAN;
setArgcodeRValue(aCTX, argsInstruction->at(1), optimizedCode->second());
argsInstruction->setMainBytecode(
/*operation*/ AVM_ARG_NOPS,
/*operand */ AVM_ARG_STATEMENT_KIND );
return( optimizedCode );
}
} /* namespace sep */