<commit_before>
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstring>

#include "error.hpp"
#include "type_store.hpp"
#include "util.hpp"
#include "wrapped_operator.hpp"

namespace processwarp {

// Constructor with memory accessor.
WrappedOperator::WrappedOperator(VMemory::Accessor& memory_) :
    memory(memory_) {
}

// デストラクタ。
WrappedOperator::~WrappedOperator() {
  // 基底クラスなため、virtual宣言を行うが何もしない。
}

// bit_cast命令に対応したキャスト演算を行う。
void WrappedOperator::bit_cast(vaddr_t dst, size_t size, vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 値をコピーする。
void WrappedOperator::copy_value(vaddr_t dst, vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 値を読み込む
longest_int_t WrappedOperator::get(vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 比較命令(isnan(a) || isnan(b))に対応した演算を行う。
bool WrappedOperator::is_or_nans(vaddr_t a, vaddr_t b) {
  throw_error(Error::INST_VIOLATION);
}

/**
 * TypeBaseクラスの2項演算子はすべてVOILATIONとする。
 * @param op メソッド名
 */
#define M_BINARY_OPERATOR_VIOLATION(op)                         \
  void WrappedOperator::op(vaddr_t dst, vaddr_t a, vaddr_t b) { \
    throw_error(Error::INST_VIOLATION);                         \
  }

M_BINARY_OPERATOR_VIOLATION(op_add);    // 加算
M_BINARY_OPERATOR_VIOLATION(op_and);    // and
M_BINARY_OPERATOR_VIOLATION(op_div);    // 除算
M_BINARY_OPERATOR_VIOLATION(op_mul);    // 乗算
M_BINARY_OPERATOR_VIOLATION(op_or);     // or
M_BINARY_OPERATOR_VIOLATION(op_rem);    // 剰余
M_BINARY_OPERATOR_VIOLATION(op_shl);    // 左シフト
M_BINARY_OPERATOR_VIOLATION(op_shr);    // 右シフト
M_BINARY_OPERATOR_VIOLATION(op_sub);    // 減算
M_BINARY_OPERATOR_VIOLATION(op_xor);    // xor

// 比較演算もすべてVIOLATIONにしておく
M_BINARY_OPERATOR_VIOLATION(op_equal);          // a==b
M_BINARY_OPERATOR_VIOLATION(op_greater);        // a>b
M_BINARY_OPERATOR_VIOLATION(op_greater_equal);  // a>=b
M_BINARY_OPERATOR_VIOLATION(op_not_nans);       // !isnan(a) && !isnan(b)
M_BINARY_OPERATOR_VIOLATION(op_not_equal);      // a!=b

#undef M_BINARY_OPERATOR_VIOLATION

/** */
bool WrappedOperator::is_equal(vaddr_t a, vaddr_t b) {
  throw_error(Error::INST_VIOLATION);
}

// type_cast命令に対応したキャスト演算を行う。
void WrappedOperator::type_cast(vaddr_t dst, vaddr_t type, vaddr_t src) {
  print_llvm_instruction();
  throw_error(Error::INST_VIOLATION);
}

// Constructor with memory accessor.
template <typename T>
WrappedPrimitiveOperator<T>::WrappedPrimitiveOperator(VMemory::Accessor& memory) :
    WrappedOperator(memory) {
}

// bit_cast命令に対応したキャスト演算を行う。
template <typename T>
void WrappedPrimitiveOperator<T>::bit_cast(vaddr_t dst, size_t size, vaddr_t src) {
  longest_uint_t buffer = 0;
  *reinterpret_cast<T*>(buffer) = memory.read<T>(src);
  memory.write_copy(dst, reinterpret_cast<const uint8_t*>(&buffer), size);
  // print_debug("bitcast %" PRId64 " (%016" PRIx64 " <- %016" PRIx64 ")\n", buffer, dst, src);
}

// 値をコピーする。
template <typename T>
void WrappedPrimitiveOperator<T>::copy_value(vaddr_t dst, vaddr_t src) {
  memory.write<T>(dst, memory.read<T>(src));
  /*
    print_debug("copy_value %" PRId64 " (%016" PRIx64 " <- %016" PRIx64")\n",<commit_msg>remove debug instruction because it need LLVM to compile worker<commit_after>
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstring>

#include "error.hpp"
#include "type_store.hpp"
#include "util.hpp"
#include "wrapped_operator.hpp"

namespace processwarp {

// Constructor with memory accessor.
WrappedOperator::WrappedOperator(VMemory::Accessor& memory_) :
    memory(memory_) {
}

// デストラクタ。
WrappedOperator::~WrappedOperator() {
  // 基底クラスなため、virtual宣言を行うが何もしない。
}

// bit_cast命令に対応したキャスト演算を行う。
void WrappedOperator::bit_cast(vaddr_t dst, size_t size, vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 値をコピーする。
void WrappedOperator::copy_value(vaddr_t dst, vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 値を読み込む
longest_int_t WrappedOperator::get(vaddr_t src) {
  throw_error(Error::INST_VIOLATION);
}

// 比較命令(isnan(a) || isnan(b))に対応した演算を行う。
bool WrappedOperator::is_or_nans(vaddr_t a, vaddr_t b) {
  throw_error(Error::INST_VIOLATION);
}

/**
 * TypeBaseクラスの2項演算子はすべてVOILATIONとする。
 * @param op メソッド名
 */
#define M_BINARY_OPERATOR_VIOLATION(op)                         \
  void WrappedOperator::op(vaddr_t dst, vaddr_t a, vaddr_t b) { \
    throw_error(Error::INST_VIOLATION);                         \
  }

M_BINARY_OPERATOR_VIOLATION(op_add);    // 加算
M_BINARY_OPERATOR_VIOLATION(op_and);    // and
M_BINARY_OPERATOR_VIOLATION(op_div);    // 除算
M_BINARY_OPERATOR_VIOLATION(op_mul);    // 乗算
M_BINARY_OPERATOR_VIOLATION(op_or);     // or
M_BINARY_OPERATOR_VIOLATION(op_rem);    // 剰余
M_BINARY_OPERATOR_VIOLATION(op_shl);    // 左シフト
M_BINARY_OPERATOR_VIOLATION(op_shr);    // 右シフト
M_BINARY_OPERATOR_VIOLATION(op_sub);    // 減算
M_BINARY_OPERATOR_VIOLATION(op_xor);    // xor

// 比較演算もすべてVIOLATIONにしておく
M_BINARY_OPERATOR_VIOLATION(op_equal);          // a==b
M_BINARY_OPERATOR_VIOLATION(op_greater);        // a>b
M_BINARY_OPERATOR_VIOLATION(op_greater_equal);  // a>=b
M_BINARY_OPERATOR_VIOLATION(op_not_nans);       // !isnan(a) && !isnan(b)
M_BINARY_OPERATOR_VIOLATION(op_not_equal);      // a!=b

#undef M_BINARY_OPERATOR_VIOLATION

/** */
bool WrappedOperator::is_equal(vaddr_t a, vaddr_t b) {
  throw_error(Error::INST_VIOLATION);
}

// type_cast命令に対応したキャスト演算を行う。
void WrappedOperator::type_cast(vaddr_t dst, vaddr_t type, vaddr_t src) {
  // print_llvm_instruction();
  throw_error(Error::INST_VIOLATION);
}

// Constructor with memory accessor.
template <typename T>
WrappedPrimitiveOperator<T>::WrappedPrimitiveOperator(VMemory::Accessor& memory) :
    WrappedOperator(memory) {
}

// bit_cast命令に対応したキャスト演算を行う。
template <typename T>
void WrappedPrimitiveOperator<T>::bit_cast(vaddr_t dst, size_t size, vaddr_t src) {
  longest_uint_t buffer = 0;
  *reinterpret_cast<T*>(buffer) = memory.read<T>(src);
  memory.write_copy(dst, reinterpret_cast<const uint8_t*>(&buffer), size);
  // print_debug("bitcast %" PRId64 " (%016" PRIx64 " <- %016" PRIx64 ")\n", buffer, dst, src);
}

// 値をコピーする。
template <typename T>
void WrappedPrimitiveOperator<T>::copy_value(vaddr_t dst, vaddr_t src) {
  memory.write<T>(dst, memory.read<T>(src));
  /*
    print_debug("copy_value %" PRId64 " (%016" PRIx64 " <- %016" PRIx64")\n",
{'fraction_non_alphanumeric': 0.1327165417131919, 'fraction_numerical': 0.008613814005423513, 'mean_word_length': 5.105160662122687, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4600299', 'n_tokens_mistral': 2724, 'n_tokens_neox': 2715, 'n_words': 366}