blob: 6ba4b350998e41b1c122f7a54f1161c6cd997df4 [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 "AvmcodeIteCompiler.h"
#include <builder/primitive/AvmcodeCompiler.h>
#include <fml/expression/AvmCode.h>
#include <fml/expression/StatementConstructor.h>
namespace sep
{
////////////////////////////////////////////////////////////////////////////////
// AVMCODE IF THE ELSE COMPILATION
////////////////////////////////////////////////////////////////////////////////
BF AvmcodeIteCompiler::compileExpression(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode aCompiledCode( aCode->getOperator(),
compileArgRvalue(aCTX, TypeManager::BOOLEAN, aCode->first()),
compileArgRvalue(aCTX, aCode->second()) );
if( aCode->isOpCode( AVM_OPCODE_IFE ) )
{
aCompiledCode->append( compileArgRvalue(aCTX, aCode->third()) );
}
return( aCompiledCode );
}
BF AvmcodeIteCompiler::optimizeExpression(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode( aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->second()) );
AvmInstruction * argsInstruction =
optimizedCode->newInstruction( aCode->size() );
argsInstruction->at(0).dtype = TypeManager::BOOLEAN;
setArgcodeRValue(aCTX, argsInstruction->at(0), optimizedCode->first());
argsInstruction->at(1).dtype = TypeManager::UNIVERSAL;
setArgcodeRValue(aCTX, argsInstruction->at(1), optimizedCode->second());
if( aCode->isOpCode( AVM_OPCODE_IFE ) )
{
optimizedCode->append( AVMCODE_COMPILER.decode_optimizeExpression(
aCTX, aCode->third()) );
argsInstruction->at(2).dtype = TypeManager::UNIVERSAL;
setArgcodeRValue(aCTX, argsInstruction->at(2), optimizedCode->third());
}
argsInstruction->computeMainBytecode(
/*context */ AVM_ARG_STANDARD_CTX,
/*processor*/ AVM_ARG_ARITHMETIC_LOGIC_CPU,
/*operation*/ AVM_ARG_SEVAL_RVALUE,
/*operand */ AVM_ARG_EXPRESSION_KIND);
return( optimizedCode );
}
BFCode AvmcodeIteCompiler::compileStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode aCompiledCode( aCode->getOperator(),
compileArgRvalue(aCTX, TypeManager::BOOLEAN, aCode->first()),
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->second()) );
if( aCode->isOpCode( AVM_OPCODE_IFE ) )
{
aCompiledCode->append(
AVMCODE_COMPILER.decode_compileStatement(aCTX, aCode->third()) );
}
return( aCompiledCode );
}
BFCode AvmcodeIteCompiler::optimizeStatement(
COMPILE_CONTEXT * aCTX, const BFCode & aCode)
{
BFCode optimizedCode( aCode->getOperator(),
AVMCODE_COMPILER.decode_optimizeExpression(aCTX, aCode->first()),
AVMCODE_COMPILER.decode_optimizeStatement(aCTX, aCode->second()) );
AvmInstruction * argsInstruction =
optimizedCode->newInstruction( aCode->size() );
argsInstruction->at(0).dtype = TypeManager::BOOLEAN;
setArgcodeRValue(aCTX, argsInstruction->at(0), optimizedCode->first());
setArgcodeStatement(aCTX, argsInstruction->at(1), optimizedCode->second());
if( aCode->isOpCode( AVM_OPCODE_IFE ) )
{
optimizedCode->append( AVMCODE_COMPILER.decode_optimizeStatement(
aCTX, aCode->third()) );
setArgcodeStatement(aCTX, argsInstruction->at(2), optimizedCode->third());
}
argsInstruction->computeMainBytecode(
/*context */ AVM_ARG_STANDARD_CTX,
/*processor*/ AVM_ARG_STATEMENT_CPU,
/*operation*/ AVM_ARG_SEVAL_RVALUE,
/*operand */ AVM_ARG_STATEMENT_KIND);
return( optimizedCode );
}
} /* namespace sep */