#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_operation_h
#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_operation_h

/*
 * $Id$
 *
 * [ Description ]
 * 
 */

#include "Common/include/ToString.h"
#include "Common/include/Debug.h"
#include "Common/include/ErrorMorpheo.h"
#include "Behavioural/include/Types.h"
#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h"

namespace morpheo {
namespace behavioural {
namespace core {
namespace multi_execute_loop {
namespace execute_loop {
namespace multi_execute_unit {
namespace execute_unit {
namespace functionnal_unit {

  void operation_unimplemented   (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_add           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_addc          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sub           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
//void operation_l_mul           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
//void operation_l_mulu          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
//void operation_l_div           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
//void operation_l_divu          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_and           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_or            (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_xor           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_test_f        (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_test_nf       (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_jalr          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sll           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sra           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_srl           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_ror           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_movhi         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_extend_s      (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_extend_z      (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_cmov          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_ff1           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_fl1           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_mfspr         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_mtspr         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfeq          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfne          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfgeu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfgtu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfleu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfltu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfges         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfgts         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sfles         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_sflts         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_mac           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_msb           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
  void operation_l_macrc         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);

}; // end namespace functionnal_unit
}; // end namespace execute_unit
}; // end namespace multi_execute_unit
}; // end namespace execute_loop
}; // end namespace multi_execute_loop
}; // end namespace core
}; // end namespace behavioural
}; // end namespace morpheo              

#endif
