Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
1.9 kB · 88 lines
C++
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889#ifndef INTERPRETER_MATHOPCODES_H_INCLUDED#define INTERPRETER_MATHOPCODES_H_INCLUDED
#include <cmath>#include <stdexcept>
#include "opcodes.hpp"#include "runtime.hpp"
namespace Interpreter{ template <typename T> class OpAddInt : public Opcode0 { public: void execute(Runtime& runtime) override { T result = getData<T>(runtime[1]) + getData<T>(runtime[0]);
runtime.pop();
getData<T>(runtime[0]) = result; } };
template <typename T> class OpSubInt : public Opcode0 { public: void execute(Runtime& runtime) override { T result = getData<T>(runtime[1]) - getData<T>(runtime[0]);
runtime.pop();
getData<T>(runtime[0]) = result; } };
template <typename T> class OpMulInt : public Opcode0 { public: void execute(Runtime& runtime) override { T result = getData<T>(runtime[1]) * getData<T>(runtime[0]);
runtime.pop();
getData<T>(runtime[0]) = result; } };
template <typename T> class OpDivInt : public Opcode0 { public: void execute(Runtime& runtime) override { T left = getData<T>(runtime[0]);
if (left == 0) throw std::runtime_error("division by zero");
T result = getData<T>(runtime[1]) / left;
runtime.pop();
getData<T>(runtime[0]) = result; } };
template <typename T, typename C> class OpCompare : public Opcode0 { public: void execute(Runtime& runtime) override { int result = C()(getData<T>(runtime[1]), getData<T>(runtime[0]));
runtime.pop();
runtime[0].mInteger = result; } };}
#endif