Showing the changes to src/vm/execution_table.cpp (1 of 5 files). Show all
Unified · Split
| @@ -66,8 +66,22 @@ namespace · 65 unmodified lines | ||
| 66 | 66 | EXEC_DECL(shlw) { vt_ref<word_t>(r.dest) = vt_ref<word_t>(r.mid) << vt_ref<word_t>(r.src); } |
| 67 | 67 | EXEC_DECL(shll) { vt_ref<big_t>(r.dest) = vt_ref<big_t>(r.mid) << vt_ref<big_t>(r.src); } |
| 68 | 68 | EXEC_DECL(shrb) { vt_ref<byte_t>(r.dest) = vt_ref<byte_t>(r.mid) >> vt_ref<byte_t>(r.src); } |
| 69 | − EXEC_DECL(shrw) { vt_ref<word_t>(r.dest) = vt_ref<word_t>(r.mid) >> vt_ref<word_t>(r.src); } | |
| 70 | − EXEC_DECL(shrl) { vt_ref<big_t>(r.dest) = vt_ref<big_t>(r.mid) >> vt_ref<big_t>(r.src); } | |
| 69 | + EXEC_DECL(shrw) | |
| 70 | + { | |
| 71 | + vt_ref<word_t>(r.dest) = vt_ref<word_t>(r.mid) >> vt_ref<word_t>(r.src); | |
| 72 | + // Right shifting a negative number is implementation dependent in C++. | |
| 73 | + // Assert the current compiler defaults to arithmetic shifting, not logical. | |
| 74 | + assert(vt_ref<word_t>(r.mid) >= 0 || (vt_ref<word_t>(r.mid) < 0 && vt_ref<word_t>(r.dest) < 0)); | |
| 75 | + } | |
| 76 | + | |
| 77 | + EXEC_DECL(shrl) | |
| 78 | + { | |
| 79 | + vt_ref<big_t>(r.dest) = vt_ref<big_t>(r.mid) >> vt_ref<big_t>(r.src); | |
| 80 | + // Right shifting a negative number is implementation dependent in C++. | |
| 81 | + // Assert the current compiler defaults to arithmetic shifting, not logical. | |
| 82 | + assert(vt_ref<word_t>(r.mid) >= 0 || (vt_ref<word_t>(r.mid) < 0 && vt_ref<word_t>(r.dest) < 0)); | |
| 83 | + } | |
| 84 | + | |
| 71 | 85 | EXEC_DECL(lsrw) { vt_ref<word_t>(r.dest) = vt_ref<uword_t>(r.mid) >> vt_ref<word_t>(r.src); } |
| 72 | 86 | EXEC_DECL(lsrl) { vt_ref<big_t>(r.dest) = vt_ref<ubig_t>(r.mid) >> vt_ref<big_t>(r.src); } |
| 73 | 87 | |
| @@ -75,14 +89,14 @@ namespace · 1 unmodified line | ||
| 75 | 89 | // Conversion operations |
| 76 | 90 | // |
| 77 | 91 | |
| 78 | − EXEC_DECL(cvtbw) { vt_ref<word_t>(r.dest) = std::numeric_limits<byte_t>::max() & vt_ref<byte_t>(r.src); } | |
| 79 | − EXEC_DECL(cvtwb) { vt_ref<byte_t>(r.dest) = std::numeric_limits<byte_t>::max() & vt_ref<word_t>(r.src); } | |
| 80 | − EXEC_DECL(cvtwl) { vt_ref<big_t>(r.dest) = std::numeric_limits<word_t>::max() & vt_ref<word_t>(r.src); } | |
| 81 | − EXEC_DECL(cvtlw) { vt_ref<word_t>(r.dest) = std::numeric_limits<word_t>::max() & vt_ref<big_t>(r.src); } | |
| 92 | + EXEC_DECL(cvtbw) { vt_ref<word_t>(r.dest) = vt_ref<byte_t>(r.src); } | |
| 93 | + EXEC_DECL(cvtwb) { vt_ref<byte_t>(r.dest) = vt_ref<word_t>(r.src); } | |
| 94 | + EXEC_DECL(cvtwl) { vt_ref<big_t>(r.dest) = vt_ref<word_t>(r.src); } | |
| 95 | + EXEC_DECL(cvtlw) { vt_ref<word_t>(r.dest) = static_cast<word_t>(vt_ref<big_t>(r.src)); } | |
| 82 | 96 | EXEC_DECL(cvtrf) { vt_ref<short_real_t>(r.dest) = static_cast<short_real_t>(vt_ref<real_t>(r.src)); } |
| 83 | 97 | EXEC_DECL(cvtfr) { vt_ref<real_t>(r.dest) = static_cast<real_t>(vt_ref<short_real_t>(r.src)); } |
| 84 | − EXEC_DECL(cvtws) { vt_ref<short_word_t>(r.dest) = std::numeric_limits<short_word_t>::max() & vt_ref<word_t>(r.src); } | |
| 85 | − EXEC_DECL(cvtsw) { vt_ref<word_t>(r.dest) = std::numeric_limits<short_word_t>::max() & vt_ref<short_word_t>(r.src); } | |
| 98 | + EXEC_DECL(cvtws) { vt_ref<short_word_t>(r.dest) = vt_ref<word_t>(r.src); } | |
| 99 | + EXEC_DECL(cvtsw) { vt_ref<word_t>(r.dest) = vt_ref<short_word_t>(r.src); } | |
| 86 | 100 | EXEC_DECL(cvtlf) { vt_ref<real_t>(r.dest) = static_cast<real_t>(vt_ref<big_t>(r.src)); } |
| 87 | 101 | EXEC_DECL(cvtfl) |
| 88 | 102 | { |
| @@ -1626,7 +1640,7 @@ namespace · 1537 unmodified lines | ||
| 1626 | 1640 | if (e->alloc_type == vm_string_t::type_desc()) |
| 1627 | 1641 | { |
| 1628 | 1642 | // String |
| 1629 | − exception_id = dynamic_cast<vm_string_t *>(e); | |
| 1643 | + exception_id = static_cast<vm_string_t *>(e); | |
| 1630 | 1644 | |
| 1631 | 1645 | if (debug::is_component_tracing_enabled<debug::component_trace_t::exception>()) |
| 1632 | 1646 | debug::log_msg(debug::component_trace_t::exception, debug::log_level_t::debug, "raise: string: >>%s<<\n", exception_id->str()); |