Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.05 KB | None | 0 0
  1. /* static */ const machine::op_map machine::OPERATIONS {{
  2. {op_t::ADD, [](machine *m){m->binop_func(std::plus<>());}},
  3. {op_t::SUB, [](machine *m){m->binop_func(std::minus<>());}},
  4. {op_t::INC, [](machine *m){m->stack.top()++;}},
  5. {op_t::DEC, [](machine *m){m->stack.top()--;}},
  6. {op_t::AND, [](machine *m){m->binop_func(std::bit_and<>());}},
  7. {op_t::OR, [](machine *m){m->binop_func(std::bit_or<>());}},
  8. {op_t::NOT, [](machine *m){m->stack.top() = ~m->stack.top();}},
  9. {op_t::XOR, [](machine *m){m->binop_func(std::bit_xor<>());}},
  10. {op_t::SHR, [](machine *m){m->binop_func([](uint16_t a, uint16_t b){return a >> b;});}},
  11. {op_t::SHL, [](machine *m){m->binop_func([](uint16_t a, uint16_t b){return a << b;});}},
  12.  
  13. {op_t::TGT, [](machine *m){m->comp_func(std::greater<>());}},
  14. {op_t::TLT, [](machine *m){m->comp_func(std::less<>());}},
  15. {op_t::TEQ, [](machine *m){m->comp_func(std::equal_to<>());}},
  16. {op_t::TSZ, [](machine *m){m->comp_func([](uint16_t t, uint16_t){return t == 0;});}},
  17.  
  18. // SET,SSET special
  19. {op_t::LOAD, &machine::load_func},
  20. {op_t::STORE, &machine::store_func},
  21. {op_t::BRANCH, [](machine *m){m->terminate = true;}},
  22. {op_t::BRZERO, [](machine *m){m->terminate = true;}},
  23. {op_t::IBRANCH, [](machine *m){m->terminate = true;}},
  24. {op_t::CALL, [](machine *m){m->terminate = true;}},
  25. {op_t::RETURN, [](machine *m){m->terminate = true;}},
  26. {op_t::STOP, [](machine *m){m->terminate = true;}},
  27. {op_t::OUT, [](machine *m){std::cout << m->stack.top() << '\n';}},
  28.  
  29. {op_t::DROP, [](machine* m){m->stack.pop();}},
  30. {op_t::DUP, [](machine* m){m->stack.push(m->stack.top());}},
  31. {op_t::SWAP, &machine::swap_func},
  32. {op_t::RSD3, [](machine *m){m->terminate = true;}},
  33. {op_t::RSU3, [](machine *m){m->terminate = true;}},
  34. {op_t::TUCK2, [](machine *m){m->terminate = true;}},
  35. {op_t::TUCK3, [](machine *m){m->terminate = true;}},
  36. {op_t::COPY3, [](machine *m){m->terminate = true;}},
  37. // PUSH special
  38. {op_t::POP, [](machine *m){m->terminate = true;}},
  39. }};
  40.  
  41. void machine::set_func(uint16_t v)
  42. {
  43. this->stack.push(v);
  44. }
  45.  
  46. void machine::load_func()
  47. {
  48. uint16_t addr = this->stack.top();
  49. this->stack.pop();
  50. this->stack.push(this->mem.at(addr));
  51. }
  52.  
  53. void machine::store_func()
  54. {
  55. uint16_t addr = this->stack.top();
  56. this->stack.pop();
  57. uint16_t val = this->stack.top();
  58. this->stack.pop();
  59. this->mem.at(addr) = val;
  60. }
  61.  
  62. void machine::swap_func()
  63. {
  64. uint16_t a = this->stack.top();
  65. this->stack.pop();
  66. uint16_t b = this->stack.top();
  67. this->stack.pop();
  68. this->stack.push(a);
  69. this->stack.push(b);
  70. }
  71.  
  72. void machine::binop_func(std::function<uint16_t(uint16_t, uint16_t)> op)
  73. {
  74. uint16_t a = this->stack.top();
  75. this->stack.pop();
  76. uint16_t b = this->stack.top();
  77. this->stack.pop();
  78. this->stack.push(op(b, a));
  79. }
  80.  
  81. void machine::comp_func(std::function<bool(uint16_t, uint16_t)> op)
  82. {
  83. uint16_t top = this->stack.top();
  84. this->stack.pop();
  85. uint16_t next = this->stack.top(); // no peeking..
  86. this->stack.push(top); // restore
  87. // sets nth bit (zero) to result of op
  88. this->flags ^= (-static_cast<uint8_t>(op(top, next)) ^ this->flags)
  89. & (1 << static_cast<uint8_t>(machine::flagbit::ZERO));
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement