Drop '---' section boundaries from filenames. I noticed them confusing
tab-completion for certain advanced shell setups.
This commit is contained in:
Kartik Agaram 2020-05-24 22:43:18 -07:00
parent f92836550b
commit fcc161e705
28 changed files with 1336 additions and 1336 deletions

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 010---vm.cc</title>
<title>Mu - 010vm.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
@ -57,7 +57,7 @@ if ('onhashchange' in window) {
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/010---vm.cc'>https://github.com/akkartik/mu/blob/master/010---vm.cc</a>
<a href='https://github.com/akkartik/mu/blob/master/010vm.cc'>https://github.com/akkartik/mu/blob/master/010vm.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Core data structures for simulating the SubX VM (subset of an x86 processor),</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: either in tests or debug aids.</span>
@ -68,33 +68,33 @@ if ('onhashchange' in window) {
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">enum</span> <span class="Delimiter">{</span>
<span id="L10" class="LineNr"> 10 </span> <a href='010---vm.cc.html#L10'>EAX</a><span class="Delimiter">,</span>
<span id="L11" class="LineNr"> 11 </span> <a href='010---vm.cc.html#L11'>ECX</a><span class="Delimiter">,</span>
<span id="L12" class="LineNr"> 12 </span> <a href='010---vm.cc.html#L12'>EDX</a><span class="Delimiter">,</span>
<span id="L13" class="LineNr"> 13 </span> <a href='010---vm.cc.html#L13'>EBX</a><span class="Delimiter">,</span>
<span id="L14" class="LineNr"> 14 </span> <a href='010---vm.cc.html#L14'>ESP</a><span class="Delimiter">,</span>
<span id="L15" class="LineNr"> 15 </span> <a href='010---vm.cc.html#L15'>EBP</a><span class="Delimiter">,</span>
<span id="L16" class="LineNr"> 16 </span> <a href='010---vm.cc.html#L16'>ESI</a><span class="Delimiter">,</span>
<span id="L17" class="LineNr"> 17 </span> <a href='010---vm.cc.html#L17'>EDI</a><span class="Delimiter">,</span>
<span id="L18" class="LineNr"> 18 </span> <a href='010---vm.cc.html#L18'>NUM_INT_REGISTERS</a><span class="Delimiter">,</span>
<span id="L10" class="LineNr"> 10 </span> <a href='010vm.cc.html#L10'>EAX</a><span class="Delimiter">,</span>
<span id="L11" class="LineNr"> 11 </span> <a href='010vm.cc.html#L11'>ECX</a><span class="Delimiter">,</span>
<span id="L12" class="LineNr"> 12 </span> <a href='010vm.cc.html#L12'>EDX</a><span class="Delimiter">,</span>
<span id="L13" class="LineNr"> 13 </span> <a href='010vm.cc.html#L13'>EBX</a><span class="Delimiter">,</span>
<span id="L14" class="LineNr"> 14 </span> <a href='010vm.cc.html#L14'>ESP</a><span class="Delimiter">,</span>
<span id="L15" class="LineNr"> 15 </span> <a href='010vm.cc.html#L15'>EBP</a><span class="Delimiter">,</span>
<span id="L16" class="LineNr"> 16 </span> <a href='010vm.cc.html#L16'>ESI</a><span class="Delimiter">,</span>
<span id="L17" class="LineNr"> 17 </span> <a href='010vm.cc.html#L17'>EDI</a><span class="Delimiter">,</span>
<span id="L18" class="LineNr"> 18 </span> <a href='010vm.cc.html#L18'>NUM_INT_REGISTERS</a><span class="Delimiter">,</span>
<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">};</span>
<span id="L20" class="LineNr"> 20 </span><span class="Normal">union</span> <a href='010---vm.cc.html#L20'>reg</a> <span class="Delimiter">{</span>
<span id="L20" class="LineNr"> 20 </span><span class="Normal">union</span> <a href='010vm.cc.html#L20'>reg</a> <span class="Delimiter">{</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Normal">int32_t</span> i<span class="Delimiter">;</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Normal">uint32_t</span> u<span class="Delimiter">;</span>
<span id="L23" class="LineNr"> 23 </span><span class="Delimiter">};</span>
<span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L25" class="LineNr"> 25 </span><a href='010---vm.cc.html#L20'>reg</a> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[NUM_INT_REGISTERS] = <span class="Delimiter">{</span> <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">}</span> <span class="Delimiter">};</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">uint32_t</span> <a href='010---vm.cc.html#L26'>EIP</a> = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// preserve null pointer</span>
<span id="L25" class="LineNr"> 25 </span><a href='010vm.cc.html#L20'>reg</a> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[NUM_INT_REGISTERS] = <span class="Delimiter">{</span> <span class="Delimiter">{</span><span class="Constant">0</span><span class="Delimiter">}</span> <span class="Delimiter">};</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">uint32_t</span> <a href='010vm.cc.html#L26'>EIP</a> = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// preserve null pointer</span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L28" class="LineNr"> 28 </span>bzero<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span><span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span><span class="Delimiter">));</span>
<span id="L29" class="LineNr"> 29 </span><a href='010---vm.cc.html#L26'>EIP</a> = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// preserve null pointer</span>
<span id="L28" class="LineNr"> 28 </span>bzero<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span><span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span><span class="Delimiter">));</span>
<span id="L29" class="LineNr"> 29 </span><a href='010vm.cc.html#L26'>EIP</a> = <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// preserve null pointer</span>
<span id="L30" class="LineNr"> 30 </span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Contents&quot;)</span>
<span id="L32" class="LineNr"> 32 </span>cerr &lt;&lt; <span class="Constant">&quot; registers\n&quot;</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Texts&quot;)</span>
<span id="L34" class="LineNr"> 34 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='001help.cc.html#L53'>Help</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;registers&quot;</span><span class="Delimiter">,</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Constant">&quot;SubX currently supports eight 32-bit integer registers. From 0 to 7, they are:\n&quot;</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Constant">&quot; <a href='010---vm.cc.html#L10'>EAX</a> <a href='010---vm.cc.html#L11'>ECX</a> <a href='010---vm.cc.html#L12'>EDX</a> <a href='010---vm.cc.html#L13'>EBX</a> <a href='010---vm.cc.html#L14'>ESP</a> <a href='010---vm.cc.html#L15'>EBP</a> <a href='010---vm.cc.html#L16'>ESI</a> EDI\n&quot;</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Constant">&quot; <a href='010vm.cc.html#L10'>EAX</a> <a href='010vm.cc.html#L11'>ECX</a> <a href='010vm.cc.html#L12'>EDX</a> <a href='010vm.cc.html#L13'>EBX</a> <a href='010vm.cc.html#L14'>ESP</a> <a href='010vm.cc.html#L15'>EBP</a> <a href='010vm.cc.html#L16'>ESI</a> EDI\n&quot;</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Constant">&quot;ESP contains the top of the stack.\n&quot;</span>
<span id="L38" class="LineNr"> 38 </span> <span class="Constant">&quot;\n&quot;</span>
<span id="L39" class="LineNr"> 39 </span> <span class="Constant">&quot;-- 8-bit registers\n&quot;</span>
@ -102,11 +102,11 @@ if ('onhashchange' in window) {
<span id="L41" class="LineNr"> 41 </span> <span class="Constant">&quot;From 0 to 7, they are:\n&quot;</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Constant">&quot; AL CL DL BL AH CH DH BH\n&quot;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Constant">&quot;The 8-bit registers overlap with the 32-bit ones. AL is the lowest signicant byte\n&quot;</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Constant">&quot;of <a href='010---vm.cc.html#L10'>EAX</a>, AH is the second lowest significant byte, and so on.\n&quot;</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Constant">&quot;of <a href='010vm.cc.html#L10'>EAX</a>, AH is the second lowest significant byte, and so on.\n&quot;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Constant">&quot;\n&quot;</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Constant">&quot;For example, if <a href='010---vm.cc.html#L13'>EBX</a> contains 0x11223344, then BL contains 0x44, and BH contains 0x33.\n&quot;</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Constant">&quot;For example, if <a href='010vm.cc.html#L13'>EBX</a> contains 0x11223344, then BL contains 0x44, and BH contains 0x33.\n&quot;</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Constant">&quot;\n&quot;</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Constant">&quot;There is no way to access bytes within <a href='010---vm.cc.html#L14'>ESP</a>, <a href='010---vm.cc.html#L15'>EBP</a>, <a href='010---vm.cc.html#L16'>ESI</a> or EDI.\n&quot;</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Constant">&quot;There is no way to access bytes within <a href='010vm.cc.html#L14'>ESP</a>, <a href='010vm.cc.html#L15'>EBP</a>, <a href='010vm.cc.html#L16'>ESI</a> or EDI.\n&quot;</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Constant">&quot;\n&quot;</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Constant">&quot;For complete details consult the IA-32 software developer's manual, volume 2,\n&quot;</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Constant">&quot;table 2-2, \&quot;</span><span class="Constant">32</span>-bit addressing forms with the ModR/<span class="Special">M</span> byte\<span class="Constant">&quot;.\n&quot;</span>
@ -119,10 +119,10 @@ if ('onhashchange' in window) {
<span id="L58" class="LineNr"> 58 </span> <span class="Constant">&quot;'flag' registers, as a side-effect:\n&quot;</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Constant">&quot;- the sign flag (SF): usually set if an arithmetic result is negative, or\n&quot;</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Constant">&quot; <a href='000organization.cc.html#L150'>reset</a> if not.\n&quot;</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Constant">&quot;- the zero flag (<a href='010---vm.cc.html#L80'>ZF</a>): usually set if a result is zero, or <a href='000organization.cc.html#L150'>reset</a> if not.\n&quot;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Constant">&quot;- the carry flag (<a href='010---vm.cc.html#L81'>CF</a>): usually set if an arithmetic result overflows by just one bit.\n&quot;</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Constant">&quot;- the zero flag (<a href='010vm.cc.html#L80'>ZF</a>): usually set if a result is zero, or <a href='000organization.cc.html#L150'>reset</a> if not.\n&quot;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Constant">&quot;- the carry flag (<a href='010vm.cc.html#L81'>CF</a>): usually set if an arithmetic result overflows by just one bit.\n&quot;</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Constant">&quot; Useful for operating on unsigned numbers.\n&quot;</span>
<span id="L64" class="LineNr"> 64 </span> <span class="Constant">&quot;- the overflow flag (<a href='010---vm.cc.html#L82'>OF</a>): usually set if an arithmetic result overflows by more\n&quot;</span>
<span id="L64" class="LineNr"> 64 </span> <span class="Constant">&quot;- the overflow flag (<a href='010vm.cc.html#L82'>OF</a>): usually set if an arithmetic result overflows by more\n&quot;</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Constant">&quot; than one bit. Useful for operating on signed numbers.\n&quot;</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Constant">&quot;The flag bits are read by conditional jumps.\n&quot;</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Constant">&quot;\n&quot;</span>
@ -138,17 +138,17 @@ if ('onhashchange' in window) {
<span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L78" class="LineNr"> 78 </span><span class="Comment">// the subset of x86 flag registers we care about</span>
<span id="L79" class="LineNr"> 79 </span><span class="Normal">bool</span> SF = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// sign flag</span>
<span id="L80" class="LineNr"> 80 </span><span class="Normal">bool</span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// zero flag</span>
<span id="L81" class="LineNr"> 81 </span><span class="Normal">bool</span> <a href='010---vm.cc.html#L81'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// carry flag</span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">bool</span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// overflow flag</span>
<span id="L80" class="LineNr"> 80 </span><span class="Normal">bool</span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// zero flag</span>
<span id="L81" class="LineNr"> 81 </span><span class="Normal">bool</span> <a href='010vm.cc.html#L81'>CF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// carry flag</span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">bool</span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span> <span class="Comment">// overflow flag</span>
<span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L84" class="LineNr"> 84 </span>SF = <a href='010---vm.cc.html#L80'>ZF</a> = <a href='010---vm.cc.html#L81'>CF</a> = <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L84" class="LineNr"> 84 </span>SF = <a href='010vm.cc.html#L80'>ZF</a> = <a href='010vm.cc.html#L81'>CF</a> = <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="SalientComment">//:: simulated RAM</span>
<span id="L87" class="LineNr"> 87 </span>
<span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L89" class="LineNr"> 89 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a> = <span class="Constant">0x1000000</span><span class="Delimiter">;</span> <span class="Comment">// 16MB</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='010---vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> x<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L89" class="LineNr"> 89 </span><span class="Normal">const</span> <span class="Normal">uint32_t</span> <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a> = <span class="Constant">0x1000000</span><span class="Delimiter">;</span> <span class="Comment">// 16MB</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='010vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> x<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Identifier">return</span> <span class="Delimiter">(</span>x+align-<span class="Constant">1</span><span class="Delimiter">)</span> &amp; -<span class="Delimiter">(</span>align<span class="Delimiter">);</span>
<span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
<span id="L93" class="LineNr"> 93 </span>
@ -157,46 +157,46 @@ if ('onhashchange' in window) {
<span id="L96" class="LineNr"> 96 </span><span class="Normal">struct</span> vma <span class="Delimiter">{</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Normal">uint32_t</span> start<span class="Delimiter">;</span> <span class="Comment">// inclusive</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Normal">uint32_t</span> end<span class="Delimiter">;</span> <span class="Comment">// exclusive</span>
<span id="L99" class="LineNr"> 99 </span> vector&lt;<span class="Normal">uint8_t</span>&gt; <a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">;</span>
<span id="L99" class="LineNr"> 99 </span> vector&lt;<span class="Normal">uint8_t</span>&gt; <a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> vma<span class="Delimiter">(</span><span class="Normal">uint32_t</span> s<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> e<span class="Delimiter">)</span> :start<span class="Delimiter">(</span>s<span class="Delimiter">),</span> end<span class="Delimiter">(</span>e<span class="Delimiter">)</span> <span class="Delimiter">{}</span>
<span id="L101" class="LineNr">101 </span> vma<span class="Delimiter">(</span><span class="Normal">uint32_t</span> s<span class="Delimiter">)</span> :start<span class="Delimiter">(</span>s<span class="Delimiter">),</span> end<span class="Delimiter">(</span><a href='010---vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span>s+<span class="Constant">1</span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">))</span> <span class="Delimiter">{}</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">bool</span> <a href='010---vm.cc.html#L102'>match</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> a<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L101" class="LineNr">101 </span> vma<span class="Delimiter">(</span><span class="Normal">uint32_t</span> s<span class="Delimiter">)</span> :start<span class="Delimiter">(</span>s<span class="Delimiter">),</span> end<span class="Delimiter">(</span><a href='010vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span>s+<span class="Constant">1</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">))</span> <span class="Delimiter">{}</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">bool</span> <a href='010vm.cc.html#L102'>match</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> a<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L103" class="LineNr">103 </span> <span class="Identifier">return</span> a &gt;= start &amp;&amp; a &lt; end<span class="Delimiter">;</span>
<span id="L104" class="LineNr">104 </span> <span class="Delimiter">}</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">bool</span> <a href='010---vm.cc.html#L105'>match32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> a<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">bool</span> <a href='010vm.cc.html#L105'>match32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> a<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span> <span class="Identifier">return</span> a &gt;= start &amp;&amp; a+<span class="Constant">4</span> &lt;= end<span class="Delimiter">;</span>
<span id="L107" class="LineNr">107 </span> <span class="Delimiter">}</span>
<span id="L108" class="LineNr">108 </span> <span class="Normal">uint8_t</span>&amp; data<span class="Delimiter">(</span><span class="Normal">uint32_t</span> a<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L109" class="LineNr">109 </span> assert<span class="Delimiter">(</span><a href='010---vm.cc.html#L102'>match</a><span class="Delimiter">(</span>a<span class="Delimiter">));</span>
<span id="L109" class="LineNr">109 </span> assert<span class="Delimiter">(</span><a href='010vm.cc.html#L102'>match</a><span class="Delimiter">(</span>a<span class="Delimiter">));</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">uint32_t</span> result_index = a-start<span class="Delimiter">;</span>
<span id="L111" class="LineNr">111 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt;= result_index+<span class="Comment">/*</span><span class="Comment">largest <a href='011run.cc.html#L127'>word</a> size that can be accessed in one instruction</span><span class="Comment">*/</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">int</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> &lt;= result_index+<span class="Comment">/*</span><span class="Comment">largest <a href='011run.cc.html#L127'>word</a> size that can be accessed in one instruction</span><span class="Comment">*/</span><span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">int</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L112" class="LineNr">112 </span> <span class="Normal">const</span> <span class="Normal">int</span> align = <span class="Constant">0x1000</span><span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <span class="Normal">uint32_t</span> result_size = result_index + <span class="Constant">1</span><span class="Delimiter">;</span> <span class="Comment">// size needed for result_index to be valid</span>
<span id="L114" class="LineNr">114 </span> <span class="Normal">uint32_t</span> new_size = <a href='010---vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span>result_size<span class="Delimiter">,</span> align<span class="Delimiter">);</span>
<span id="L114" class="LineNr">114 </span> <span class="Normal">uint32_t</span> new_size = <a href='010vm.cc.html#L90'>align_upwards</a><span class="Delimiter">(</span>result_size<span class="Delimiter">,</span> align<span class="Delimiter">);</span>
<span id="L115" class="LineNr">115 </span> <span class="Comment">// grow at least 2x to maintain some amortized complexity guarantees</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_size &lt; <a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> * <span class="Constant">2</span><span class="Delimiter">)</span>
<span id="L117" class="LineNr">117 </span> new_size = <a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> * <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_size &lt; <a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> * <span class="Constant">2</span><span class="Delimiter">)</span>
<span id="L117" class="LineNr">117 </span> new_size = <a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>size<span class="Delimiter">()</span> * <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span> <span class="Comment">// never grow past the stated limit</span>
<span id="L119" class="LineNr">119 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_size &gt; end-start<span class="Delimiter">)</span>
<span id="L120" class="LineNr">120 </span> new_size = end-start<span class="Delimiter">;</span>
<span id="L121" class="LineNr">121 </span> <a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>resize<span class="Delimiter">(</span>new_size<span class="Delimiter">);</span>
<span id="L121" class="LineNr">121 </span> <a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>resize<span class="Delimiter">(</span>new_size<span class="Delimiter">);</span>
<span id="L122" class="LineNr">122 </span> <span class="Delimiter">}</span>
<span id="L123" class="LineNr">123 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>result_index<span class="Delimiter">);</span>
<span id="L123" class="LineNr">123 </span> <span class="Identifier">return</span> <a href='010vm.cc.html#L99'>_data</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>result_index<span class="Delimiter">);</span>
<span id="L124" class="LineNr">124 </span> <span class="Delimiter">}</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">void</span> <a href='010---vm.cc.html#L125'>grow_until</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> new_end_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">void</span> <a href='010vm.cc.html#L125'>grow_until</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> new_end_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L126" class="LineNr">126 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_end_address &lt; end<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L127" class="LineNr">127 </span> <span class="Comment">// Ugly: vma knows about the global Memory list of vmas</span>
<span id="L128" class="LineNr">128 </span> <span class="Normal">void</span> <a href='010---vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> start<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> end<span class="Delimiter">);</span>
<span id="L129" class="LineNr">129 </span> <a href='010---vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span>start<span class="Delimiter">,</span> new_end_address<span class="Delimiter">);</span>
<span id="L128" class="LineNr">128 </span> <span class="Normal">void</span> <a href='010vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> start<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> end<span class="Delimiter">);</span>
<span id="L129" class="LineNr">129 </span> <a href='010vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span>start<span class="Delimiter">,</span> new_end_address<span class="Delimiter">);</span>
<span id="L130" class="LineNr">130 </span> end = new_end_address<span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span> <span class="Delimiter">}</span>
<span id="L132" class="LineNr">132 </span> <span class="Comment">// End vma Methods</span>
<span id="L133" class="LineNr">133 </span><span class="Delimiter">};</span>
<span id="L134" class="LineNr">134 </span><span class="Delimiter">:(code)</span>
<span id="L135" class="LineNr">135 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> start<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> end<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L135" class="LineNr">135 </span><span class="Normal">void</span> <a href='010vm.cc.html#L135'>sanity_check</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> start<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> end<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L136" class="LineNr">136 </span> <span class="Normal">bool</span> dup_found = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">const</span> vma&amp; curr = <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">const</span> vma&amp; curr = <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>start == start<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L140" class="LineNr">140 </span> assert<span class="Delimiter">(</span>!dup_found<span class="Delimiter">);</span>
<span id="L141" class="LineNr">141 </span> dup_found = <span class="Constant">true</span><span class="Delimiter">;</span>
@ -212,106 +212,106 @@ if ('onhashchange' in window) {
<span id="L151" class="LineNr">151 </span>
<span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L153" class="LineNr">153 </span><span class="Comment">// RAM is made of VMAs.</span>
<span id="L154" class="LineNr">154 </span>vector&lt;vma&gt; <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">;</span>
<span id="L154" class="LineNr">154 </span>vector&lt;vma&gt; <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">;</span>
<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(code)</span>
<span id="L156" class="LineNr">156 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L157" class="LineNr">157 </span><span class="Normal">uint32_t</span> <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Comment">// when the program executes past this address in tests we'll stop the test</span>
<span id="L157" class="LineNr">157 </span><span class="Normal">uint32_t</span> <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Comment">// when the program executes past this address in tests we'll stop the test</span>
<span id="L158" class="LineNr">158 </span><span class="Comment">// The stack grows downward. Can't increase its size for now.</span>
<span id="L159" class="LineNr">159 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L160" class="LineNr">160 </span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span><span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L160" class="LineNr">160 </span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
<span id="L161" class="LineNr">161 </span><span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L162" class="LineNr">162 </span><span class="Delimiter">:(code)</span>
<span id="L163" class="LineNr">163 </span><span class="Comment">// These helpers depend on Mem being laid out contiguously (so you can't use a</span>
<span id="L164" class="LineNr">164 </span><span class="Comment">// map, etc.) and on the host also being little-endian.</span>
<span id="L165" class="LineNr">165 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">uint8_t</span>* handle = <a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L165" class="LineNr">165 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">uint8_t</span>* handle = <a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L167" class="LineNr">167 </span> <span class="Identifier">return</span> handle ? *handle : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
<span id="L169" class="LineNr">169 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span> <a href='010---vm.cc.html#L169'>read_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L170" class="LineNr">170 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int8_t</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L169" class="LineNr">169 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span> <a href='010vm.cc.html#L169'>read_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L170" class="LineNr">170 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int8_t</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L171" class="LineNr">171 </span><span class="Delimiter">}</span>
<span id="L172" class="LineNr">172 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L172" class="LineNr">172 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <span class="Normal">uint32_t</span>* handle = <a href='010vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span> <span class="Comment">// error messages get printed here</span>
<span id="L174" class="LineNr">174 </span> <span class="Identifier">return</span> handle ? *handle : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span><span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span> <a href='010---vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L177" class="LineNr">177 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int32_t</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L176" class="LineNr">176 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span> <a href='010vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L177" class="LineNr">177 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int32_t</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L178" class="LineNr">178 </span><span class="Delimiter">}</span>
<span id="L179" class="LineNr">179 </span>
<span id="L180" class="LineNr">180 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span>* <a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span>* <a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <span class="Normal">uint8_t</span>* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L102'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010vm.cc.html#L102'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L184" class="LineNr">184 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L185" class="LineNr">185 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L186" class="LineNr">186 </span> result = &amp;<span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L186" class="LineNr">186 </span> result = &amp;<span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span> <span class="Delimiter">}</span>
<span id="L188" class="LineNr">188 </span> <span class="Delimiter">}</span>
<span id="L189" class="LineNr">189 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L190" class="LineNr">190 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L448'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Special"><a href='003trace.cc.html#L448'>Trace_file</a></span><span class="Delimiter">.</span><a href='011run.cc.html#L198'>flush</a><span class="Delimiter">();</span>
<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L192" class="LineNr">192 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span>
<span id="L194" class="LineNr">194 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L195" class="LineNr">195 </span><span class="Delimiter">}</span>
<span id="L196" class="LineNr">196 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span>* <a href='010---vm.cc.html#L196'>mem_addr_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L197" class="LineNr">197 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int8_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L196" class="LineNr">196 </span><span class="Normal">inline</span> <span class="Normal">int8_t</span>* <a href='010vm.cc.html#L196'>mem_addr_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L197" class="LineNr">197 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int8_t</span>*&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span>
<span id="L199" class="LineNr">199 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span>* <a href='010---vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span>* <a href='010vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L200" class="LineNr">200 </span> <span class="Normal">uint32_t</span>* result = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L201" class="LineNr">201 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L202" class="LineNr">202 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L105'>match32</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L201" class="LineNr">201 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L202" class="LineNr">202 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010vm.cc.html#L105'>match32</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L203" class="LineNr">203 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L204" class="LineNr">204 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L205" class="LineNr">205 </span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint32_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L204" class="LineNr">204 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L205" class="LineNr">205 </span> result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint32_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L206" class="LineNr">206 </span> <span class="Delimiter">}</span>
<span id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span>
<span id="L208" class="LineNr">208 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L209" class="LineNr">209 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L448'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Special"><a href='003trace.cc.html#L448'>Trace_file</a></span><span class="Delimiter">.</span><a href='011run.cc.html#L198'>flush</a><span class="Delimiter">();</span>
<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Tried to access uninitialized memory at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L211" class="LineNr">211 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;The entire 4-byte <a href='011run.cc.html#L127'>word</a> should be initialized and lie in a single segment.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L212" class="LineNr">212 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span>
<span id="L214" class="LineNr">214 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L215" class="LineNr">215 </span><span class="Delimiter">}</span>
<span id="L216" class="LineNr">216 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span>* <a href='010---vm.cc.html#L216'>mem_addr_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L217" class="LineNr">217 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int32_t</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L216" class="LineNr">216 </span><span class="Normal">inline</span> <span class="Normal">int32_t</span>* <a href='010vm.cc.html#L216'>mem_addr_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L217" class="LineNr">217 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">int32_t</span>*&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L218" class="LineNr">218 </span><span class="Delimiter">}</span>
<span id="L219" class="LineNr">219 </span><span class="Comment">// helper for some syscalls. But read-only.</span>
<span id="L220" class="LineNr">220 </span><span class="Normal">inline</span> <span class="Normal">const</span> <span class="Normal">char</span>* <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L221" class="LineNr">221 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L220" class="LineNr">220 </span><span class="Normal">inline</span> <span class="Normal">const</span> <span class="Normal">char</span>* <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L221" class="LineNr">221 </span> <span class="Identifier">return</span> <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">const</span> <span class="Normal">char</span>*&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">));</span>
<span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span>
<span id="L223" class="LineNr">223 </span><span class="Normal">inline</span> string <a href='010---vm.cc.html#L223'>mem_addr_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L223" class="LineNr">223 </span><span class="Normal">inline</span> string <a href='010vm.cc.html#L223'>mem_addr_string</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> size<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L224" class="LineNr">224 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L225" class="LineNr">225 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L226" class="LineNr">226 </span> out &lt;&lt; <a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr+i<span class="Delimiter">);</span>
<span id="L226" class="LineNr">226 </span> out &lt;&lt; <a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr+i<span class="Delimiter">);</span>
<span id="L227" class="LineNr">227 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L228" class="LineNr">228 </span><span class="Delimiter">}</span>
<span id="L229" class="LineNr">229 </span>
<span id="L230" class="LineNr">230 </span>
<span id="L231" class="LineNr">231 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L232" class="LineNr">232 </span> <span class="Normal">uint8_t</span>* handle = <a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L231" class="LineNr">231 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L232" class="LineNr">232 </span> <span class="Normal">uint8_t</span>* handle = <a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L233" class="LineNr">233 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L234" class="LineNr">234 </span><span class="Delimiter">}</span>
<span id="L235" class="LineNr">235 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L235'>write_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <span class="Normal">int8_t</span>* handle = <a href='010---vm.cc.html#L196'>mem_addr_i8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L235" class="LineNr">235 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010vm.cc.html#L235'>write_mem_i8</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <span class="Normal">int8_t</span>* handle = <a href='010vm.cc.html#L196'>mem_addr_i8</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L237" class="LineNr">237 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span><span class="Delimiter">}</span>
<span id="L239" class="LineNr">239 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L240" class="LineNr">240 </span> <span class="Normal">uint32_t</span>* handle = <a href='010---vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L239" class="LineNr">239 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L240" class="LineNr">240 </span> <span class="Normal">uint32_t</span>* handle = <a href='010vm.cc.html#L199'>mem_addr_u32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L241" class="LineNr">241 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L242" class="LineNr">242 </span><span class="Delimiter">}</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010---vm.cc.html#L243'>write_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> <span class="Normal">int32_t</span>* handle = <a href='010---vm.cc.html#L216'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">inline</span> <span class="Normal">void</span> <a href='010vm.cc.html#L243'>write_mem_i32</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">,</span> <span class="Normal">int32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> <span class="Normal">int32_t</span>* handle = <a href='010vm.cc.html#L216'>mem_addr_i32</a><span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L245" class="LineNr">245 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>handle != <span class="Constant">NULL</span><span class="Delimiter">)</span> *handle = val<span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span><span class="Delimiter">}</span>
<span id="L247" class="LineNr">247 </span>
<span id="L248" class="LineNr">248 </span><span class="Normal">inline</span> <span class="Normal">bool</span> <a href='010---vm.cc.html#L248'>already_allocated</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L248" class="LineNr">248 </span><span class="Normal">inline</span> <span class="Normal">bool</span> <a href='010vm.cc.html#L248'>already_allocated</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L249" class="LineNr">249 </span> <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L251" class="LineNr">251 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010---vm.cc.html#L102'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L251" class="LineNr">251 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='010vm.cc.html#L102'>match</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L252" class="LineNr">252 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span>
<span id="L253" class="LineNr">253 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L253" class="LineNr">253 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; is in two segments\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L254" class="LineNr">254 </span> result = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L255" class="LineNr">255 </span> <span class="Delimiter">}</span>
<span id="L256" class="LineNr">256 </span> <span class="Delimiter">}</span>
@ -322,106 +322,106 @@ if ('onhashchange' in window) {
<span id="L261" class="LineNr">261 </span>
<span id="L262" class="LineNr">262 </span><span class="Delimiter">:(code)</span>
<span id="L263" class="LineNr">263 </span><span class="Comment">// skeleton of how x86 instructions are decoded</span>
<span id="L264" class="LineNr">264 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L264" class="LineNr">264 </span><span class="Normal">void</span> <a href='010vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L265" class="LineNr">265 </span> <span class="Normal">uint8_t</span> op=<span class="Constant">0</span><span class="Delimiter">,</span> op2=<span class="Constant">0</span><span class="Delimiter">,</span> op3=<span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L266" class="LineNr">266 </span> <span class="Comment">// Run One Instruction</span>
<span id="L267" class="LineNr">267 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='003trace.cc.html#L448'>Trace_file</a></span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L268" class="LineNr">268 </span> <a href='010---vm.cc.html#L329'>dump_registers</a><span class="Delimiter">();</span>
<span id="L268" class="LineNr">268 </span> <a href='010vm.cc.html#L329'>dump_registers</a><span class="Delimiter">();</span>
<span id="L269" class="LineNr">269 </span> <span class="Comment">// End Dump Info for Instruction</span>
<span id="L270" class="LineNr">270 </span> <span class="Delimiter">}</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">uint32_t</span> inst_start_address = <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> op = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L273" class="LineNr">273 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; inst_start_address &lt;&lt; <span class="Constant">&quot; opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">uint32_t</span> inst_start_address = <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> op = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L273" class="LineNr">273 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; inst_start_address &lt;&lt; <span class="Constant">&quot; opcode: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L275" class="LineNr">275 </span> <span class="Normal">case</span> <span class="Constant">0xf4</span>: <span class="Comment">// hlt</span>
<span id="L276" class="LineNr">276 </span> <a href='010---vm.cc.html#L26'>EIP</a> = <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">;</span>
<span id="L276" class="LineNr">276 </span> <a href='010vm.cc.html#L26'>EIP</a> = <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">;</span>
<span id="L277" class="LineNr">277 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L278" class="LineNr">278 </span> <span class="Comment">// End Single-Byte Opcodes</span>
<span id="L279" class="LineNr">279 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L280" class="LineNr">280 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L280" class="LineNr">280 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L281" class="LineNr">281 </span> <span class="Comment">// End Two-Byte Opcodes Starting With 0f</span>
<span id="L282" class="LineNr">282 </span> <span class="Normal">default</span>:
<span id="L283" class="LineNr">283 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L283" class="LineNr">283 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after 0f: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L284" class="LineNr">284 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span>
<span id="L286" class="LineNr">286 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L287" class="LineNr">287 </span> <span class="Normal">case</span> <span class="Constant">0xf2</span>:
<span id="L288" class="LineNr">288 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L288" class="LineNr">288 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L289" class="LineNr">289 </span> <span class="Comment">// End Two-Byte Opcodes Starting With f2</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L291" class="LineNr">291 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L292" class="LineNr">292 </span> <span class="Comment">// End Three-Byte Opcodes Starting With f2 0f</span>
<span id="L293" class="LineNr">293 </span> <span class="Normal">default</span>:
<span id="L294" class="LineNr">294 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f2 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L294" class="LineNr">294 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f2 0f: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L296" class="LineNr">296 </span> <span class="Delimiter">}</span>
<span id="L297" class="LineNr">297 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">default</span>:
<span id="L299" class="LineNr">299 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f2: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L299" class="LineNr">299 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f2: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span> <span class="Normal">case</span> <span class="Constant">0xf3</span>:
<span id="L304" class="LineNr">304 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L304" class="LineNr">304 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op2 = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L305" class="LineNr">305 </span> <span class="Comment">// End Two-Byte Opcodes Starting With f3</span>
<span id="L306" class="LineNr">306 </span> <span class="Normal">case</span> <span class="Constant">0x0f</span>:
<span id="L307" class="LineNr">307 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <span class="Normal">switch</span><span class="Delimiter">(</span>op3 = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L308" class="LineNr">308 </span> <span class="Comment">// End Three-Byte Opcodes Starting With f3 0f</span>
<span id="L309" class="LineNr">309 </span> <span class="Normal">default</span>:
<span id="L310" class="LineNr">310 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f3 0f: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L310" class="LineNr">310 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized third opcode after f3 0f: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op3<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L311" class="LineNr">311 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L312" class="LineNr">312 </span> <span class="Delimiter">}</span>
<span id="L313" class="LineNr">313 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L314" class="LineNr">314 </span> <span class="Normal">default</span>:
<span id="L315" class="LineNr">315 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f3: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L315" class="LineNr">315 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized second opcode after f3: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op2<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L316" class="LineNr">316 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L317" class="LineNr">317 </span> <span class="Delimiter">}</span>
<span id="L318" class="LineNr">318 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L319" class="LineNr">319 </span> <span class="Normal">default</span>:
<span id="L320" class="LineNr">320 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized opcode: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L320" class="LineNr">320 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized opcode: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L321" class="LineNr">321 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L322" class="LineNr">322 </span> <span class="Delimiter">}</span>
<span id="L323" class="LineNr">323 </span><span class="Delimiter">}</span>
<span id="L324" class="LineNr">324 </span>
<span id="L325" class="LineNr">325 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L326" class="LineNr">326 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>EIP++<span class="Delimiter">);</span>
<span id="L325" class="LineNr">325 </span><span class="Normal">inline</span> <span class="Normal">uint8_t</span> <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L326" class="LineNr">326 </span> <span class="Identifier">return</span> <a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>EIP++<span class="Delimiter">);</span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">}</span>
<span id="L328" class="LineNr">328 </span>
<span id="L329" class="LineNr">329 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L329'>dump_registers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L329" class="LineNr">329 </span><span class="Normal">void</span> <a href='010vm.cc.html#L329'>dump_registers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L330" class="LineNr">330 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L331" class="LineNr">331 </span> out &lt;&lt; <span class="Constant">&quot;regs: &quot;</span><span class="Delimiter">;</span>
<span id="L332" class="LineNr">332 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='010---vm.cc.html#L18'>NUM_INT_REGISTERS</a><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L332" class="LineNr">332 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='010vm.cc.html#L18'>NUM_INT_REGISTERS</a><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt; <span class="Constant">0</span><span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">&quot; &quot;</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> out &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; std::hex &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">8</span><span class="Delimiter">)</span> &lt;&lt; std::setfill<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[i]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> out &lt;&lt; i &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; std::hex &lt;&lt; std::setw<span class="Delimiter">(</span><span class="Constant">8</span><span class="Delimiter">)</span> &lt;&lt; std::setfill<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[i]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <span class="Delimiter">}</span>
<span id="L336" class="LineNr">336 </span> out &lt;&lt; <span class="Constant">&quot; -- SF: &quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L80'>ZF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L80'>ZF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L81'>CF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L81'>CF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010---vm.cc.html#L82'>OF</a>: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> out &lt;&lt; <span class="Constant">&quot; -- SF: &quot;</span> &lt;&lt; SF &lt;&lt; <span class="Constant">&quot;; <a href='010vm.cc.html#L80'>ZF</a>: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L80'>ZF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010vm.cc.html#L81'>CF</a>: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L81'>CF</a> &lt;&lt; <span class="Constant">&quot;; <a href='010vm.cc.html#L82'>OF</a>: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">;</span>
<span id="L337" class="LineNr">337 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L338" class="LineNr">338 </span><span class="Delimiter">}</span>
<span id="L339" class="LineNr">339 </span>
<span id="L340" class="LineNr">340 </span><span class="Comment">//: start tracking supported opcodes</span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L342" class="LineNr">342 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">;</span>
<span id="L343" class="LineNr">343 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">;</span>
<span id="L344" class="LineNr">344 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">;</span>
<span id="L345" class="LineNr">345 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010---vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">;</span>
<span id="L342" class="LineNr">342 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">;</span>
<span id="L343" class="LineNr">343 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">;</span>
<span id="L344" class="LineNr">344 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">;</span>
<span id="L345" class="LineNr">345 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> string&gt; <span class="Special"><a href='010vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">;</span>
<span id="L346" class="LineNr">346 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L347" class="LineNr">347 </span><a href='010---vm.cc.html#L349'>init_op_names</a><span class="Delimiter">();</span>
<span id="L347" class="LineNr">347 </span><a href='010vm.cc.html#L349'>init_op_names</a><span class="Delimiter">();</span>
<span id="L348" class="LineNr">348 </span><span class="Delimiter">:(code)</span>
<span id="L349" class="LineNr">349 </span><span class="Normal">void</span> <a href='010---vm.cc.html#L349'>init_op_names</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L350" class="LineNr">350 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f4&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;halt (hlt)&quot;</span><span class="Delimiter">);</span>
<span id="L349" class="LineNr">349 </span><span class="Normal">void</span> <a href='010vm.cc.html#L349'>init_op_names</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L350" class="LineNr">350 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;f4&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;halt (hlt)&quot;</span><span class="Delimiter">);</span>
<span id="L351" class="LineNr">351 </span> <span class="Comment">// End Initialize Op Names</span>
<span id="L352" class="LineNr">352 </span><span class="Delimiter">}</span>
<span id="L353" class="LineNr">353 </span>
<span id="L354" class="LineNr">354 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Special-cases(key)&quot;)</span>
<span id="L355" class="LineNr">355 </span><span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">&quot;opcodes&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L356" class="LineNr">356 </span> cerr &lt;&lt; <span class="Constant">&quot;Opcodes currently supported by SubX:\n&quot;</span><span class="Delimiter">;</span>
<span id="L357" class="LineNr">357 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L357" class="LineNr">357 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L358" class="LineNr">358 </span> cerr &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L359" class="LineNr">359 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L359" class="LineNr">359 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L360" class="LineNr">360 </span> cerr &lt;&lt; <span class="Constant">&quot; 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L361" class="LineNr">361 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L361" class="LineNr">361 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010vm.cc.html#L344'>Name_f3</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L362" class="LineNr">362 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L363" class="LineNr">363 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010---vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010---vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L363" class="LineNr">363 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> string&gt;::iterator p = <span class="Special"><a href='010vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='010vm.cc.html#L345'>Name_f3_0f</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L364" class="LineNr">364 </span> cerr &lt;&lt; <span class="Constant">&quot; f3 0f &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L365" class="LineNr">365 </span> cerr &lt;&lt; <span class="Constant">&quot;Run `bootstrap help instructions` for details on <a href='011run.cc.html#L122'>words</a> like 'r32' and 'disp8'.\n&quot;</span>
<span id="L366" class="LineNr">366 </span> <span class="Constant">&quot;For complete details on these instructions, consult the IA-32 manual (volume 2).\n&quot;</span>
@ -445,10 +445,10 @@ if ('onhashchange' in window) {
<span id="L384" class="LineNr">384 </span><span class="Comment">//: than its 'main' depth. So 'call' instruction details will be at the same</span>
<span id="L385" class="LineNr">385 </span><span class="Comment">//: depth as the instructions of the function it calls.</span>
<span id="L386" class="LineNr">386 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L387" class="LineNr">387 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> <span class="Special"><a href='010---vm.cc.html#L387'>Initial_callstack_depth</a></span> = <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L388" class="LineNr">388 </span><span class="Normal">int</span> <span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L387'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span><span class="Normal">extern</span> <span class="Normal">const</span> <span class="Normal">int</span> <span class="Special"><a href='010vm.cc.html#L387'>Initial_callstack_depth</a></span> = <span class="Constant">2</span><span class="Delimiter">;</span>
<span id="L388" class="LineNr">388 </span><span class="Normal">int</span> <span class="Special">Callstack_depth</span> = <span class="Special"><a href='010vm.cc.html#L387'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L390" class="LineNr">390 </span><span class="Special">Callstack_depth</span> = <span class="Special"><a href='010---vm.cc.html#L387'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L390" class="LineNr">390 </span><span class="Special">Callstack_depth</span> = <span class="Special"><a href='010vm.cc.html#L387'>Initial_callstack_depth</a></span><span class="Delimiter">;</span>
<span id="L391" class="LineNr">391 </span>
<span id="L392" class="LineNr">392 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
<span id="L393" class="LineNr">393 </span><span class="PreProc">#include </span><span class="Constant">&lt;iomanip&gt;</span>

View File

@ -151,11 +151,11 @@ if ('onhashchange' in window) {
<span id="L91" class="LineNr"> 91 </span> <span class="Comment">// convenience to keep tests concise: 'Entry' label need not be provided</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Comment">// not allowed in real programs</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L105'>entry</a><span class="Delimiter">)</span>
<span id="L94" class="LineNr"> 94 </span> <a href='010---vm.cc.html#L26'>EIP</a> = p<span class="Delimiter">.</span><a href='011run.cc.html#L105'>entry</a><span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span> <a href='010vm.cc.html#L26'>EIP</a> = p<span class="Delimiter">.</span><a href='011run.cc.html#L105'>entry</a><span class="Delimiter">;</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Normal">else</span>
<span id="L96" class="LineNr"> 96 </span> <a href='010---vm.cc.html#L26'>EIP</a> = find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)-&gt;</span>start<span class="Delimiter">;</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a> &lt; <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">)</span>
<span id="L98" class="LineNr"> 98 </span> <a href='010---vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L96" class="LineNr"> 96 </span> <a href='010vm.cc.html#L26'>EIP</a> = find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)-&gt;</span>start<span class="Delimiter">;</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a> &lt; <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">)</span>
<span id="L98" class="LineNr"> 98 </span> <a href='010vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
<span id="L100" class="LineNr">100 </span>
<span id="L101" class="LineNr">101 </span><span class="SalientComment">//:: core data structures</span>
@ -228,7 +228,7 @@ if ('onhashchange' in window) {
<span id="L168" class="LineNr">168 </span> curr_segment<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L111'>name</a> = segment_name<span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span> curr_segment<span class="Delimiter">-&gt;</span>start = seg_start<span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;starts at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; curr_segment<span class="Delimiter">-&gt;</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L171" class="LineNr">171 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;starts at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; curr_segment<span class="Delimiter">-&gt;</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L172" class="LineNr">172 </span> <span class="Delimiter">}</span>
<span id="L173" class="LineNr">173 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// skip rest of line</span>
<span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span>
@ -316,8 +316,8 @@ if ('onhashchange' in window) {
<span id="L256" class="LineNr">256 </span> <span class="Normal">const</span> segment&amp; seg = p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L257" class="LineNr">257 </span> <span class="Normal">uint32_t</span> addr = seg<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!already_allocated<span class="Delimiter">(</span>addr<span class="Delimiter">))</span>
<span id="L259" class="LineNr">259 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>seg<span class="Delimiter">.</span>start<span class="Delimiter">));</span>
<span id="L260" class="LineNr">260 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;loading segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; from &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L259" class="LineNr">259 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>seg<span class="Delimiter">.</span>start<span class="Delimiter">));</span>
<span id="L260" class="LineNr">260 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;loading segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; from &quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L261" class="LineNr">261 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L262" class="LineNr">262 </span> <span class="Normal">const</span> line&amp; l = seg<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L263" class="LineNr">263 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> k = <span class="Constant">0</span><span class="Delimiter">;</span> k &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++k<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -325,14 +325,14 @@ if ('onhashchange' in window) {
<span id="L265" class="LineNr">265 </span> <span class="Normal">uint8_t</span> val = <a href='011run.cc.html#L288'>hex_byte</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L267" class="LineNr">267 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>addr<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L268" class="LineNr">268 </span> <a href='010---vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L268" class="LineNr">268 </span> <a href='010vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L269" class="LineNr">269 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L270" class="LineNr">270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span><a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L271" class="LineNr">271 </span> ++addr<span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> <span class="Delimiter">}</span>
<span id="L273" class="LineNr">273 </span> <span class="Delimiter">}</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L111'>name</a> == <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L275" class="LineNr">275 </span> <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> = addr<span class="Delimiter">;</span>
<span id="L275" class="LineNr">275 </span> <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> = addr<span class="Delimiter">;</span>
<span id="L276" class="LineNr">276 </span> <span class="Delimiter">}</span>
<span id="L277" class="LineNr">277 </span> <span class="Delimiter">}</span>
<span id="L278" class="LineNr">278 </span><span class="Delimiter">}</span>
@ -465,15 +465,15 @@ if ('onhashchange' in window) {
<span id="L405" class="LineNr">405 </span><span class="SalientComment">//:: run</span>
<span id="L406" class="LineNr">406 </span>
<span id="L407" class="LineNr">407 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L408" class="LineNr">408 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010---vm.cc.html#L10'>EAX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L408" class="LineNr">408 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010vm.cc.html#L10'>EAX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L409" class="LineNr">409 </span>
<span id="L410" class="LineNr">410 </span><span class="Comment">//: our first opcode</span>
<span id="L411" class="LineNr">411 </span>
<span id="L412" class="LineNr">412 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L413" class="LineNr">413 </span><span class="Normal">case</span> <span class="Constant">0xb8</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm32 to EAX</span>
<span id="L414" class="LineNr">414 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> src = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L415" class="LineNr">415 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L416" class="LineNr">416 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = src<span class="Delimiter">;</span>
<span id="L415" class="LineNr">415 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L416" class="LineNr">416 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = src<span class="Delimiter">;</span>
<span id="L417" class="LineNr">417 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L418" class="LineNr">418 </span><span class="Delimiter">}</span>
<span id="L419" class="LineNr">419 </span>
@ -491,7 +491,7 @@ if ('onhashchange' in window) {
<span id="L431" class="LineNr">431 </span>
<span id="L432" class="LineNr">432 </span><span class="Comment">// read a 32-bit int in little-endian order from the instruction stream</span>
<span id="L433" class="LineNr">433 </span><span class="Normal">int32_t</span> <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L434" class="LineNr">434 </span> <span class="Normal">int32_t</span> result = <a href='010---vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L434" class="LineNr">434 </span> <span class="Normal">int32_t</span> result = <a href='010vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L435" class="LineNr">435 </span> EIP+=<span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L436" class="LineNr">436 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L437" class="LineNr">437 </span><span class="Delimiter">}</span>

View File

@ -75,9 +75,9 @@ if ('onhashchange' in window) {
<span id="L14" class="LineNr"> 14 </span> <a href='000organization.cc.html#L150'>reset</a><span class="Delimiter">();</span>
<span id="L15" class="LineNr"> 15 </span> cerr &lt;&lt; std::hex<span class="Delimiter">;</span>
<span id="L16" class="LineNr"> 16 </span> <a href='012elf.cc.html#L24'>load_elf</a><span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">,</span> argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a> &lt; <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">)</span> <span class="Comment">// weak final-gasp termination check</span>
<span id="L18" class="LineNr"> 18 </span> <a href='010---vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L19" class="LineNr"> 19 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;executed past end of the world: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a> &lt; <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span><span class="Delimiter">)</span> <span class="Comment">// weak final-gasp termination check</span>
<span id="L18" class="LineNr"> 18 </span> <a href='010vm.cc.html#L264'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L19" class="LineNr"> 19 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;executed past end of the world: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot; vs &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L20" class="LineNr"> 20 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">}</span>
<span id="L22" class="LineNr"> 22 </span>
@ -107,7 +107,7 @@ if ('onhashchange' in window) {
<span id="L46" class="LineNr"> 46 </span> <span class="Comment">// unused: remaining 10 bytes of e_ident</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Normal">uint32_t</span> e_machine_type = <a href='012elf.cc.html#L170'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">16</span>]<span class="Delimiter">);</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>e_machine_type != <span class="Constant">0x00030002</span><span class="Delimiter">)</span>
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;ELF type/machine 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; e_machine_type &lt;&lt; <span class="Constant">&quot; isn't i386 executable\n&quot;</span> &lt;&lt; die<span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Comment">// unused: e_version. We only support version 1, and later versions will be backwards compatible.</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Normal">uint32_t</span> e_entry = <a href='012elf.cc.html#L170'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">24</span>]<span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">uint32_t</span> e_phoff = <a href='012elf.cc.html#L170'>u32_in</a><span class="Delimiter">(</span>&amp;elf_contents[<span class="Constant">28</span>]<span class="Delimiter">);</span>
@ -128,41 +128,41 @@ if ('onhashchange' in window) {
<span id="L67" class="LineNr"> 67 </span>
<span id="L68" class="LineNr"> 68 </span> <span class="Comment">// initialize code and stack</span>
<span id="L69" class="LineNr"> 69 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L152'>STACK_SEGMENT</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L152'>STACK_SEGMENT</a><span class="Delimiter">));</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L152'>STACK_SEGMENT</a><span class="Delimiter">));</span>
<span id="L71" class="LineNr"> 71 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='012elf.cc.html#L153'>AFTER_STACK</a><span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Comment">// The stack grows downward.</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <a href='012elf.cc.html#L153'>AFTER_STACK</a><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBP]<span class="Delimiter">.</span>u = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L75" class="LineNr"> 75 </span> <a href='010---vm.cc.html#L26'>EIP</a> = e_entry<span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <a href='012elf.cc.html#L153'>AFTER_STACK</a><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBP]<span class="Delimiter">.</span>u = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L75" class="LineNr"> 75 </span> <a href='010vm.cc.html#L26'>EIP</a> = e_entry<span class="Delimiter">;</span>
<span id="L76" class="LineNr"> 76 </span>
<span id="L77" class="LineNr"> 77 </span> <span class="Comment">// initialize args on stack</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Comment">// no envp for now</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Comment">// we wastefully use a separate page of memory for argv</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L154'>ARGV_DATA_SEGMENT</a><span class="Delimiter">));</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><a href='012elf.cc.html#L154'>ARGV_DATA_SEGMENT</a><span class="Delimiter">));</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Normal">uint32_t</span> argv_data = <a href='012elf.cc.html#L154'>ARGV_DATA_SEGMENT</a><span class="Delimiter">;</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = argc-<span class="Constant">1</span><span class="Delimiter">;</span> i &gt;= <span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span> --i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">);</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt;= strlen<span class="Delimiter">(</span>argv[i]<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L85" class="LineNr"> 85 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>argv_data<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span> <span class="Comment">// don't bother comparing ARGV and STACK</span>
<span id="L86" class="LineNr"> 86 </span> <a href='010---vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L86" class="LineNr"> 86 </span> <a href='010vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>argv_data<span class="Delimiter">,</span> argv[i][j]<span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span> argv_data += <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">char</span><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span> assert<span class="Delimiter">(</span>argv_data &lt; <a href='012elf.cc.html#L154'>ARGV_DATA_SEGMENT</a> + <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span> assert<span class="Delimiter">(</span>argv_data &lt; <a href='012elf.cc.html#L154'>ARGV_DATA_SEGMENT</a> + <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Delimiter">}</span>
<span id="L91" class="LineNr"> 91 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span>argc-<span class="Comment">/*</span><span class="Comment">skip 'subx_bin' and 'run'</span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
<span id="L93" class="LineNr"> 93 </span>
<span id="L94" class="LineNr"> 94 </span><span class="Normal">void</span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u -= <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L152'>STACK_SEGMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u -= <span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt; <a href='012elf.cc.html#L152'>STACK_SEGMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L97" class="LineNr"> 97 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;The stack overflowed its segment. &quot;</span>
<span id="L98" class="LineNr"> 98 </span> &lt;&lt; <span class="Constant">&quot;Maybe SPACE_FOR_SEGMENT should be larger? &quot;</span>
<span id="L99" class="LineNr"> 99 </span> &lt;&lt; <span class="Constant">&quot;Or you need to carve out an exception for the stack segment &quot;</span>
<span id="L100" class="LineNr">100 </span> &lt;&lt; <span class="Constant">&quot;to be larger.\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L101" class="LineNr">101 </span> <span class="Delimiter">}</span>
<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010---vm.cc.html#L14'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L104" class="LineNr">104 </span> <a href='010---vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;decrementing <a href='010vm.cc.html#L14'>ESP</a> to 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;pushing value 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; val &lt;&lt; end<span class="Delimiter">();</span>
<span id="L104" class="LineNr">104 </span> <a href='010vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span>
<span id="L106" class="LineNr">106 </span>
<span id="L107" class="LineNr">107 </span><span class="Normal">void</span> <a href='012elf.cc.html#L107'>load_segment_from_program_header</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* elf_contents<span class="Delimiter">,</span> <span class="Normal">int</span> segment_index<span class="Delimiter">,</span> <span class="Normal">size_t</span> size<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> offset<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> e_ehsize<span class="Delimiter">,</span> set&lt;<span class="Normal">uint32_t</span>&gt;&amp; overlap<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -183,20 +183,20 @@ if ('onhashchange' in window) {
<span id="L122" class="LineNr">122 </span>
<span id="L123" class="LineNr">123 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset + p_filesz &gt; size<span class="Delimiter">)</span>
<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Invalid binary; segment at offset &quot;</span> &lt;&lt; offset &lt;&lt; <span class="Constant">&quot; is too large: wants to end at &quot;</span> &lt;&lt; p_offset+p_filesz &lt;&lt; <span class="Constant">&quot; but the file ends at &quot;</span> &lt;&lt; size &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_memsz &gt;= <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L125" class="LineNr">125 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_memsz &gt;= <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L126" class="LineNr">126 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Code segment too small for SubX; for now please manually increase SEGMENT_ALIGNMENT.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L127" class="LineNr">127 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L128" class="LineNr">128 </span> <span class="Delimiter">}</span>
<span id="L129" class="LineNr">129 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">90</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;blitting file offsets (&quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset+p_filesz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;) to addresses (&quot;</span> &lt;&lt; p_vaddr &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_vaddr+p_memsz<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">')'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L130" class="LineNr">130 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>size &gt; p_memsz<span class="Delimiter">)</span> size = p_memsz<span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>p_vaddr<span class="Delimiter">));</span>
<span id="L131" class="LineNr">131 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>p_vaddr<span class="Delimiter">));</span>
<span id="L132" class="LineNr">132 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p_filesz<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L133" class="LineNr">133 </span> assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L134" class="LineNr">134 </span> <a href='010---vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L134" class="LineNr">134 </span> <a href='010vm.cc.html#L231'>write_mem_u8</a><span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">,</span> elf_contents[p_offset+i]<span class="Delimiter">);</span>
<span id="L135" class="LineNr">135 </span> overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>p_vaddr+i<span class="Delimiter">);</span>
<span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span>
<span id="L137" class="LineNr">137 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>segment_index == <span class="Constant">0</span> &amp;&amp; <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> &lt; p_vaddr+p_memsz<span class="Delimiter">)</span>
<span id="L138" class="LineNr">138 </span> <span class="Special"><a href='010---vm.cc.html#L157'>End_of_program</a></span> = p_vaddr+p_memsz<span class="Delimiter">;</span>
<span id="L137" class="LineNr">137 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>segment_index == <span class="Constant">0</span> &amp;&amp; <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> &lt; p_vaddr+p_memsz<span class="Delimiter">)</span>
<span id="L138" class="LineNr">138 </span> <span class="Special"><a href='010vm.cc.html#L157'>End_of_program</a></span> = p_vaddr+p_memsz<span class="Delimiter">;</span>
<span id="L139" class="LineNr">139 </span><span class="Delimiter">}</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
@ -221,11 +221,11 @@ if ('onhashchange' in window) {
<span id="L160" class="LineNr">160 </span><span class="Normal">void</span> <a href='012elf.cc.html#L160'>dump_stack</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L161" class="LineNr">161 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;stack:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = AFTER_STACK-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">40</span><span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L167" class="LineNr">167 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = AFTER_STACK-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &lt;=== ESP&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">uint32_t</span> a = <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">4</span><span class="Delimiter">;</span> a &gt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u-<span class="Constant">40</span><span class="Delimiter">;</span> a -= <span class="Constant">4</span><span class="Delimiter">)</span>
<span id="L167" class="LineNr">167 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; a &lt;&lt; <span class="Constant">&quot; =&gt; 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span>
<span id="L169" class="LineNr">169 </span>
<span id="L170" class="LineNr">170 </span><span class="Normal">inline</span> <span class="Normal">uint32_t</span> <a href='012elf.cc.html#L170'>u32_in</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span>* p<span class="Delimiter">)</span> <span class="Delimiter">{</span>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -60,8 +60,8 @@ if ('onhashchange' in window) {
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(code)</span>
<span id="L4" class="LineNr"> 4 </span><span class="Normal">void</span> <a href='016index_addressing.cc.html#L4'>test_add_r32_to_mem_at_r32_with_sib</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L5" class="LineNr"> 5 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span>
<span id="L6" class="LineNr"> 6 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L5" class="LineNr"> 5 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span>
<span id="L6" class="LineNr"> 6 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L7" class="LineNr"> 7 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L9" class="LineNr"> 9 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -72,8 +72,8 @@ if ('onhashchange' in window) {
<span id="L14" class="LineNr"> 14 </span> <span class="Constant">&quot;01 00 00 00\n&quot;</span> <span class="Comment">// 0x00000001</span>
<span id="L15" class="LineNr"> 15 </span> <span class="Delimiter">);</span>
<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Constant">&quot;run: add <a href='010---vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L18" class="LineNr"> 18 </span> <span class="Constant">&quot;run: effective address is initially 0x00002000 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Constant">&quot;run: add <a href='010vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L18" class="LineNr"> 18 </span> <span class="Constant">&quot;run: effective address is initially 0x00002000 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L19" class="LineNr"> 19 </span> <span class="Constant">&quot;run: effective address is 0x00002000\n&quot;</span>
<span id="L20" class="LineNr"> 20 </span> <span class="Constant">&quot;run: storing 0x00000011\n&quot;</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Delimiter">);</span>
@ -85,36 +85,36 @@ if ('onhashchange' in window) {
<span id="L27" class="LineNr"> 27 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(code)</span>
<span id="L29" class="LineNr"> 29 </span><span class="Normal">uint32_t</span> <a href='016index_addressing.cc.html#L29'>effective_address_from_sib</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> mod<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> sib = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> sib = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> base = sib&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Normal">uint32_t</span> addr = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base != <a href='010---vm.cc.html#L15'>EBP</a> || mod != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span> addr = <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[base]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>base<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base != <a href='010vm.cc.html#L15'>EBP</a> || mod != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span> addr = <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[base]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (&quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>base<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span> <span class="Comment">// base == EBP &amp;&amp; mod == 0</span>
<span id="L39" class="LineNr"> 39 </span> addr = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span> <span class="Comment">// ignore base</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (<a href='040---tests.cc.html#L82'>disp32</a>)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is initially 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (<a href='040tests.cc.html#L82'>disp32</a>)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Delimiter">}</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> index = <span class="Delimiter">(</span>sib&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index == <a href='010---vm.cc.html#L14'>ESP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index == <a href='010vm.cc.html#L14'>ESP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Comment">// ignore index and scale</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> scale = <span class="Delimiter">(</span><span class="Constant">1</span> &lt;&lt; <span class="Delimiter">(</span>sib&gt;&gt;<span class="Constant">6</span><span class="Delimiter">));</span>
<span id="L49" class="LineNr"> 49 </span> addr += <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[index]<span class="Delimiter">.</span>i*scale<span class="Delimiter">;</span> <span class="Comment">// treat index register as signed. Maybe base as well? But we'll always ensure it's non-negative.</span>
<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (after adding &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>index<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;*&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>scale<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L49" class="LineNr"> 49 </span> addr += <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[index]<span class="Delimiter">.</span>i*scale<span class="Delimiter">;</span> <span class="Comment">// treat index register as signed. Maybe base as well? But we'll always ensure it's non-negative.</span>
<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;effective address is 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; (after adding &quot;</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>index<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;*&quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>scale<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;)&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Delimiter">}</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Identifier">return</span> addr<span class="Delimiter">;</span>
<span id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span>
<span id="L54" class="LineNr"> 54 </span>
<span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(code)</span>
<span id="L56" class="LineNr"> 56 </span><span class="Normal">void</span> <a href='016index_addressing.cc.html#L56'>test_add_r32_to_mem_at_base_r32_index_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ffe</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x2</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ffe</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x2</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L60" class="LineNr"> 60 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -125,8 +125,8 @@ if ('onhashchange' in window) {
<span id="L67" class="LineNr"> 67 </span> <span class="Constant">&quot;01 00 00 00\n&quot;</span> <span class="Comment">// 0x00000001</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Delimiter">);</span>
<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;run: add <a href='010---vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ffe (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;run: add <a href='010vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ffe (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (after adding ECX*1)\n&quot;</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Constant">&quot;run: storing 0x00000011\n&quot;</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">);</span>
@ -134,7 +134,7 @@ if ('onhashchange' in window) {
<span id="L76" class="LineNr"> 76 </span>
<span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(code)</span>
<span id="L78" class="LineNr"> 78 </span><span class="Normal">void</span> <a href='016index_addressing.cc.html#L78'>test_add_r32_to_mem_at_displacement_using_sib</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L80" class="LineNr"> 80 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -145,8 +145,8 @@ if ('onhashchange' in window) {
<span id="L87" class="LineNr"> 87 </span> <span class="Constant">&quot;01 00 00 00\n&quot;</span> <span class="Comment">// 0x00000001</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Constant">&quot;run: add <a href='010---vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Constant">&quot;run: effective address is initially 0x00002000 (<a href='040---tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Constant">&quot;run: add <a href='010vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Constant">&quot;run: effective address is initially 0x00002000 (<a href='040tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L92" class="LineNr"> 92 </span> <span class="Constant">&quot;run: effective address is 0x00002000\n&quot;</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;run: storing 0x00000011\n&quot;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Delimiter">);</span>
@ -156,9 +156,9 @@ if ('onhashchange' in window) {
<span id="L98" class="LineNr"> 98 </span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(code)</span>
<span id="L100" class="LineNr">100 </span><span class="Normal">void</span> <a href='016index_addressing.cc.html#L100'>test_add_r32_to_mem_at_base_r32_index_r32_plus_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L101" class="LineNr">101 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L102" class="LineNr">102 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ff9</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L103" class="LineNr">103 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x5</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L101" class="LineNr">101 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L102" class="LineNr">102 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ff9</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L103" class="LineNr">103 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x5</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L104" class="LineNr">104 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L105" class="LineNr">105 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L106" class="LineNr">106 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -169,8 +169,8 @@ if ('onhashchange' in window) {
<span id="L111" class="LineNr">111 </span> <span class="Constant">&quot;01 00 00 00\n&quot;</span> <span class="Comment">// 0x00000001</span>
<span id="L112" class="LineNr">112 </span> <span class="Delimiter">);</span>
<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L114" class="LineNr">114 </span> <span class="Constant">&quot;run: add <a href='010---vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L115" class="LineNr">115 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ff9 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L114" class="LineNr">114 </span> <span class="Constant">&quot;run: add <a href='010vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L115" class="LineNr">115 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ff9 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L116" class="LineNr">116 </span> <span class="Constant">&quot;run: effective address is 0x00001ffe (after adding ECX*1)\n&quot;</span>
<span id="L117" class="LineNr">117 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (after adding disp8)\n&quot;</span>
<span id="L118" class="LineNr">118 </span> <span class="Constant">&quot;run: storing 0x00000011\n&quot;</span>
@ -186,9 +186,9 @@ if ('onhashchange' in window) {
<span id="L128" class="LineNr">128 </span>
<span id="L129" class="LineNr">129 </span><span class="Delimiter">:(code)</span>
<span id="L130" class="LineNr">130 </span><span class="Normal">void</span> <a href='016index_addressing.cc.html#L130'>test_add_r32_to_mem_at_base_r32_index_r32_plus_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L131" class="LineNr">131 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L132" class="LineNr">132 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ff9</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L133" class="LineNr">133 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x5</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L131" class="LineNr">131 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x10</span><span class="Delimiter">;</span> <span class="Comment">// source</span>
<span id="L132" class="LineNr">132 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x1ff9</span><span class="Delimiter">;</span> <span class="Comment">// dest base</span>
<span id="L133" class="LineNr">133 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>i = <span class="Constant">0x5</span><span class="Delimiter">;</span> <span class="Comment">// dest index</span>
<span id="L134" class="LineNr">134 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L135" class="LineNr">135 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L136" class="LineNr">136 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -199,10 +199,10 @@ if ('onhashchange' in window) {
<span id="L141" class="LineNr">141 </span> <span class="Constant">&quot;01 00 00 00\n&quot;</span> <span class="Comment">// 0x00000001</span>
<span id="L142" class="LineNr">142 </span> <span class="Delimiter">);</span>
<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L144" class="LineNr">144 </span> <span class="Constant">&quot;run: add <a href='010---vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L145" class="LineNr">145 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ff9 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L144" class="LineNr">144 </span> <span class="Constant">&quot;run: add <a href='010vm.cc.html#L13'>EBX</a> to r/m32\n&quot;</span>
<span id="L145" class="LineNr">145 </span> <span class="Constant">&quot;run: effective address is initially 0x00001ff9 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L146" class="LineNr">146 </span> <span class="Constant">&quot;run: effective address is 0x00001ffe (after adding ECX*1)\n&quot;</span>
<span id="L147" class="LineNr">147 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (after adding <a href='040---tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L147" class="LineNr">147 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (after adding <a href='040tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L148" class="LineNr">148 </span> <span class="Constant">&quot;run: storing 0x00000011\n&quot;</span>
<span id="L149" class="LineNr">149 </span> <span class="Delimiter">);</span>
<span id="L150" class="LineNr">150 </span><span class="Delimiter">}</span>

View File

@ -62,7 +62,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="SalientComment">//:: jump</span>
<span id="L4" class="LineNr"> 4 </span>
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;eb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;eb&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(code)</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L9'>test_jump_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -83,20 +83,20 @@ if ('onhashchange' in window) {
<span id="L24" class="LineNr"> 24 </span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> <span class="Constant">0xeb</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">}</span>
<span id="L32" class="LineNr"> 32 </span>
<span id="L33" class="LineNr"> 33 </span><span class="SalientComment">//:: jump if equal/zero</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;74&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if equal, if <a href='010---vm.cc.html#L80'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;74&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if equal, if <a href='010vm.cc.html#L80'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L39'>test_je_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L40" class="LineNr"> 40 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -114,17 +114,17 @@ if ('onhashchange' in window) {
<span id="L55" class="LineNr"> 55 </span>
<span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> <span class="Constant">0x74</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span>
<span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(code)</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L67'>test_je_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L68" class="LineNr"> 68 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -143,11 +143,11 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span><span class="SalientComment">//:: jump if not equal/not zero</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;75&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if not equal, if <a href='010---vm.cc.html#L80'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;75&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if not equal, if <a href='010vm.cc.html#L80'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(code)</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L90'>test_jne_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L91" class="LineNr"> 91 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -165,17 +165,17 @@ if ('onhashchange' in window) {
<span id="L106" class="LineNr">106 </span>
<span id="L107" class="LineNr">107 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L108" class="LineNr">108 </span><span class="Normal">case</span> <span class="Constant">0x75</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if !ZF</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr">112 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr">112 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="Delimiter">:(code)</span>
<span id="L118" class="LineNr">118 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L118'>test_jne_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L121" class="LineNr">121 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L122" class="LineNr">122 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -194,14 +194,14 @@ if ('onhashchange' in window) {
<span id="L135" class="LineNr">135 </span><span class="SalientComment">//:: jump if greater</span>
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L82'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;77&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and <a href='010---vm.cc.html#L81'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (signed), if <a href='010vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010vm.cc.html#L82'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;77&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is unset and <a href='010vm.cc.html#L81'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L142'>test_jg_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L147" class="LineNr">147 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L148" class="LineNr">148 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -219,27 +219,27 @@ if ('onhashchange' in window) {
<span id="L160" class="LineNr">160 </span>
<span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L162" class="LineNr">162 </span><span class="Normal">case</span> <span class="Constant">0x7f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF == OF and !ZF</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L82'>OF</a> &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010vm.cc.html#L82'>OF</a> &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span>
<span id="L168" class="LineNr">168 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span><span class="Normal">case</span> <span class="Constant">0x77</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if !CF and !ZF</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span>
<span id="L178" class="LineNr">178 </span>
<span id="L179" class="LineNr">179 </span><span class="Delimiter">:(code)</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L180'>test_jg_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L181" class="LineNr">181 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L184" class="LineNr">184 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L185" class="LineNr">185 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L186" class="LineNr">186 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -258,13 +258,13 @@ if ('onhashchange' in window) {
<span id="L199" class="LineNr">199 </span><span class="SalientComment">//:: jump if greater or equal</span>
<span id="L200" class="LineNr">200 </span>
<span id="L201" class="LineNr">201 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (signed), if SF == <a href='010---vm.cc.html#L82'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;73&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (signed), if SF == <a href='010vm.cc.html#L82'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;73&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if greater or equal (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L206'>test_jge_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L210" class="LineNr">210 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L211" class="LineNr">211 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -282,18 +282,18 @@ if ('onhashchange' in window) {
<span id="L223" class="LineNr">223 </span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x7d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF == OF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span>
<span id="L231" class="LineNr">231 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">case</span> <span class="Constant">0x73</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if !CF</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L235" class="LineNr">235 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L237" class="LineNr">237 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L237" class="LineNr">237 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <span class="Delimiter">}</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
@ -301,7 +301,7 @@ if ('onhashchange' in window) {
<span id="L242" class="LineNr">242 </span><span class="Delimiter">:(code)</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L243'>test_jge_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L247" class="LineNr">247 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L248" class="LineNr">248 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -320,14 +320,14 @@ if ('onhashchange' in window) {
<span id="L261" class="LineNr">261 </span><span class="SalientComment">//:: jump if lesser</span>
<span id="L262" class="LineNr">262 </span>
<span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (signed), if SF != <a href='010---vm.cc.html#L82'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;72&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (signed), if SF != <a href='010vm.cc.html#L82'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;72&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span>
<span id="L267" class="LineNr">267 </span><span class="Delimiter">:(code)</span>
<span id="L268" class="LineNr">268 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L268'>test_jl_disp8_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L269" class="LineNr">269 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L269" class="LineNr">269 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L273" class="LineNr">273 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L274" class="LineNr">274 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -345,27 +345,27 @@ if ('onhashchange' in window) {
<span id="L286" class="LineNr">286 </span>
<span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">case</span> <span class="Constant">0x7c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if SF != OF</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L292" class="LineNr">292 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L292" class="LineNr">292 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span> <span class="Delimiter">}</span>
<span id="L294" class="LineNr">294 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span><span class="Normal">case</span> <span class="Constant">0x72</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if CF</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L300" class="LineNr">300 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L300" class="LineNr">300 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">:(code)</span>
<span id="L306" class="LineNr">306 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L306'>test_jl_disp8_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L307" class="LineNr">307 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L310" class="LineNr">310 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L311" class="LineNr">311 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L312" class="LineNr">312 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -384,14 +384,14 @@ if ('onhashchange' in window) {
<span id="L325" class="LineNr">325 </span><span class="SalientComment">//:: jump if lesser or equal</span>
<span id="L326" class="LineNr">326 </span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is set or SF != <a href='010---vm.cc.html#L82'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;76&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is set or <a href='010---vm.cc.html#L81'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;7e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (signed), if <a href='010vm.cc.html#L80'>ZF</a> is set or SF != <a href='010vm.cc.html#L82'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;76&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump disp8 bytes away if lesser or equal (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is set or <a href='010vm.cc.html#L81'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span>
<span id="L332" class="LineNr">332 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L332'>test_jle_disp8_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L333" class="LineNr">333 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L338" class="LineNr">338 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -409,9 +409,9 @@ if ('onhashchange' in window) {
<span id="L350" class="LineNr">350 </span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">:(code)</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L352'>test_jle_disp8_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L353" class="LineNr">353 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L354" class="LineNr">354 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L356" class="LineNr">356 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L357" class="LineNr">357 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L358" class="LineNr">358 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -429,27 +429,27 @@ if ('onhashchange' in window) {
<span id="L370" class="LineNr">370 </span>
<span id="L371" class="LineNr">371 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L372" class="LineNr">372 </span><span class="Normal">case</span> <span class="Constant">0x7e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF or SF != OF</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L376" class="LineNr">376 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L376" class="LineNr">376 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span>
<span id="L378" class="LineNr">378 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span><span class="Normal">case</span> <span class="Constant">0x76</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp8 if ZF or CF</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || <a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L384" class="LineNr">384 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int8_t</span> offset = <span class="Normal">static_cast</span>&lt;<span class="Normal">int</span>&gt;<span class="Delimiter">(</span><a href='010vm.cc.html#L325'>next</a><span class="Delimiter">());</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || <a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>offset<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L384" class="LineNr">384 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L385" class="LineNr">385 </span> <span class="Delimiter">}</span>
<span id="L386" class="LineNr">386 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span><span class="Delimiter">}</span>
<span id="L388" class="LineNr">388 </span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> <a href='017jump_disp8.cc.html#L390'>test_jle_disp8_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L391" class="LineNr">391 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L392" class="LineNr">392 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L394" class="LineNr">394 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L395" class="LineNr">395 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L396" class="LineNr">396 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>

View File

@ -62,7 +62,7 @@ if ('onhashchange' in window) {
<span id="L3" class="LineNr"> 3 </span><span class="SalientComment">//:: jump</span>
<span id="L4" class="LineNr"> 4 </span>
<span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e9&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away (jmp)&quot;</span><span class="Delimiter">);</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(code)</span>
<span id="L9" class="LineNr"> 9 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L9'>test_jump_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
@ -85,18 +85,18 @@ if ('onhashchange' in window) {
<span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> <span class="Constant">0xe9</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">}</span>
<span id="L32" class="LineNr"> 32 </span>
<span id="L33" class="LineNr"> 33 </span><span class="SalientComment">//:: jump if equal/zero</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L80'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L36" class="LineNr"> 36 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if equal, if <a href='010vm.cc.html#L80'>ZF</a> is set (jcc/jz/je)&quot;</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L39'>test_je_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L40" class="LineNr"> 40 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L41" class="LineNr"> 41 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -115,16 +115,16 @@ if ('onhashchange' in window) {
<span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> <span class="Constant">0x84</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if ZF</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span>
<span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(code)</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L67'>test_je_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L68" class="LineNr"> 68 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L69" class="LineNr"> 69 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -143,11 +143,11 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span><span class="SalientComment">//:: jump if not equal/not zero</span>
<span id="L85" class="LineNr"> 85 </span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if not equal, if <a href='010---vm.cc.html#L80'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if not equal, if <a href='010vm.cc.html#L80'>ZF</a> is not set (jcc/jnz/jne)&quot;</span><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(code)</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L90'>test_jne_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L91" class="LineNr"> 91 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -168,14 +168,14 @@ if ('onhashchange' in window) {
<span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L112" class="LineNr">112 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L112" class="LineNr">112 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="Delimiter">:(code)</span>
<span id="L118" class="LineNr">118 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L118'>test_jne_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L121" class="LineNr">121 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L122" class="LineNr">122 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -194,14 +194,14 @@ if ('onhashchange' in window) {
<span id="L135" class="LineNr">135 </span><span class="SalientComment">//:: jump if greater</span>
<span id="L136" class="LineNr">136 </span>
<span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if greater (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L82'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if greater (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and <a href='010---vm.cc.html#L81'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L138" class="LineNr">138 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if greater (signed), if <a href='010vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010vm.cc.html#L82'>OF</a> (jcc/jg/jnle)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if greater (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is unset and <a href='010vm.cc.html#L81'>CF</a> is unset (jcc/ja/jnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L142'>test_jg_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L146" class="LineNr">146 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L147" class="LineNr">147 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L148" class="LineNr">148 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -220,26 +220,26 @@ if ('onhashchange' in window) {
<span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L162" class="LineNr">162 </span><span class="Normal">case</span> <span class="Constant">0x8f</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF and !ZF</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF &amp;&amp; SF == <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L164" class="LineNr">164 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!ZF &amp;&amp; SF == <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L166" class="LineNr">166 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span>
<span id="L168" class="LineNr">168 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span>
<span id="L170" class="LineNr">170 </span><span class="Normal">case</span> <span class="Constant">0x87</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !CF and !ZF</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L171" class="LineNr">171 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF &amp;&amp; !ZF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L174" class="LineNr">174 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span>
<span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span>
<span id="L178" class="LineNr">178 </span>
<span id="L179" class="LineNr">179 </span><span class="Delimiter">:(code)</span>
<span id="L180" class="LineNr">180 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L180'>test_jg_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L181" class="LineNr">181 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L181" class="LineNr">181 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L184" class="LineNr">184 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L185" class="LineNr">185 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L186" class="LineNr">186 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -258,13 +258,13 @@ if ('onhashchange' in window) {
<span id="L199" class="LineNr">199 </span><span class="SalientComment">//:: jump if greater or equal</span>
<span id="L200" class="LineNr">200 </span>
<span id="L201" class="LineNr">201 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if greater or equal (signed), if SF == <a href='010---vm.cc.html#L82'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if greater or equal (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L202" class="LineNr">202 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if greater or equal (signed), if SF == <a href='010vm.cc.html#L82'>OF</a> (jcc/jge/jnl)&quot;</span><span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if greater or equal (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is unset (jcc/jae/jnb)&quot;</span><span class="Delimiter">);</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span>
<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L206'>test_jge_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L209" class="LineNr">209 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L210" class="LineNr">210 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L211" class="LineNr">211 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -283,9 +283,9 @@ if ('onhashchange' in window) {
<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x8d</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if !SF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF == <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L229" class="LineNr">229 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span>
<span id="L231" class="LineNr">231 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
@ -293,7 +293,7 @@ if ('onhashchange' in window) {
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L235" class="LineNr">235 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!CF<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L237" class="LineNr">237 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L237" class="LineNr">237 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <span class="Delimiter">}</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
@ -301,7 +301,7 @@ if ('onhashchange' in window) {
<span id="L242" class="LineNr">242 </span><span class="Delimiter">:(code)</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L243'>test_jge_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L245" class="LineNr">245 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L246" class="LineNr">246 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L247" class="LineNr">247 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L248" class="LineNr">248 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -320,14 +320,14 @@ if ('onhashchange' in window) {
<span id="L261" class="LineNr">261 </span><span class="SalientComment">//:: jump if lesser</span>
<span id="L262" class="LineNr">262 </span>
<span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if lesser (signed), if SF != <a href='010---vm.cc.html#L82'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if lesser (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L264" class="LineNr">264 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if lesser (signed), if SF != <a href='010vm.cc.html#L82'>OF</a> (jcc/jl/jnge)&quot;</span><span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if lesser (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is set (jcc/jb/jnae)&quot;</span><span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span>
<span id="L267" class="LineNr">267 </span><span class="Delimiter">:(code)</span>
<span id="L268" class="LineNr">268 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L268'>test_jl_disp32_success</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L269" class="LineNr">269 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L269" class="LineNr">269 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L270" class="LineNr">270 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L271" class="LineNr">271 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L273" class="LineNr">273 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L274" class="LineNr">274 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -346,26 +346,26 @@ if ('onhashchange' in window) {
<span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">case</span> <span class="Constant">0x8c</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF and !ZF</span>
<span id="L289" class="LineNr">289 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L290" class="LineNr">290 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L292" class="LineNr">292 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L292" class="LineNr">292 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span> <span class="Delimiter">}</span>
<span id="L294" class="LineNr">294 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
<span id="L296" class="LineNr">296 </span><span class="Normal">case</span> <span class="Constant">0x82</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if CF</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L300" class="LineNr">300 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L300" class="LineNr">300 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">:(code)</span>
<span id="L306" class="LineNr">306 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L306'>test_jl_disp32_fail</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L307" class="LineNr">307 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L307" class="LineNr">307 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L308" class="LineNr">308 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L310" class="LineNr">310 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L311" class="LineNr">311 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L312" class="LineNr">312 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -384,14 +384,14 @@ if ('onhashchange' in window) {
<span id="L325" class="LineNr">325 </span><span class="SalientComment">//:: jump if lesser or equal</span>
<span id="L326" class="LineNr">326 </span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if lesser or equal (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is set or SF != <a href='010---vm.cc.html#L82'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if lesser or equal (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is set or <a href='010---vm.cc.html#L81'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L328" class="LineNr">328 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if lesser or equal (signed), if <a href='010vm.cc.html#L80'>ZF</a> is set or SF != <a href='010vm.cc.html#L82'>OF</a> (jcc/jle/jng)&quot;</span><span class="Delimiter">);</span>
<span id="L329" class="LineNr">329 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if lesser or equal (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is set or <a href='010vm.cc.html#L81'>CF</a> is set (jcc/jbe/jna)&quot;</span><span class="Delimiter">);</span>
<span id="L330" class="LineNr">330 </span>
<span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span>
<span id="L332" class="LineNr">332 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L332'>test_jle_disp32_equal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L333" class="LineNr">333 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L334" class="LineNr">334 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L335" class="LineNr">335 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L336" class="LineNr">336 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L338" class="LineNr">338 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -409,9 +409,9 @@ if ('onhashchange' in window) {
<span id="L350" class="LineNr">350 </span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">:(code)</span>
<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L352'>test_jle_disp32_lesser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L353" class="LineNr">353 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L354" class="LineNr">354 </span> SF = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L355" class="LineNr">355 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L356" class="LineNr">356 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L357" class="LineNr">357 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L358" class="LineNr">358 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -430,26 +430,26 @@ if ('onhashchange' in window) {
<span id="L371" class="LineNr">371 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L372" class="LineNr">372 </span><span class="Normal">case</span> <span class="Constant">0x8e</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if SF or ZF</span>
<span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L374" class="LineNr">374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L375" class="LineNr">375 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L376" class="LineNr">376 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L376" class="LineNr">376 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span>
<span id="L378" class="LineNr">378 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span><span class="Normal">case</span> <span class="Constant">0x86</span>: <span class="Delimiter">{</span> <span class="Comment">// jump disp32 if ZF or CF</span>
<span id="L381" class="LineNr">381 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || <a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L382" class="LineNr">382 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || <a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L383" class="LineNr">383 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump &quot;</span> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L384" class="LineNr">384 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L384" class="LineNr">384 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L385" class="LineNr">385 </span> <span class="Delimiter">}</span>
<span id="L386" class="LineNr">386 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span><span class="Delimiter">}</span>
<span id="L388" class="LineNr">388 </span>
<span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span>
<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> <a href='018jump_disp32.cc.html#L390'>test_jle_disp32_greater</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L391" class="LineNr">391 </span> <a href='010---vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L391" class="LineNr">391 </span> <a href='010vm.cc.html#L80'>ZF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L392" class="LineNr">392 </span> SF = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010---vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L393" class="LineNr">393 </span> <a href='010vm.cc.html#L82'>OF</a> = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L394" class="LineNr">394 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L395" class="LineNr">395 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L396" class="LineNr">396 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>

View File

@ -61,12 +61,12 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="SalientComment">//:: call</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;call <a href='040---tests.cc.html#L82'>disp32</a> (call)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;e8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;call <a href='040tests.cc.html#L82'>disp32</a> (call)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(code)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">void</span> <a href='019functions.cc.html#L7'>test_call_disp32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L9" class="LineNr"> 9 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L9" class="LineNr"> 9 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L10" class="LineNr"> 10 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L11" class="LineNr"> 11 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L12" class="LineNr"> 12 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -75,7 +75,7 @@ if ('onhashchange' in window) {
<span id="L15" class="LineNr"> 15 </span> <span class="Delimiter">);</span>
<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L17" class="LineNr"> 17 </span> <span class="Constant">&quot;run: call imm32 0x000000a0\n&quot;</span>
<span id="L18" class="LineNr"> 18 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L18" class="LineNr"> 18 </span> <span class="Constant">&quot;run: decrementing <a href='010vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L19" class="LineNr"> 19 </span> <span class="Constant">&quot;run: pushing value 0x00000006\n&quot;</span>
<span id="L20" class="LineNr"> 20 </span> <span class="Constant">&quot;run: jumping to 0x000000a6\n&quot;</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Delimiter">);</span>
@ -85,11 +85,11 @@ if ('onhashchange' in window) {
<span id="L25" class="LineNr"> 25 </span><span class="Normal">case</span> <span class="Constant">0xe8</span>: <span class="Delimiter">{</span> <span class="Comment">// call disp32 relative to next EIP</span>
<span id="L26" class="LineNr"> 26 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span> offset = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L27" class="LineNr"> 27 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call imm32 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call imm32 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; offset &lt;&lt; end<span class="Delimiter">();</span>
<span id="L29" class="LineNr"> 29 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;push: EIP: &quot; &lt;&lt; EIP &lt;&lt; &quot; =&gt; &quot; &lt;&lt; Reg[ESP].u &lt;&lt; '\n';</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span> <a href='010---vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L30" class="LineNr"> 30 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L31" class="LineNr"> 31 </span> <a href='010vm.cc.html#L26'>EIP</a> += offset<span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L33" class="LineNr"> 33 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span>
<span id="L35" class="LineNr"> 35 </span>
@ -97,9 +97,9 @@ if ('onhashchange' in window) {
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span>
<span id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='019functions.cc.html#L39'>test_call_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L40" class="LineNr"> 40 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x000000a0</span><span class="Delimiter">;</span>
<span id="L40" class="LineNr"> 40 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x000000a0</span><span class="Delimiter">;</span>
<span id="L43" class="LineNr"> 43 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -109,7 +109,7 @@ if ('onhashchange' in window) {
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Constant">&quot;run: call to r/m32\n&quot;</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Constant">&quot;run: r/m32 is EBX\n&quot;</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Constant">&quot;run: decrementing <a href='010vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L53" class="LineNr"> 53 </span> <span class="Constant">&quot;run: pushing value 0x00000003\n&quot;</span>
<span id="L54" class="LineNr"> 54 </span> <span class="Constant">&quot;run: jumping to 0x000000a3\n&quot;</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Delimiter">);</span>
@ -119,18 +119,18 @@ if ('onhashchange' in window) {
<span id="L59" class="LineNr"> 59 </span><span class="Normal">case</span> <span class="Constant">2</span>: <span class="Delimiter">{</span> <span class="Comment">// call function pointer at r/m32</span>
<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;call to r/m32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">const</span> <span class="Normal">int32_t</span>* offset = <a href='013direct_addressing.cc.html#L101'>effective_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span> <a href='010---vm.cc.html#L26'>EIP</a> += *offset<span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span> <a href='012elf.cc.html#L94'>push</a><span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span> <a href='010vm.cc.html#L26'>EIP</a> += *offset<span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> ++<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span><span class="Delimiter">}</span>
<span id="L68" class="LineNr"> 68 </span>
<span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(code)</span>
<span id="L70" class="LineNr"> 70 </span><span class="Normal">void</span> <a href='019functions.cc.html#L70'>test_call_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L75" class="LineNr"> 75 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L76" class="LineNr"> 76 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -141,8 +141,8 @@ if ('onhashchange' in window) {
<span id="L81" class="LineNr"> 81 </span> <span class="Delimiter">);</span>
<span id="L82" class="LineNr"> 82 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Constant">&quot;run: call to r/m32\n&quot;</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010---vm.cc.html#L13'>EBX</a>)\n&quot;</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Constant">&quot;run: decrementing <a href='010---vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010vm.cc.html#L13'>EBX</a>)\n&quot;</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Constant">&quot;run: decrementing <a href='010vm.cc.html#L14'>ESP</a> to 0xbd000060\n&quot;</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Constant">&quot;run: pushing value 0x00000003\n&quot;</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Constant">&quot;run: jumping to 0x000000a3\n&quot;</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">);</span>
@ -151,13 +151,13 @@ if ('onhashchange' in window) {
<span id="L91" class="LineNr"> 91 </span><span class="SalientComment">//:: ret</span>
<span id="L92" class="LineNr"> 92 </span>
<span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L94" class="LineNr"> 94 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;return from most recent unfinished call (<a href='040---tests.cc.html#L89'>ret</a>)&quot;</span><span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c3&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;return from most recent unfinished call (<a href='040tests.cc.html#L89'>ret</a>)&quot;</span><span class="Delimiter">);</span>
<span id="L95" class="LineNr"> 95 </span>
<span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(code)</span>
<span id="L97" class="LineNr"> 97 </span><span class="Normal">void</span> <a href='019functions.cc.html#L97'>test_ret</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> <a href='010---vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000064</span><span class="Delimiter">;</span>
<span id="L100" class="LineNr">100 </span> <a href='010vm.cc.html#L239'>write_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
<span id="L101" class="LineNr">101 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L102" class="LineNr">102 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L103" class="LineNr">103 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -176,8 +176,8 @@ if ('onhashchange' in window) {
<span id="L116" class="LineNr">116 </span><span class="Normal">case</span> <span class="Constant">0xc3</span>: <span class="Delimiter">{</span> <span class="Comment">// return from a call</span>
<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;return&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L118" class="LineNr">118 </span> --<span class="Special">Callstack_depth</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <a href='010---vm.cc.html#L26'>EIP</a> = <a href='013direct_addressing.cc.html#L1270'>pop</a><span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L119" class="LineNr">119 </span> <a href='010vm.cc.html#L26'>EIP</a> = <a href='013direct_addressing.cc.html#L1270'>pop</a><span class="Delimiter">();</span>
<span id="L120" class="LineNr">120 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jumping to 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L121" class="LineNr">121 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span><span class="Delimiter">}</span>
</pre>

View File

@ -59,14 +59,14 @@ if ('onhashchange' in window) {
<a href='https://github.com/akkartik/mu/blob/master/020syscalls.cc'>https://github.com/akkartik/mu/blob/master/020syscalls.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L2" class="LineNr"> 2 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;cd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;software interrupt (int)&quot;</span><span class="Delimiter">);</span>
<span id="L2" class="LineNr"> 2 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;cd&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;software interrupt (int)&quot;</span><span class="Delimiter">);</span>
<span id="L3" class="LineNr"> 3 </span>
<span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L5" class="LineNr"> 5 </span><span class="Normal">case</span> <span class="Constant">0xcd</span>: <span class="Delimiter">{</span> <span class="Comment">// int imm8 (software interrupt)</span>
<span id="L6" class="LineNr"> 6 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;syscall&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L7" class="LineNr"> 7 </span> <span class="Normal">uint8_t</span> code = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L7" class="LineNr"> 7 </span> <span class="Normal">uint8_t</span> code = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>code != <span class="Constant">0x80</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Unimplemented interrupt code &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; code &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Unimplemented interrupt code &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; code &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L10" class="LineNr"> 10 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot; Only `int 80h` supported for now.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L11" class="LineNr"> 11 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L12" class="LineNr"> 12 </span> <span class="Delimiter">}</span>
@ -76,91 +76,91 @@ if ('onhashchange' in window) {
<span id="L16" class="LineNr"> 16 </span>
<span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(code)</span>
<span id="L18" class="LineNr"> 18 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L18'>process_int80</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L19" class="LineNr"> 19 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L19" class="LineNr"> 19 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L20" class="LineNr"> 20 </span> <span class="Normal">case</span> <span class="Constant">1</span>:
<span id="L21" class="LineNr"> 21 </span> exit<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">exit code</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L21" class="LineNr"> 21 </span> exit<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">exit code</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Normal">case</span> <span class="Constant">3</span>:
<span id="L24" class="LineNr"> 24 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;read: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L25" class="LineNr"> 25 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = read<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">memory buffer</span><span class="Comment">*/</span><a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">size</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;read: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L24" class="LineNr"> 24 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;read: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L25" class="LineNr"> 25 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = read<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">memory buffer</span><span class="Comment">*/</span><a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">size</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L26" class="LineNr"> 26 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L27" class="LineNr"> 27 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;read: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Normal">case</span> <span class="Constant">4</span>:
<span id="L30" class="LineNr"> 30 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L223'>mem_addr_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = write<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">memory buffer</span><span class="Comment">*/</span><a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">size</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L30" class="LineNr"> 30 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L223'>mem_addr_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = write<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">memory buffer</span><span class="Comment">*/</span><a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">size</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;write: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Normal">case</span> <span class="Constant">5</span>: <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span> <a href='020syscalls.cc.html#L89'>check_flags</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L11'>ECX</a><span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L12'>EDX</a><span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = open<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">flags</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L37" class="LineNr"> 37 </span> <a href='020syscalls.cc.html#L89'>check_flags</a><span class="Delimiter">(</span><a href='010vm.cc.html#L11'>ECX</a><span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><a href='010vm.cc.html#L12'>EDX</a><span class="Delimiter">);</span>
<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">' '</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = open<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">flags</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;open: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L44" class="LineNr"> 44 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Delimiter">}</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Normal">case</span> <span class="Constant">6</span>:
<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;close: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = close<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;close: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;close: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = close<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">file descriptor</span><span class="Comment">*/</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;close: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">case</span> <span class="Constant">8</span>:
<span id="L53" class="LineNr"> 53 </span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L11'>ECX</a><span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = creat<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L53" class="LineNr"> 53 </span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><a href='010vm.cc.html#L11'>ECX</a><span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = creat<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">mode</span><span class="Comment">*/</span><span class="PreProc">0</span><span class="Constant">640</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;creat: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Normal">case</span> <span class="Constant">10</span>:
<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = unlink<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = unlink<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">filename</span><span class="Comment">*/</span><a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;unlink: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Normal">case</span> <span class="Constant">38</span>:
<span id="L68" class="LineNr"> 68 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = rename<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">old filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">new filename</span><span class="Comment">*/</span><a href='010---vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L68" class="LineNr"> 68 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L71" class="LineNr"> 71 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = rename<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">old filename</span><span class="Comment">*/</span><a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u<span class="Delimiter">),</span> <span class="Comment">/*</span><span class="Comment">new filename</span><span class="Comment">*/</span><a href='010vm.cc.html#L220'>mem_addr_kernel_string</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ECX]<span class="Delimiter">.</span>u<span class="Delimiter">));</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt;&lt; end<span class="Delimiter">();</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i == -<span class="Constant">1</span><span class="Delimiter">)</span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;rename: &quot;</span> &lt;&lt; strerror<span class="Delimiter">(</span>errno<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L74" class="LineNr"> 74 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L75" class="LineNr"> 75 </span> <span class="Normal">case</span> <span class="Constant">90</span>: <span class="Comment">// mmap: allocate memory outside existing segment allocations</span>
<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;mmap: allocate new segment&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L77" class="LineNr"> 77 </span> <span class="Comment">// Ignore most arguments for now: address hint, protection flags, sharing flags, fd, offset.</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Comment">// We only support anonymous maps.</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <a href='020syscalls.cc.html#L113'>new_segment</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">length</span><span class="Comment">*/</span><a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u+<span class="Constant">0x4</span><span class="Delimiter">));</span>
<span id="L80" class="LineNr"> 80 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <a href='020syscalls.cc.html#L113'>new_segment</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">length</span><span class="Comment">*/</span><a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u+<span class="Constant">0x4</span><span class="Delimiter">));</span>
<span id="L80" class="LineNr"> 80 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;result: &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Normal">default</span>:
<span id="L83" class="LineNr"> 83 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: unimplemented syscall &quot;</span> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L83" class="LineNr"> 83 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: unimplemented syscall &quot;</span> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span>
<span id="L85" class="LineNr"> 85 </span><span class="Delimiter">}</span>
<span id="L86" class="LineNr"> 86 </span>
<span id="L87" class="LineNr"> 87 </span><span class="Comment">// SubX is oblivious to file permissions, directories, symbolic links, terminals, and much else besides.</span>
<span id="L88" class="LineNr"> 88 </span><span class="Comment">// Also ignoring any concurrency considerations for now.</span>
<span id="L89" class="LineNr"> 89 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L89'>check_flags</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010---vm.cc.html#L20'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Normal">uint32_t</span> flags = <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L89" class="LineNr"> 89 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L89'>check_flags</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010vm.cc.html#L20'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr"> 90 </span> <span class="Normal">uint32_t</span> flags = <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[reg]<span class="Delimiter">.</span>u<span class="Delimiter">;</span>
<span id="L91" class="LineNr"> 91 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>flags != <span class="Delimiter">((</span>flags &amp; O_RDONLY<span class="Delimiter">)</span> | <span class="Delimiter">(</span>flags &amp; O_WRONLY<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n&quot;</span><span class="Delimiter">;</span>
<span id="L92" class="LineNr"> 92 </span> cerr &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: most POSIX flags to the open() syscall are not supported. Just O_RDONLY and O_WRONLY for now. Zero concurrent access support.\n&quot;</span><span class="Delimiter">;</span>
<span id="L93" class="LineNr"> 93 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Delimiter">}</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>flags &amp; O_RDONLY<span class="Delimiter">)</span> &amp;&amp; <span class="Delimiter">(</span>flags &amp; O_WRONLY<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L96" class="LineNr"> 96 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: can't open a file for both reading and writing at once. See <a href="http://man7.org/linux/man-pages/man2/open.2.html.">http://man7.org/linux/man-pages/man2/open.2.html.</a>\n&quot;</span><span class="Delimiter">;</span>
<span id="L96" class="LineNr"> 96 </span> cerr &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: can't open a file for both reading and writing at once. See <a href="http://man7.org/linux/man-pages/man2/open.2.html.">http://man7.org/linux/man-pages/man2/open.2.html.</a>\n&quot;</span><span class="Delimiter">;</span>
<span id="L97" class="LineNr"> 97 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
<span id="L100" class="LineNr">100 </span>
<span id="L101" class="LineNr">101 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010---vm.cc.html#L20'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[reg]<span class="Delimiter">.</span>u != <span class="PreProc">0</span><span class="Constant">600</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L103" class="LineNr">103 </span> cerr &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: SubX is oblivious to file permissions; register &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L20'>reg</a> &lt;&lt; <span class="Constant">&quot; must be 0.\n&quot;</span><span class="Delimiter">;</span>
<span id="L101" class="LineNr">101 </span><span class="Normal">void</span> <a href='020syscalls.cc.html#L101'>check_mode</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='010vm.cc.html#L20'>reg</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[reg]<span class="Delimiter">.</span>u != <span class="PreProc">0</span><span class="Constant">600</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L103" class="LineNr">103 </span> cerr &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L26'>EIP</a> &lt;&lt; <span class="Constant">&quot;: SubX is oblivious to file permissions; register &quot;</span> &lt;&lt; <a href='010vm.cc.html#L20'>reg</a> &lt;&lt; <span class="Constant">&quot; must be 0.\n&quot;</span><span class="Delimiter">;</span>
<span id="L104" class="LineNr">104 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span>
<span id="L106" class="LineNr">106 </span><span class="Delimiter">}</span>
@ -175,9 +175,9 @@ if ('onhashchange' in window) {
<span id="L115" class="LineNr">115 </span> <span class="Normal">uint32_t</span> result = <span class="Delimiter">(</span><span class="Special"><a href='020syscalls.cc.html#L110'>Segments_allocated_above</a></span> - length<span class="Delimiter">)</span> &amp; <span class="Constant">0xff000000</span><span class="Delimiter">;</span> <span class="Comment">// same number of zeroes as SEGMENT_ALIGNMENT</span>
<span id="L116" class="LineNr">116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result &lt;= <a href='012elf.cc.html#L150'>START_HEAP</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;Allocated too many segments; the VM ran out of memory. &quot;</span>
<span id="L118" class="LineNr">118 </span> &lt;&lt; <span class="Constant">&quot;Maybe <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a> can be smaller?\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L118" class="LineNr">118 </span> &lt;&lt; <span class="Constant">&quot;Maybe <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a> can be smaller?\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L173'>die</a><span class="Delimiter">();</span>
<span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span>
<span id="L120" class="LineNr">120 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>result<span class="Delimiter">,</span> result+length<span class="Delimiter">));</span>
<span id="L120" class="LineNr">120 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>result<span class="Delimiter">,</span> result+length<span class="Delimiter">));</span>
<span id="L121" class="LineNr">121 </span> <span class="Special"><a href='020syscalls.cc.html#L110'>Segments_allocated_above</a></span> = result<span class="Delimiter">;</span>
<span id="L122" class="LineNr">122 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span><span class="Delimiter">}</span>

View File

@ -87,23 +87,23 @@ if ('onhashchange' in window) {
<span id="L27" class="LineNr"> 27 </span> <span class="Identifier">return</span> <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span>rm<span class="Delimiter">);</span>
<span id="L28" class="LineNr"> 28 </span> <span class="Delimiter">}</span>
<span id="L29" class="LineNr"> 29 </span> <span class="Comment">// the rest is as usual</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">return</span> <a href='010---vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><a href='013direct_addressing.cc.html#L116'>effective_address_number</a><span class="Delimiter">(</span>modrm<span class="Delimiter">));</span>
<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">return</span> <a href='010vm.cc.html#L180'>mem_addr_u8</a><span class="Delimiter">(</span><a href='013direct_addressing.cc.html#L116'>effective_address_number</a><span class="Delimiter">(</span>modrm<span class="Delimiter">));</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">}</span>
<span id="L32" class="LineNr"> 32 </span>
<span id="L33" class="LineNr"> 33 </span><span class="Normal">uint8_t</span>* <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> rm<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">uint8_t</span>* result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[rm &amp; <span class="Constant">0x3</span>]<span class="Delimiter">.</span>i<span class="Delimiter">);</span> <span class="Comment">// _L register</span>
<span id="L34" class="LineNr"> 34 </span> <span class="Normal">uint8_t</span>* result = <span class="Normal">reinterpret_cast</span>&lt;<span class="Normal">uint8_t</span>*&gt;<span class="Delimiter">(</span>&amp;<span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[rm &amp; <span class="Constant">0x3</span>]<span class="Delimiter">.</span>i<span class="Delimiter">);</span> <span class="Comment">// _L register</span>
<span id="L35" class="LineNr"> 35 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>rm &amp; <span class="Constant">0x4</span><span class="Delimiter">)</span>
<span id="L36" class="LineNr"> 36 </span> ++result<span class="Delimiter">;</span> <span class="Comment">// _H register; assumes host is little-endian</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L41" class="LineNr"> 41 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;88&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8 to r8/m8-at-r32&quot;</span><span class="Delimiter">);</span>
<span id="L41" class="LineNr"> 41 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;88&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8 to r8/m8-at-r32&quot;</span><span class="Delimiter">);</span>
<span id="L42" class="LineNr"> 42 </span>
<span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(code)</span>
<span id="L44" class="LineNr"> 44 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L44'>test_copy_r8_to_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x224488ab</span><span class="Delimiter">;</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0x224488ab</span><span class="Delimiter">;</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr"> 47 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -114,34 +114,34 @@ if ('onhashchange' in window) {
<span id="L54" class="LineNr"> 54 </span> <span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Constant">&quot;run: copy BL to r8/m8-at-r32\n&quot;</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Constant">&quot;run: storing 0xab\n&quot;</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Delimiter">);</span>
<span id="L60" class="LineNr"> 60 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0xaabbccab</span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Constant">0x2000</span><span class="Delimiter">));</span>
<span id="L60" class="LineNr"> 60 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0xaabbccab</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Constant">0x2000</span><span class="Delimiter">));</span>
<span id="L61" class="LineNr"> 61 </span><span class="Delimiter">}</span>
<span id="L62" class="LineNr"> 62 </span>
<span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L64" class="LineNr"> 64 </span><span class="Normal">case</span> <span class="Constant">0x88</span>: <span class="Delimiter">{</span> <span class="Comment">// copy r8 to r/m8</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rsrc = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy &quot;</span> &lt;&lt; <a href='021byte_addressing.cc.html#L7'>rname_8bit</a><span class="Delimiter">(</span>rsrc<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; to r8/m8-at-r32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span>* src = <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span>rsrc<span class="Delimiter">);</span>
<span id="L71" class="LineNr"> 71 </span> *dest = *src<span class="Delimiter">;</span> <span class="Comment">// Read/write multiple elements of vector&lt;uint8_t&gt; at once. Assumes sizeof(int) == 4 on the host as well.</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L73" class="LineNr"> 73 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span>
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="Comment">//:</span>
<span id="L77" class="LineNr"> 77 </span>
<span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L79" class="LineNr"> 79 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8/m8-at-r32 to r8&quot;</span><span class="Delimiter">);</span>
<span id="L79" class="LineNr"> 79 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8a&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy r8/m8-at-r32 to r8&quot;</span><span class="Delimiter">);</span>
<span id="L80" class="LineNr"> 80 </span>
<span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(code)</span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L82'>test_copy_mem_at_r32_to_r8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0xaabbcc0f</span><span class="Delimiter">;</span> <span class="Comment">// one nibble each of lowest byte set to all 0s and all 1s, to maximize value of this test</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>i = <span class="Constant">0xaabbcc0f</span><span class="Delimiter">;</span> <span class="Comment">// one nibble each of lowest byte set to all 0s and all 1s, to maximize value of this test</span>
<span id="L84" class="LineNr"> 84 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L85" class="LineNr"> 85 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L87" class="LineNr"> 87 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -152,32 +152,32 @@ if ('onhashchange' in window) {
<span id="L92" class="LineNr"> 92 </span> <span class="Delimiter">);</span>
<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Constant">&quot;run: copy r8/m8-at-r32 to BL\n&quot;</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L95" class="LineNr"> 95 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L96" class="LineNr"> 96 </span> <span class="Constant">&quot;run: storing 0xab\n&quot;</span>
<span id="L97" class="LineNr"> 97 </span> <span class="Comment">// remaining bytes of EBX are *not* cleared</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Constant">&quot;run: <a href='010---vm.cc.html#L13'>EBX</a> now contains 0xaabbccab\n&quot;</span>
<span id="L98" class="LineNr"> 98 </span> <span class="Constant">&quot;run: <a href='010vm.cc.html#L13'>EBX</a> now contains 0xaabbccab\n&quot;</span>
<span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span>
<span id="L101" class="LineNr">101 </span>
<span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L103" class="LineNr">103 </span><span class="Normal">case</span> <span class="Constant">0x8a</span>: <span class="Delimiter">{</span> <span class="Comment">// copy r/m8 to r8</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L105" class="LineNr">105 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rdest = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span>
<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy r8/m8-at-r32 to &quot;</span> &lt;&lt; <a href='021byte_addressing.cc.html#L7'>rname_8bit</a><span class="Delimiter">(</span>rdest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L107" class="LineNr">107 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L108" class="LineNr">108 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span>* src = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L109" class="LineNr">109 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L33'>reg_8bit</a><span class="Delimiter">(</span>rdest<span class="Delimiter">);</span>
<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L111" class="LineNr">111 </span> *dest = *src<span class="Delimiter">;</span> <span class="Comment">// Read/write multiple elements of vector&lt;uint8_t&gt; at once. Assumes sizeof(int) == 4 on the host as well.</span>
<span id="L112" class="LineNr">112 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> rdest_32bit = rdest &amp; <span class="Constant">0x3</span><span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest_32bit<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; now contains 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[rdest_32bit]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <a href='013direct_addressing.cc.html#L136'>rname</a><span class="Delimiter">(</span>rdest_32bit<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; now contains 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[rdest_32bit]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L114" class="LineNr">114 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>
<span id="L117" class="LineNr">117 </span><span class="Delimiter">:(code)</span>
<span id="L118" class="LineNr">118 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L118'>test_cannot_copy_byte_to_ESP_EBP_ESI_EDI</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESI]<span class="Delimiter">.</span>u = <span class="Constant">0xaabbccdd</span><span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x11223344</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESI]<span class="Delimiter">.</span>u = <span class="Constant">0xaabbccdd</span><span class="Delimiter">;</span>
<span id="L120" class="LineNr">120 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EBX]<span class="Delimiter">.</span>u = <span class="Constant">0x11223344</span><span class="Delimiter">;</span>
<span id="L121" class="LineNr">121 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L122" class="LineNr">122 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L123" class="LineNr">123 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -190,17 +190,17 @@ if ('onhashchange' in window) {
<span id="L130" class="LineNr">130 </span> <span class="Constant">&quot;run: storing 0x44\n&quot;</span>
<span id="L131" class="LineNr">131 </span> <span class="Delimiter">);</span>
<span id="L132" class="LineNr">132 </span> <span class="Comment">// ensure ESI is unchanged</span>
<span id="L133" class="LineNr">133 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESI]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0xaabbccdd</span><span class="Delimiter">);</span>
<span id="L133" class="LineNr">133 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESI]<span class="Delimiter">.</span>u<span class="Delimiter">,</span> <span class="Constant">0xaabbccdd</span><span class="Delimiter">);</span>
<span id="L134" class="LineNr">134 </span><span class="Delimiter">}</span>
<span id="L135" class="LineNr">135 </span>
<span id="L136" class="LineNr">136 </span><span class="Comment">//:</span>
<span id="L137" class="LineNr">137 </span>
<span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm8 to r8/m8-at-r32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;c6&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm8 to r8/m8-at-r32 (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L140" class="LineNr">140 </span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">:(code)</span>
<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='021byte_addressing.cc.html#L142'>test_copy_imm8_to_mem_at_r32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L143" class="LineNr">143 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L143" class="LineNr">143 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">0x2000</span><span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L145" class="LineNr">145 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L146" class="LineNr">146 </span> <span class="Comment">// op ModR/M SIB displacement immediate</span>
@ -211,123 +211,123 @@ if ('onhashchange' in window) {
<span id="L151" class="LineNr">151 </span> <span class="Delimiter">);</span>
<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L153" class="LineNr">153 </span> <span class="Constant">&quot;run: copy imm8 to r8/m8-at-r32\n&quot;</span>
<span id="L154" class="LineNr">154 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010---vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L154" class="LineNr">154 </span> <span class="Constant">&quot;run: effective address is 0x00002000 (<a href='010vm.cc.html#L10'>EAX</a>)\n&quot;</span>
<span id="L155" class="LineNr">155 </span> <span class="Constant">&quot;run: storing 0xdd\n&quot;</span>
<span id="L156" class="LineNr">156 </span> <span class="Delimiter">);</span>
<span id="L157" class="LineNr">157 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0xaabbccdd</span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Constant">0x2000</span><span class="Delimiter">));</span>
<span id="L157" class="LineNr">157 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0xaabbccdd</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span><span class="Constant">0x2000</span><span class="Delimiter">));</span>
<span id="L158" class="LineNr">158 </span><span class="Delimiter">}</span>
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L161" class="LineNr">161 </span><span class="Normal">case</span> <span class="Constant">0xc6</span>: <span class="Delimiter">{</span> <span class="Comment">// copy imm8 to r/m8</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> src = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> src = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm8 to r8/m8-at-r32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm8 is 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;imm8 is 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>src<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L166" class="LineNr">166 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> subop = <span class="Delimiter">(</span>modrm&gt;&gt;<span class="Constant">3</span><span class="Delimiter">)</span>&amp;<span class="Constant">0x7</span><span class="Delimiter">;</span> <span class="Comment">// middle 3 'reg opcode' bits</span>
<span id="L167" class="LineNr">167 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>subop != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L168" class="LineNr">168 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c6: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span> cerr &lt;&lt; <span class="Constant">&quot;unrecognized subop for opcode c6: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>subop<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; (only 0/copy currently implemented)\n&quot;</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L170" class="LineNr">170 </span> <span class="Delimiter">}</span>
<span id="L171" class="LineNr">171 </span> <span class="Comment">// use unsigned to zero-extend 8-bit value to 32 bits</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L173" class="LineNr">173 </span> *dest = src<span class="Delimiter">;</span> <span class="Comment">// Write multiple elements of vector&lt;uint8_t&gt; at once. Assumes sizeof(int) == 4 on the host as well.</span>
<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L175" class="LineNr">175 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span>
<span id="L177" class="LineNr">177 </span>
<span id="L178" class="LineNr">178 </span><span class="SalientComment">//:: set flags (setcc)</span>
<span id="L179" class="LineNr">179 </span>
<span id="L180" class="LineNr">180 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L181" class="LineNr">181 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;94&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if equal, if <a href='010---vm.cc.html#L80'>ZF</a> is set, 0 otherwise (setcc/setz/sete)&quot;</span><span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;95&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if not equal, if <a href='010---vm.cc.html#L80'>ZF</a> is not set, 0 otherwise (setcc/setnz/setne)&quot;</span><span class="Delimiter">);</span>
<span id="L183" class="LineNr">183 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010---vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setg/setnle)&quot;</span><span class="Delimiter">);</span>
<span id="L184" class="LineNr">184 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;97&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is unset and <a href='010---vm.cc.html#L81'>CF</a> is unset, 0 otherwise (setcc/seta/setnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater or equal (signed), if SF == <a href='010---vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setge/setnl)&quot;</span><span class="Delimiter">);</span>
<span id="L186" class="LineNr">186 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;93&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater or equal (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is unset, 0 otherwise (setcc/setae/setnb)&quot;</span><span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser (signed), if SF != <a href='010---vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setl/setnge)&quot;</span><span class="Delimiter">);</span>
<span id="L188" class="LineNr">188 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;92&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser (unsigned), if <a href='010---vm.cc.html#L81'>CF</a> is set, 0 otherwise (setcc/setb/setnae)&quot;</span><span class="Delimiter">);</span>
<span id="L189" class="LineNr">189 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser or equal (signed), if <a href='010---vm.cc.html#L80'>ZF</a> is set or SF != <a href='010---vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setle/setng)&quot;</span><span class="Delimiter">);</span>
<span id="L190" class="LineNr">190 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;96&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser or equal (unsigned), if <a href='010---vm.cc.html#L80'>ZF</a> is set or <a href='010---vm.cc.html#L81'>CF</a> is set, 0 otherwise (setcc/setbe/setna)&quot;</span><span class="Delimiter">);</span>
<span id="L181" class="LineNr">181 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;94&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if equal, if <a href='010vm.cc.html#L80'>ZF</a> is set, 0 otherwise (setcc/setz/sete)&quot;</span><span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;95&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if not equal, if <a href='010vm.cc.html#L80'>ZF</a> is not set, 0 otherwise (setcc/setnz/setne)&quot;</span><span class="Delimiter">);</span>
<span id="L183" class="LineNr">183 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9f&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater (signed), if <a href='010vm.cc.html#L80'>ZF</a> is unset and SF == <a href='010vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setg/setnle)&quot;</span><span class="Delimiter">);</span>
<span id="L184" class="LineNr">184 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;97&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is unset and <a href='010vm.cc.html#L81'>CF</a> is unset, 0 otherwise (setcc/seta/setnbe)&quot;</span><span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9d&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater or equal (signed), if SF == <a href='010vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setge/setnl)&quot;</span><span class="Delimiter">);</span>
<span id="L186" class="LineNr">186 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;93&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if greater or equal (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is unset, 0 otherwise (setcc/setae/setnb)&quot;</span><span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9c&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser (signed), if SF != <a href='010vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setl/setnge)&quot;</span><span class="Delimiter">);</span>
<span id="L188" class="LineNr">188 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;92&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser (unsigned), if <a href='010vm.cc.html#L81'>CF</a> is set, 0 otherwise (setcc/setb/setnae)&quot;</span><span class="Delimiter">);</span>
<span id="L189" class="LineNr">189 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;9e&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser or equal (signed), if <a href='010vm.cc.html#L80'>ZF</a> is set or SF != <a href='010vm.cc.html#L82'>OF</a>, 0 otherwise (setcc/setle/setng)&quot;</span><span class="Delimiter">);</span>
<span id="L190" class="LineNr">190 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;96&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;set r8/m8-at-rm32 to 1 if lesser or equal (unsigned), if <a href='010vm.cc.html#L80'>ZF</a> is set or <a href='010vm.cc.html#L81'>CF</a> is set, 0 otherwise (setcc/setbe/setna)&quot;</span><span class="Delimiter">);</span>
<span id="L191" class="LineNr">191 </span>
<span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before &quot;End Two-Byte Opcodes Starting With 0f&quot;)</span>
<span id="L193" class="LineNr">193 </span><span class="Normal">case</span> <span class="Constant">0x94</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if ZF</span>
<span id="L194" class="LineNr">194 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L194" class="LineNr">194 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L195" class="LineNr">195 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L196" class="LineNr">196 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L197" class="LineNr">197 </span> *dest = <a href='010---vm.cc.html#L80'>ZF</a><span class="Delimiter">;</span>
<span id="L198" class="LineNr">198 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L197" class="LineNr">197 </span> *dest = <a href='010vm.cc.html#L80'>ZF</a><span class="Delimiter">;</span>
<span id="L198" class="LineNr">198 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L199" class="LineNr">199 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L200" class="LineNr">200 </span><span class="Delimiter">}</span>
<span id="L201" class="LineNr">201 </span><span class="Normal">case</span> <span class="Constant">0x95</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if !ZF</span>
<span id="L202" class="LineNr">202 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L202" class="LineNr">202 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L203" class="LineNr">203 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L204" class="LineNr">204 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L205" class="LineNr">205 </span> *dest = !ZF<span class="Delimiter">;</span>
<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L207" class="LineNr">207 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L208" class="LineNr">208 </span><span class="Delimiter">}</span>
<span id="L209" class="LineNr">209 </span><span class="Normal">case</span> <span class="Constant">0x9f</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if !SF and !ZF</span>
<span id="L210" class="LineNr">210 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L210" class="LineNr">210 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L211" class="LineNr">211 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L212" class="LineNr">212 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L213" class="LineNr">213 </span> *dest = !ZF &amp;&amp; SF == <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">;</span>
<span id="L214" class="LineNr">214 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L213" class="LineNr">213 </span> *dest = !ZF &amp;&amp; SF == <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">;</span>
<span id="L214" class="LineNr">214 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L215" class="LineNr">215 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span>
<span id="L217" class="LineNr">217 </span><span class="Normal">case</span> <span class="Constant">0x97</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if !CF and !ZF</span>
<span id="L218" class="LineNr">218 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L218" class="LineNr">218 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L219" class="LineNr">219 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L220" class="LineNr">220 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L221" class="LineNr">221 </span> *dest = <span class="Delimiter">(</span>!CF &amp;&amp; !ZF<span class="Delimiter">);</span>
<span id="L222" class="LineNr">222 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L222" class="LineNr">222 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L223" class="LineNr">223 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">case</span> <span class="Constant">0x9d</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if !SF</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L227" class="LineNr">227 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L228" class="LineNr">228 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L229" class="LineNr">229 </span> *dest = <span class="Delimiter">(</span>SF == <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L230" class="LineNr">230 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L229" class="LineNr">229 </span> *dest = <span class="Delimiter">(</span>SF == <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L230" class="LineNr">230 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L231" class="LineNr">231 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span>
<span id="L233" class="LineNr">233 </span><span class="Normal">case</span> <span class="Constant">0x93</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if !CF</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L235" class="LineNr">235 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L236" class="LineNr">236 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L237" class="LineNr">237 </span> *dest = !CF<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L238" class="LineNr">238 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L239" class="LineNr">239 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span>
<span id="L241" class="LineNr">241 </span><span class="Normal">case</span> <span class="Constant">0x9c</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if SF and !ZF</span>
<span id="L242" class="LineNr">242 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L242" class="LineNr">242 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L243" class="LineNr">243 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L244" class="LineNr">244 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L245" class="LineNr">245 </span> *dest = <span class="Delimiter">(</span>SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L246" class="LineNr">246 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L245" class="LineNr">245 </span> *dest = <span class="Delimiter">(</span>SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L246" class="LineNr">246 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L247" class="LineNr">247 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L248" class="LineNr">248 </span><span class="Delimiter">}</span>
<span id="L249" class="LineNr">249 </span><span class="Normal">case</span> <span class="Constant">0x92</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if CF</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L251" class="LineNr">251 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L252" class="LineNr">252 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L253" class="LineNr">253 </span> *dest = <a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">;</span>
<span id="L254" class="LineNr">254 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L253" class="LineNr">253 </span> *dest = <a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">;</span>
<span id="L254" class="LineNr">254 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L255" class="LineNr">255 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L256" class="LineNr">256 </span><span class="Delimiter">}</span>
<span id="L257" class="LineNr">257 </span><span class="Normal">case</span> <span class="Constant">0x9e</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if SF or ZF</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L258" class="LineNr">258 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L259" class="LineNr">259 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L260" class="LineNr">260 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L261" class="LineNr">261 </span> *dest = <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || SF != <a href='010---vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L261" class="LineNr">261 </span> *dest = <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || SF != <a href='010vm.cc.html#L82'>OF</a><span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L263" class="LineNr">263 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span>
<span id="L265" class="LineNr">265 </span><span class="Normal">case</span> <span class="Constant">0x96</span>: <span class="Delimiter">{</span> <span class="Comment">// set r8/m8-at-rm32 if ZF or CF</span>
<span id="L266" class="LineNr">266 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010---vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L266" class="LineNr">266 </span> <span class="Normal">const</span> <span class="Normal">uint8_t</span> modrm = <a href='010vm.cc.html#L325'>next</a><span class="Delimiter">();</span>
<span id="L267" class="LineNr">267 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;set r8/m8-at-rm32&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L268" class="LineNr">268 </span> <span class="Normal">uint8_t</span>* dest = <a href='021byte_addressing.cc.html#L21'>effective_byte_address</a><span class="Delimiter">(</span>modrm<span class="Delimiter">);</span>
<span id="L269" class="LineNr">269 </span> *dest = <span class="Delimiter">(</span><a href='010---vm.cc.html#L80'>ZF</a> || <a href='010---vm.cc.html#L81'>CF</a><span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L269" class="LineNr">269 </span> *dest = <span class="Delimiter">(</span><a href='010vm.cc.html#L80'>ZF</a> || <a href='010vm.cc.html#L81'>CF</a><span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>*dest<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L271" class="LineNr">271 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span><span class="Delimiter">}</span>
</pre>

View File

@ -59,39 +59,39 @@ if ('onhashchange' in window) {
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: helper for division operations: sign-extend EAX into EDX</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;99&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;sign-extend <a href='010---vm.cc.html#L10'>EAX</a> into <a href='010---vm.cc.html#L12'>EDX</a> (cdq)&quot;</span><span class="Delimiter">);</span>
<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;99&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;sign-extend <a href='010vm.cc.html#L10'>EAX</a> into <a href='010vm.cc.html#L12'>EDX</a> (cdq)&quot;</span><span class="Delimiter">);</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(code)</span>
<span id="L7" class="LineNr"> 7 </span><span class="Normal">void</span> <a href='022div.cc.html#L7'>test_cdq</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">10</span><span class="Delimiter">;</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = <span class="Constant">10</span><span class="Delimiter">;</span>
<span id="L9" class="LineNr"> 9 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L10" class="LineNr">10 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L11" class="LineNr">11 </span> <span class="Constant">&quot;99\n&quot;</span>
<span id="L12" class="LineNr">12 </span> <span class="Delimiter">);</span>
<span id="L13" class="LineNr">13 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L14" class="LineNr">14 </span> <span class="Constant">&quot;run: sign-extend <a href='010---vm.cc.html#L10'>EAX</a> into EDX\n&quot;</span>
<span id="L15" class="LineNr">15 </span> <span class="Constant">&quot;run: <a href='010---vm.cc.html#L12'>EDX</a> is now 0x00000000\n&quot;</span>
<span id="L14" class="LineNr">14 </span> <span class="Constant">&quot;run: sign-extend <a href='010vm.cc.html#L10'>EAX</a> into EDX\n&quot;</span>
<span id="L15" class="LineNr">15 </span> <span class="Constant">&quot;run: <a href='010vm.cc.html#L12'>EDX</a> is now 0x00000000\n&quot;</span>
<span id="L16" class="LineNr">16 </span> <span class="Delimiter">);</span>
<span id="L17" class="LineNr">17 </span><span class="Delimiter">}</span>
<span id="L18" class="LineNr">18 </span>
<span id="L19" class="LineNr">19 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L20" class="LineNr">20 </span><span class="Normal">case</span> <span class="Constant">0x99</span>: <span class="Delimiter">{</span> <span class="Comment">// sign-extend EAX into EDX</span>
<span id="L21" class="LineNr">21 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;sign-extend <a href='010---vm.cc.html#L10'>EAX</a> into EDX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L22" class="LineNr">22 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i = <span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt; <span class="Constant">0</span><span class="Delimiter">)</span> ? -<span class="Constant">1</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L23" class="LineNr">23 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;EDX is now 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L21" class="LineNr">21 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;sign-extend <a href='010vm.cc.html#L10'>EAX</a> into EDX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L22" class="LineNr">22 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>i = <span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i &lt; <span class="Constant">0</span><span class="Delimiter">)</span> ? -<span class="Constant">1</span> : <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L23" class="LineNr">23 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;EDX is now 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EDX]<span class="Delimiter">.</span>u &lt;&lt; end<span class="Delimiter">();</span>
<span id="L24" class="LineNr">24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L25" class="LineNr">25 </span><span class="Delimiter">}</span>
<span id="L26" class="LineNr">26 </span>
<span id="L27" class="LineNr">27 </span><span class="Delimiter">:(code)</span>
<span id="L28" class="LineNr">28 </span><span class="Normal">void</span> <a href='022div.cc.html#L28'>test_cdq_negative</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L29" class="LineNr">29 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = -<span class="Constant">10</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr">29 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = -<span class="Constant">10</span><span class="Delimiter">;</span>
<span id="L30" class="LineNr">30 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L31" class="LineNr">31 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L32" class="LineNr">32 </span> <span class="Constant">&quot;99\n&quot;</span>
<span id="L33" class="LineNr">33 </span> <span class="Delimiter">);</span>
<span id="L34" class="LineNr">34 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L35" class="LineNr">35 </span> <span class="Constant">&quot;run: sign-extend <a href='010---vm.cc.html#L10'>EAX</a> into EDX\n&quot;</span>
<span id="L36" class="LineNr">36 </span> <span class="Constant">&quot;run: <a href='010---vm.cc.html#L12'>EDX</a> is now 0xffffffff\n&quot;</span>
<span id="L35" class="LineNr">35 </span> <span class="Constant">&quot;run: sign-extend <a href='010vm.cc.html#L10'>EAX</a> into EDX\n&quot;</span>
<span id="L36" class="LineNr">36 </span> <span class="Constant">&quot;run: <a href='010vm.cc.html#L12'>EDX</a> is now 0xffffffff\n&quot;</span>
<span id="L37" class="LineNr">37 </span> <span class="Delimiter">);</span>
<span id="L38" class="LineNr">38 </span><span class="Delimiter">}</span>
</pre>

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 030---translate.cc</title>
<title>Mu - 030translate.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
@ -57,7 +57,7 @@ if ('onhashchange' in window) {
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/030---translate.cc'>https://github.com/akkartik/mu/blob/master/030---translate.cc</a>
<a href='https://github.com/akkartik/mu/blob/master/030translate.cc'>https://github.com/akkartik/mu/blob/master/030translate.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: After that lengthy prelude to define an x86 emulator, we are now ready to</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: start translating SubX notation.</span>
@ -78,7 +78,7 @@ if ('onhashchange' in window) {
<span id="L17" class="LineNr"> 17 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L102'>is_equal</a><span class="Delimiter">(</span>argv[i]<span class="Delimiter">,</span> <span class="Constant">&quot;-o&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L18" class="LineNr"> 18 </span> ++i<span class="Delimiter">;</span>
<span id="L19" class="LineNr"> 19 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i &gt;= argc<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L20" class="LineNr"> 20 </span> <a href='030---translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L20" class="LineNr"> 20 </span> <a href='030translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L21" class="LineNr"> 21 </span> cerr &lt;&lt; <span class="Constant">&quot;'-o' must be followed by a filename to write results to\n&quot;</span><span class="Delimiter">;</span>
<span id="L22" class="LineNr"> 22 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Delimiter">}</span>
@ -96,12 +96,12 @@ if ('onhashchange' in window) {
<span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L38" class="LineNr"> 38 </span> <a href='030---translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L38" class="LineNr"> 38 </span> <a href='030translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L39" class="LineNr"> 39 </span> cerr &lt;&lt; <span class="Constant">&quot;nothing to do; must provide at least one file to read\n&quot;</span><span class="Delimiter">;</span>
<span id="L40" class="LineNr"> 40 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L41" class="LineNr"> 41 </span> <span class="Delimiter">}</span>
<span id="L42" class="LineNr"> 42 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>output_filename<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L43" class="LineNr"> 43 </span> <a href='030---translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span> <a href='030translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">();</span>
<span id="L44" class="LineNr"> 44 </span> cerr &lt;&lt; <span class="Constant">&quot;must provide a filename to write to using '-o'\n&quot;</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span>
@ -123,7 +123,7 @@ if ('onhashchange' in window) {
<span id="L62" class="LineNr"> 62 </span> <span class="Comment">// End transform(program&amp; p)</span>
<span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span>
<span id="L64" class="LineNr"> 64 </span>
<span id="L65" class="LineNr"> 65 </span><span class="Normal">void</span> <a href='030---translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L65" class="LineNr"> 65 </span><span class="Normal">void</span> <a href='030translate.cc.html#L65'>print_translate_usage</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L66" class="LineNr"> 66 </span> cerr &lt;&lt; <span class="Constant">&quot;Usage: bootstrap translate file1 file2 ... -o output\n&quot;</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span><span class="Delimiter">}</span>
<span id="L68" class="LineNr"> 68 </span>
@ -145,12 +145,12 @@ if ('onhashchange' in window) {
<span id="L84" class="LineNr"> 84 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span>
<span id="L86" class="LineNr"> 86 </span> <span class="Comment">// processing</span>
<span id="L87" class="LineNr"> 87 </span> <a href='030---translate.cc.html#L92'>write_elf_header</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span> <a href='030translate.cc.html#L92'>write_elf_header</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">size_t</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>size<span class="Delimiter">();</span> ++i<span class="Delimiter">)</span>
<span id="L89" class="LineNr"> 89 </span> <a href='030---translate.cc.html#L188'>write_segment</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> out<span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span> <a href='030translate.cc.html#L188'>write_segment</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> out<span class="Delimiter">);</span>
<span id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span>
<span id="L91" class="LineNr"> 91 </span>
<span id="L92" class="LineNr"> 92 </span><span class="Normal">void</span> <a href='030---translate.cc.html#L92'>write_elf_header</a><span class="Delimiter">(</span>ostream&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span><span class="Normal">void</span> <a href='030translate.cc.html#L92'>write_elf_header</a><span class="Delimiter">(</span>ostream&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Normal">char</span> c = <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
<span id="L94" class="LineNr"> 94 </span><span class="PreProc">#define </span><span class="Special">O</span><span class="PreProc">(</span><span class="Special">X</span><span class="PreProc">) c = (</span><span class="Special">X</span><span class="PreProc">)</span><span class="Delimiter">;</span><span class="PreProc"> out</span><span class="Delimiter">.</span><span class="PreProc">write(&amp;c</span><span class="Delimiter">,</span><span class="PreProc"> </span><span class="Normal">sizeof</span><span class="PreProc">(c))</span>
<span id="L95" class="LineNr"> 95 </span><span class="Comment">// host is required to be little-endian</span>
@ -212,8 +212,8 @@ if ('onhashchange' in window) {
<span id="L151" class="LineNr">151 </span> <span class="Comment">// p_paddr</span>
<span id="L152" class="LineNr">152 </span> emit<span class="Delimiter">(</span>p_start<span class="Delimiter">);</span>
<span id="L153" class="LineNr">153 </span> <span class="Comment">// p_filesz</span>
<span id="L154" class="LineNr">154 </span> <span class="Normal">uint32_t</span> size = <a href='030---translate.cc.html#L198'>num_words</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L155" class="LineNr">155 </span> assert<span class="Delimiter">(</span>p_offset + size &lt; <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L154" class="LineNr">154 </span> <span class="Normal">uint32_t</span> size = <a href='030translate.cc.html#L198'>num_words</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L155" class="LineNr">155 </span> assert<span class="Delimiter">(</span>p_offset + size &lt; <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span>
<span id="L156" class="LineNr">156 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
<span id="L157" class="LineNr">157 </span> <span class="Comment">// p_memsz</span>
<span id="L158" class="LineNr">158 </span> emit<span class="Delimiter">(</span>size<span class="Delimiter">);</span>
@ -235,7 +235,7 @@ if ('onhashchange' in window) {
<span id="L174" class="LineNr">174 </span> <span class="Normal">uint32_t</span> p_align = <span class="Constant">0x1000</span><span class="Delimiter">;</span> <span class="Comment">// default page size on linux</span>
<span id="L175" class="LineNr">175 </span> emit<span class="Delimiter">(</span>p_align<span class="Delimiter">);</span>
<span id="L176" class="LineNr">176 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p_offset % p_align != p_start % p_align<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;segment starting at 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; p_start &lt;&lt; <span class="Constant">&quot; is improperly aligned; alignment for p_offset &quot;</span> &lt;&lt; p_offset &lt;&lt; <span class="Constant">&quot; should be &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_offset % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but is &quot;</span> &lt;&lt; <span class="Delimiter">(</span>p_start % p_align<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L178" class="LineNr">178 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span>
<span id="L180" class="LineNr">180 </span>
@ -246,7 +246,7 @@ if ('onhashchange' in window) {
<span id="L185" class="LineNr">185 </span><span class="PreProc">#undef emit</span>
<span id="L186" class="LineNr">186 </span><span class="Delimiter">}</span>
<span id="L187" class="LineNr">187 </span>
<span id="L188" class="LineNr">188 </span><span class="Normal">void</span> <a href='030---translate.cc.html#L188'>write_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L188" class="LineNr">188 </span><span class="Normal">void</span> <a href='030translate.cc.html#L188'>write_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L189" class="LineNr">189 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L190" class="LineNr">190 </span> <span class="Normal">const</span> vector&lt;word&gt;&amp; w = s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">;</span>
<span id="L191" class="LineNr">191 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -256,7 +256,7 @@ if ('onhashchange' in window) {
<span id="L195" class="LineNr">195 </span> <span class="Delimiter">}</span>
<span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="Normal">uint32_t</span> <a href='030---translate.cc.html#L198'>num_words</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L198" class="LineNr">198 </span><span class="Normal">uint32_t</span> <a href='030translate.cc.html#L198'>num_words</a><span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span> <span class="Normal">uint32_t</span> sum = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L200" class="LineNr">200 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L201" class="LineNr">201 </span> sum += <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 032---operands.cc</title>
<title>Mu - 032operands.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
@ -56,7 +56,7 @@ if ('onhashchange' in window) {
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/032---operands.cc'>https://github.com/akkartik/mu/blob/master/032---operands.cc</a>
<a href='https://github.com/akkartik/mu/blob/master/032operands.cc'>https://github.com/akkartik/mu/blob/master/032operands.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Metadata for fields of an x86 instruction.</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//:</span>
@ -79,7 +79,7 @@ if ('onhashchange' in window) {
<span id="L19" class="LineNr"> 19 </span> <span class="Constant">&quot;any type.\n&quot;</span>
<span id="L20" class="LineNr"> 20 </span> <span class="Constant">&quot;Each instruction has some set of allowed operand types. It'll reject others.\n&quot;</span>
<span id="L21" class="LineNr"> 21 </span> <span class="Constant">&quot;The complete list of operand types: mod, subop, r32 (register), rm32\n&quot;</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Constant">&quot;(register or memory), scale, index, base, disp8, disp16, <a href='040---tests.cc.html#L82'>disp32</a>, imm8,\n&quot;</span>
<span id="L22" class="LineNr"> 22 </span> <span class="Constant">&quot;(register or memory), scale, index, base, disp8, disp16, <a href='040tests.cc.html#L82'>disp32</a>, imm8,\n&quot;</span>
<span id="L23" class="LineNr"> 23 </span> <span class="Constant">&quot;imm32.\n&quot;</span>
<span id="L24" class="LineNr"> 24 </span> <span class="Constant">&quot;Each of these has its own help page. Try reading 'bootstrap help mod' next.\n&quot;</span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">);</span>
@ -91,7 +91,7 @@ if ('onhashchange' in window) {
<span id="L31" class="LineNr"> 31 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L32" class="LineNr"> 32 </span>
<span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(code)</span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L34'>test_pack_immediate_constants</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr"> 34 </span><span class="Normal">void</span> <a href='032operands.cc.html#L34'>test_pack_immediate_constants</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr"> 35 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L36" class="LineNr"> 36 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L37" class="LineNr"> 37 </span> <span class="Constant">&quot;bb 0x2a/imm32\n&quot;</span>
@ -106,25 +106,25 @@ if ('onhashchange' in window) {
<span id="L46" class="LineNr"> 46 </span><span class="Comment">//: complete set of valid operand types</span>
<span id="L47" class="LineNr"> 47 </span>
<span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L49" class="LineNr"> 49 </span>set&lt;string&gt; <span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">;</span>
<span id="L49" class="LineNr"> 49 </span>set&lt;string&gt; <span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">;</span>
<span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
<span id="L51" class="LineNr"> 51 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;subop&quot;</span><span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;mod&quot;</span><span class="Delimiter">);</span>
<span id="L53" class="LineNr"> 53 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;base&quot;</span><span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;index&quot;</span><span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;scale&quot;</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;r32&quot;</span><span class="Delimiter">);</span>
<span id="L58" class="LineNr"> 58 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp8&quot;</span><span class="Delimiter">);</span>
<span id="L59" class="LineNr"> 59 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">);</span>
<span id="L60" class="LineNr"> 60 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">);</span>
<span id="L61" class="LineNr"> 61 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;imm8&quot;</span><span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;imm32&quot;</span><span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;subop&quot;</span><span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;mod&quot;</span><span class="Delimiter">);</span>
<span id="L53" class="LineNr"> 53 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;base&quot;</span><span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;index&quot;</span><span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;scale&quot;</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;r32&quot;</span><span class="Delimiter">);</span>
<span id="L58" class="LineNr"> 58 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp8&quot;</span><span class="Delimiter">);</span>
<span id="L59" class="LineNr"> 59 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">);</span>
<span id="L60" class="LineNr"> 60 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">);</span>
<span id="L61" class="LineNr"> 61 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;imm8&quot;</span><span class="Delimiter">);</span>
<span id="L62" class="LineNr"> 62 </span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;imm32&quot;</span><span class="Delimiter">);</span>
<span id="L63" class="LineNr"> 63 </span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Texts&quot;)</span>
<span id="L65" class="LineNr"> 65 </span><a href='032---operands.cc.html#L67'>init_operand_type_help</a><span class="Delimiter">();</span>
<span id="L65" class="LineNr"> 65 </span><a href='032operands.cc.html#L67'>init_operand_type_help</a><span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(code)</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L67'>init_operand_type_help</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L67" class="LineNr"> 67 </span><span class="Normal">void</span> <a href='032operands.cc.html#L67'>init_operand_type_help</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span><span class="Special"><a href='001help.cc.html#L53'>Help</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">,</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Constant">&quot;2-bit operand controlling the _addressing mode_ of many instructions,\n&quot;</span>
<span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;to determine how to compute the _effective address_ to look up memory at\n&quot;</span>
@ -137,7 +137,7 @@ if ('onhashchange' in window) {
<span id="L77" class="LineNr"> 77 </span> <span class="Constant">&quot;If mod = 1, effective address is usually* rm32 + disp8\n&quot;</span>
<span id="L78" class="LineNr"> 78 </span> <span class="Constant">&quot; (indirect mode with displacement).\n&quot;</span>
<span id="L79" class="LineNr"> 79 </span> <span class="Constant">&quot;If mod = 0, effective address is usually* rm32 (indirect mode).\n&quot;</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Constant">&quot;(* - The exception is when rm32 is '4'. Register 4 is the stack pointer (<a href='010---vm.cc.html#L14'>ESP</a>).\n&quot;</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Constant">&quot;(* - The exception is when rm32 is '4'. Register 4 is the stack pointer (<a href='010vm.cc.html#L14'>ESP</a>).\n&quot;</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Constant">&quot; Using it as an address gets more involved. For more details,\n&quot;</span>
<span id="L82" class="LineNr"> 82 </span> <span class="Constant">&quot; try reading the help pages for 'base', 'index' and 'scale'.)\n&quot;</span>
<span id="L83" class="LineNr"> 83 </span> <span class="Constant">&quot;\n&quot;</span>
@ -170,7 +170,7 @@ if ('onhashchange' in window) {
<span id="L110" class="LineNr">110 </span> <span class="Constant">&quot;Additional 3-bit operand (when 'rm32' is 4, unless 'mod' is 3) specifying the\n&quot;</span>
<span id="L111" class="LineNr">111 </span> <span class="Constant">&quot;register containing an address to look up.\n&quot;</span>
<span id="L112" class="LineNr">112 </span> <span class="Constant">&quot;This address may be further modified by 'index' and 'scale' operands.\n&quot;</span>
<span id="L113" class="LineNr">113 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or <a href='040---tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L113" class="LineNr">113 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or <a href='040tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L114" class="LineNr">114 </span> <span class="Constant">&quot;For complete details, spend some time with the IA-32 software developer's manual,\n&quot;</span>
<span id="L115" class="LineNr">115 </span> <span class="Constant">&quot;volume 2, table 2-3, \&quot;</span><span class="Constant">32</span>-bit addressing with the SIB byte\<span class="Constant">&quot;.\n&quot;</span>
<span id="L116" class="LineNr">116 </span> <span class="Constant">&quot;It is included in this repository as 'sib.pdf'.\n&quot;</span>
@ -178,7 +178,7 @@ if ('onhashchange' in window) {
<span id="L118" class="LineNr">118 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span><span class="Special"><a href='001help.cc.html#L53'>Help</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;index&quot;</span><span class="Delimiter">,</span>
<span id="L119" class="LineNr">119 </span> <span class="Constant">&quot;Optional 3-bit operand (when 'rm32' is 4 unless 'mod' is 3) that can be added to\n&quot;</span>
<span id="L120" class="LineNr">120 </span> <span class="Constant">&quot;the 'base' operand to compute the 'effective address' at which to look up memory.\n&quot;</span>
<span id="L121" class="LineNr">121 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or <a href='040---tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L121" class="LineNr">121 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or <a href='040tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L122" class="LineNr">122 </span> <span class="Constant">&quot;For complete details, spend some time with the IA-32 software developer's manual,\n&quot;</span>
<span id="L123" class="LineNr">123 </span> <span class="Constant">&quot;volume 2, table 2-3, \&quot;</span><span class="Constant">32</span>-bit addressing with the SIB byte\<span class="Constant">&quot;.\n&quot;</span>
<span id="L124" class="LineNr">124 </span> <span class="Constant">&quot;It is included in this repository as 'sib.pdf'.\n&quot;</span>
@ -187,7 +187,7 @@ if ('onhashchange' in window) {
<span id="L127" class="LineNr">127 </span> <span class="Constant">&quot;Optional 2-bit operand (when 'rm32' is 4 unless 'mod' is 3) that encodes a\n&quot;</span>
<span id="L128" class="LineNr">128 </span> <span class="Constant">&quot;power of 2 to be multiplied to the 'index' operand before adding the result to\n&quot;</span>
<span id="L129" class="LineNr">129 </span> <span class="Constant">&quot;the 'base' operand to compute the _effective address_ to operate on.\n&quot;</span>
<span id="L130" class="LineNr">130 </span> <span class="Constant">&quot; effective address = base + index * scale + displacement (disp8 or <a href='040---tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L130" class="LineNr">130 </span> <span class="Constant">&quot; effective address = base + index * scale + displacement (disp8 or <a href='040tests.cc.html#L82'>disp32</a>)\n&quot;</span>
<span id="L131" class="LineNr">131 </span> <span class="Constant">&quot;\n&quot;</span>
<span id="L132" class="LineNr">132 </span> <span class="Constant">&quot;When scale is 0, use index unmodified.\n&quot;</span>
<span id="L133" class="LineNr">133 </span> <span class="Constant">&quot;When scale is 1, multiply index by 2.\n&quot;</span>
@ -229,7 +229,7 @@ if ('onhashchange' in window) {
<span id="L169" class="LineNr">169 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- pack operands&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L170" class="LineNr">170 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L171" class="LineNr">171 </span> line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;packing instruction '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">with metadata</span><span class="Comment">*/</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L174" class="LineNr">174 </span> pack_operands<span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L175" class="LineNr">175 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction after packing: '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">without metadata</span><span class="Comment">*/</span>inst<span class="Delimiter">.</span>words<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
@ -238,15 +238,15 @@ if ('onhashchange' in window) {
<span id="L178" class="LineNr">178 </span>
<span id="L179" class="LineNr">179 </span><span class="Normal">void</span> pack_operands<span class="Delimiter">(</span>line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L180" class="LineNr">180 </span> <a href='011run.cc.html#L121'>line</a> new_inst<span class="Delimiter">;</span>
<span id="L181" class="LineNr">181 </span> <a href='032---operands.cc.html#L189'>add_opcodes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span> <a href='032---operands.cc.html#L199'>add_modrm_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L183" class="LineNr">183 </span> <a href='032---operands.cc.html#L225'>add_sib_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L184" class="LineNr">184 </span> <a href='032---operands.cc.html#L247'>add_disp_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span> <a href='032---operands.cc.html#L259'>add_imm_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L181" class="LineNr">181 </span> <a href='032operands.cc.html#L189'>add_opcodes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L182" class="LineNr">182 </span> <a href='032operands.cc.html#L199'>add_modrm_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L183" class="LineNr">183 </span> <a href='032operands.cc.html#L225'>add_sib_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L184" class="LineNr">184 </span> <a href='032operands.cc.html#L247'>add_disp_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span> <a href='032operands.cc.html#L259'>add_imm_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span>
<span id="L186" class="LineNr">186 </span> inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span>
<span id="L188" class="LineNr">188 </span>
<span id="L189" class="LineNr">189 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L189'>add_opcodes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L189" class="LineNr">189 </span><span class="Normal">void</span> <a href='032operands.cc.html#L189'>add_opcodes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L190" class="LineNr">190 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
<span id="L191" class="LineNr">191 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span> || in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f2&quot;</span> || in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;f3&quot;</span><span class="Delimiter">)</span>
<span id="L192" class="LineNr">192 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
@ -256,7 +256,7 @@ if ('onhashchange' in window) {
<span id="L196" class="LineNr">196 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>
<span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span>
<span id="L198" class="LineNr">198 </span>
<span id="L199" class="LineNr">199 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L199'>add_modrm_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span><span class="Normal">void</span> <a href='032operands.cc.html#L199'>add_modrm_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L200" class="LineNr">200 </span> <span class="Normal">uint8_t</span> mod=<span class="Constant">0</span><span class="Delimiter">,</span> reg_subop=<span class="Constant">0</span><span class="Delimiter">,</span> rm32=<span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L201" class="LineNr">201 </span> <span class="Normal">bool</span> emit = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L202" class="LineNr">202 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -279,10 +279,10 @@ if ('onhashchange' in window) {
<span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span>
<span id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>emit<span class="Delimiter">)</span>
<span id="L222" class="LineNr">222 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032---operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">((</span>mod &lt;&lt; <span class="Constant">6</span><span class="Delimiter">)</span> | <span class="Delimiter">(</span>reg_subop &lt;&lt; <span class="Constant">3</span><span class="Delimiter">)</span> | rm32<span class="Delimiter">));</span>
<span id="L222" class="LineNr">222 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">((</span>mod &lt;&lt; <span class="Constant">6</span><span class="Delimiter">)</span> | <span class="Delimiter">(</span>reg_subop &lt;&lt; <span class="Constant">3</span><span class="Delimiter">)</span> | rm32<span class="Delimiter">));</span>
<span id="L223" class="LineNr">223 </span><span class="Delimiter">}</span>
<span id="L224" class="LineNr">224 </span>
<span id="L225" class="LineNr">225 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L225'>add_sib_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L225" class="LineNr">225 </span><span class="Normal">void</span> <a href='032operands.cc.html#L225'>add_sib_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L226" class="LineNr">226 </span> <span class="Normal">uint8_t</span> scale=<span class="Constant">0</span><span class="Delimiter">,</span> index=<span class="Constant">0</span><span class="Delimiter">,</span> base=<span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L227" class="LineNr">227 </span> <span class="Normal">bool</span> emit = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L228" class="LineNr">228 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -301,10 +301,10 @@ if ('onhashchange' in window) {
<span id="L241" class="LineNr">241 </span> <span class="Delimiter">}</span>
<span id="L242" class="LineNr">242 </span> <span class="Delimiter">}</span>
<span id="L243" class="LineNr">243 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>emit<span class="Delimiter">)</span>
<span id="L244" class="LineNr">244 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032---operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">((</span>scale &lt;&lt; <span class="Constant">6</span><span class="Delimiter">)</span> | <span class="Delimiter">(</span>index &lt;&lt; <span class="Constant">3</span><span class="Delimiter">)</span> | base<span class="Delimiter">));</span>
<span id="L244" class="LineNr">244 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">((</span>scale &lt;&lt; <span class="Constant">6</span><span class="Delimiter">)</span> | <span class="Delimiter">(</span>index &lt;&lt; <span class="Constant">3</span><span class="Delimiter">)</span> | base<span class="Delimiter">));</span>
<span id="L245" class="LineNr">245 </span><span class="Delimiter">}</span>
<span id="L246" class="LineNr">246 </span>
<span id="L247" class="LineNr">247 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L247'>add_disp_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L247" class="LineNr">247 </span><span class="Normal">void</span> <a href='032operands.cc.html#L247'>add_disp_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L248" class="LineNr">248 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L249" class="LineNr">249 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L250" class="LineNr">250 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;disp8&quot;</span><span class="Delimiter">))</span>
@ -316,7 +316,7 @@ if ('onhashchange' in window) {
<span id="L256" class="LineNr">256 </span> <span class="Delimiter">}</span>
<span id="L257" class="LineNr">257 </span><span class="Delimiter">}</span>
<span id="L258" class="LineNr">258 </span>
<span id="L259" class="LineNr">259 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L259'>add_imm_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L259" class="LineNr">259 </span><span class="Normal">void</span> <a href='032operands.cc.html#L259'>add_imm_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; in<span class="Delimiter">,</span> line&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L260" class="LineNr">260 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L261" class="LineNr">261 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L262" class="LineNr">262 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm8&quot;</span><span class="Delimiter">))</span>
@ -328,35 +328,35 @@ if ('onhashchange' in window) {
<span id="L268" class="LineNr">268 </span>
<span id="L269" class="LineNr">269 </span><span class="Normal">void</span> emit_hex_bytes<span class="Delimiter">(</span>line&amp; out<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; w<span class="Delimiter">,</span> <span class="Normal">int</span> num<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L270" class="LineNr">270 </span> assert<span class="Delimiter">(</span>num &lt;= <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">bool</span> is_number = <a href='032---operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L271" class="LineNr">271 </span> <span class="Normal">bool</span> is_number = <a href='032operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L272" class="LineNr">272 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>num == <span class="Constant">1</span> || !is_number<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L273" class="LineNr">273 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>w<span class="Delimiter">);</span> <span class="Comment">// preserve existing metadata</span>
<span id="L274" class="LineNr">274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_number<span class="Delimiter">)</span>
<span id="L275" class="LineNr">275 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='032---operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span><a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">));</span>
<span id="L275" class="LineNr">275 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='032operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span><a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">));</span>
<span id="L276" class="LineNr">276 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L277" class="LineNr">277 </span> <span class="Delimiter">}</span>
<span id="L278" class="LineNr">278 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span><a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">)),</span> num<span class="Delimiter">);</span>
<span id="L278" class="LineNr">278 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span><a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">)),</span> num<span class="Delimiter">);</span>
<span id="L279" class="LineNr">279 </span><span class="Delimiter">}</span>
<span id="L280" class="LineNr">280 </span>
<span id="L281" class="LineNr">281 </span><span class="Normal">void</span> emit_hex_bytes<span class="Delimiter">(</span>line&amp; out<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> val<span class="Delimiter">,</span> <span class="Normal">int</span> num<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L282" class="LineNr">282 </span> assert<span class="Delimiter">(</span>num &lt;= <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L283" class="LineNr">283 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; num<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L284" class="LineNr">284 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032---operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">(</span>val &amp; <span class="Constant">0xff</span><span class="Delimiter">));</span>
<span id="L284" class="LineNr">284 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='032operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">(</span>val &amp; <span class="Constant">0xff</span><span class="Delimiter">));</span>
<span id="L285" class="LineNr">285 </span> val = val &gt;&gt; <span class="Constant">8</span><span class="Delimiter">;</span>
<span id="L286" class="LineNr">286 </span> <span class="Delimiter">}</span>
<span id="L287" class="LineNr">287 </span><span class="Delimiter">}</span>
<span id="L288" class="LineNr">288 </span>
<span id="L289" class="LineNr">289 </span><a href='011run.cc.html#L127'>word</a> <a href='032---operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L289" class="LineNr">289 </span><a href='011run.cc.html#L127'>word</a> <a href='032operands.cc.html#L289'>hex_byte_text</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L290" class="LineNr">290 </span> <a href='011run.cc.html#L127'>word</a> result<span class="Delimiter">;</span>
<span id="L291" class="LineNr">291 </span> result<span class="Delimiter">.</span>data = <a href='032---operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L291" class="LineNr">291 </span> result<span class="Delimiter">.</span>data = <a href='032operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L292" class="LineNr">292 </span> result<span class="Delimiter">.</span>original = result<span class="Delimiter">.</span>data+<span class="Constant">&quot;/auto&quot;</span><span class="Delimiter">;</span>
<span id="L293" class="LineNr">293 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span>
<span id="L295" class="LineNr">295 </span>
<span id="L296" class="LineNr">296 </span>string <a href='032---operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L296" class="LineNr">296 </span>string <a href='032operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span><span class="Normal">uint8_t</span> val<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L297" class="LineNr">297 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L298" class="LineNr">298 </span> <span class="Comment">// uint8_t prints without padding, but int8_t will expand to 32 bits again</span>
<span id="L299" class="LineNr">299 </span> out &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L299" class="LineNr">299 </span> out &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span>
<span id="L300" class="LineNr">300 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L301" class="LineNr">301 </span><span class="Delimiter">}</span>
<span id="L302" class="LineNr">302 </span>
@ -370,7 +370,7 @@ if ('onhashchange' in window) {
<span id="L310" class="LineNr">310 </span><span class="Delimiter">}</span>
<span id="L311" class="LineNr">311 </span>
<span id="L312" class="LineNr">312 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
<span id="L313" class="LineNr">313 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L313'>test_preserve_metadata_when_emitting_single_byte</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L313" class="LineNr">313 </span><span class="Normal">void</span> <a href='032operands.cc.html#L313'>test_preserve_metadata_when_emitting_single_byte</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L314" class="LineNr">314 </span> <a href='011run.cc.html#L127'>word</a> in<span class="Delimiter">;</span>
<span id="L315" class="LineNr">315 </span> in<span class="Delimiter">.</span>data = <span class="Constant">&quot;f0&quot;</span><span class="Delimiter">;</span>
<span id="L316" class="LineNr">316 </span> in<span class="Delimiter">.</span>original = <span class="Constant">&quot;f0/foo&quot;</span><span class="Delimiter">;</span>
@ -381,7 +381,7 @@ if ('onhashchange' in window) {
<span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
<span id="L322" class="LineNr">322 </span>
<span id="L323" class="LineNr">323 </span><span class="Delimiter">:(code)</span>
<span id="L324" class="LineNr">324 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L324'>test_pack_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L324" class="LineNr">324 </span><span class="Normal">void</span> <a href='032operands.cc.html#L324'>test_pack_disp8</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L325" class="LineNr">325 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L326" class="LineNr">326 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L327" class="LineNr">327 </span> <span class="Constant">&quot;74 2/disp8\n&quot;</span> <span class="Comment">// jump 2 bytes away if ZF is set</span>
@ -392,7 +392,7 @@ if ('onhashchange' in window) {
<span id="L332" class="LineNr">332 </span> <span class="Delimiter">);</span>
<span id="L333" class="LineNr">333 </span><span class="Delimiter">}</span>
<span id="L334" class="LineNr">334 </span>
<span id="L335" class="LineNr">335 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L335'>test_pack_disp8_negative</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L335" class="LineNr">335 </span><span class="Normal">void</span> <a href='032operands.cc.html#L335'>test_pack_disp8_negative</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L336" class="LineNr">336 </span> transform<span class="Delimiter">(</span>
<span id="L337" class="LineNr">337 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L338" class="LineNr">338 </span> <span class="Comment">// running this will cause an infinite loop</span>
@ -413,7 +413,7 @@ if ('onhashchange' in window) {
<span id="L353" class="LineNr">353 </span> transform<span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L354" class="LineNr">354 </span><span class="Delimiter">}</span>
<span id="L355" class="LineNr">355 </span>
<span id="L356" class="LineNr">356 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L356'>test_pack_modrm_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L356" class="LineNr">356 </span><span class="Normal">void</span> <a href='032operands.cc.html#L356'>test_pack_modrm_imm32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L357" class="LineNr">357 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L358" class="LineNr">358 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L359" class="LineNr">359 </span> <span class="Comment">// instruction effective address operand displacement immediate\n&quot;</span>
@ -427,7 +427,7 @@ if ('onhashchange' in window) {
<span id="L367" class="LineNr">367 </span> <span class="Delimiter">);</span>
<span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span>
<span id="L369" class="LineNr">369 </span>
<span id="L370" class="LineNr">370 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L370'>test_pack_imm32_large</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L370" class="LineNr">370 </span><span class="Normal">void</span> <a href='032operands.cc.html#L370'>test_pack_imm32_large</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L371" class="LineNr">371 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L372" class="LineNr">372 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L373" class="LineNr">373 </span> <span class="Constant">&quot;b9 0x080490a7/imm32\n&quot;</span>
@ -438,7 +438,7 @@ if ('onhashchange' in window) {
<span id="L378" class="LineNr">378 </span> <span class="Delimiter">);</span>
<span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span>
<span id="L380" class="LineNr">380 </span>
<span id="L381" class="LineNr">381 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L381'>test_pack_immediate_constants_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L381" class="LineNr">381 </span><span class="Normal">void</span> <a href='032operands.cc.html#L381'>test_pack_immediate_constants_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L382" class="LineNr">382 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L383" class="LineNr">383 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L384" class="LineNr">384 </span> <span class="Constant">&quot;b9 0x2a/imm32\n&quot;</span>
@ -450,7 +450,7 @@ if ('onhashchange' in window) {
<span id="L390" class="LineNr">390 </span> <span class="Delimiter">);</span>
<span id="L391" class="LineNr">391 </span><span class="Delimiter">}</span>
<span id="L392" class="LineNr">392 </span>
<span id="L393" class="LineNr">393 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L393'>test_pack_silently_ignores_non_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L393" class="LineNr">393 </span><span class="Normal">void</span> <a href='032operands.cc.html#L393'>test_pack_silently_ignores_non_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L394" class="LineNr">394 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L395" class="LineNr">395 </span> transform<span class="Delimiter">(</span>
<span id="L396" class="LineNr">396 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -463,7 +463,7 @@ if ('onhashchange' in window) {
<span id="L403" class="LineNr">403 </span> <span class="Delimiter">);</span>
<span id="L404" class="LineNr">404 </span><span class="Delimiter">}</span>
<span id="L405" class="LineNr">405 </span>
<span id="L406" class="LineNr">406 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L406'>test_pack_flags_bad_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L406" class="LineNr">406 </span><span class="Normal">void</span> <a href='032operands.cc.html#L406'>test_pack_flags_bad_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L407" class="LineNr">407 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L408" class="LineNr">408 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L409" class="LineNr">409 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -474,7 +474,7 @@ if ('onhashchange' in window) {
<span id="L414" class="LineNr">414 </span> <span class="Delimiter">);</span>
<span id="L415" class="LineNr">415 </span><span class="Delimiter">}</span>
<span id="L416" class="LineNr">416 </span>
<span id="L417" class="LineNr">417 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L417'>test_pack_flags_uppercase_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L417" class="LineNr">417 </span><span class="Normal">void</span> <a href='032operands.cc.html#L417'>test_pack_flags_uppercase_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L418" class="LineNr">418 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L419" class="LineNr">419 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L420" class="LineNr">420 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -487,15 +487,15 @@ if ('onhashchange' in window) {
<span id="L427" class="LineNr">427 </span>
<span id="L428" class="LineNr">428 </span><span class="SalientComment">//:: helpers</span>
<span id="L429" class="LineNr">429 </span>
<span id="L430" class="LineNr">430 </span><span class="Normal">bool</span> <a href='032---operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L430" class="LineNr">430 </span><span class="Normal">bool</span> <a href='032operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L431" class="LineNr">431 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L432" class="LineNr">432 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span>
<span id="L433" class="LineNr">433 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L434" class="LineNr">434 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L435" class="LineNr">435 </span><span class="Delimiter">}</span>
<span id="L436" class="LineNr">436 </span>
<span id="L437" class="LineNr">437 </span><span class="Normal">bool</span> <a href='032---operands.cc.html#L437'>is_hex_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">))</span>
<span id="L437" class="LineNr">437 </span><span class="Normal">bool</span> <a href='032operands.cc.html#L437'>is_hex_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; curr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">))</span>
<span id="L439" class="LineNr">439 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L440" class="LineNr">440 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span>
<span id="L441" class="LineNr">441 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
@ -504,9 +504,9 @@ if ('onhashchange' in window) {
<span id="L444" class="LineNr">444 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L445" class="LineNr">445 </span><span class="Delimiter">}</span>
<span id="L446" class="LineNr">446 </span>
<span id="L447" class="LineNr">447 </span><span class="Normal">bool</span> <a href='032---operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; <a href='011run.cc.html#L127'>word</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L447" class="LineNr">447 </span><span class="Normal">bool</span> <a href='032operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; <a href='011run.cc.html#L127'>word</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L448" class="LineNr">448 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">.</span>metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span>
<span id="L449" class="LineNr">449 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != <span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>end<span class="Delimiter">())</span>
<span id="L449" class="LineNr">449 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> != <span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>end<span class="Delimiter">())</span>
<span id="L450" class="LineNr">450 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L451" class="LineNr">451 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L452" class="LineNr">452 </span><span class="Delimiter">}</span>
@ -529,7 +529,7 @@ if ('onhashchange' in window) {
<span id="L469" class="LineNr">469 </span> <span class="Normal">bool</span> metadata_found = <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L470" class="LineNr">470 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L471" class="LineNr">471 </span> <span class="Normal">const</span> string&amp; curr = w<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L472" class="LineNr">472 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> == <span class="Special"><a href='032---operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// ignore unrecognized metadata</span>
<span id="L472" class="LineNr">472 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> == <span class="Special"><a href='032operands.cc.html#L49'>Instruction_operands</a></span><span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// ignore unrecognized metadata</span>
<span id="L473" class="LineNr">473 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>metadata_found<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L474" class="LineNr">474 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>original &lt;&lt; <span class="Constant">&quot;' has conflicting operand types; it should have only one\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L475" class="LineNr">475 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
@ -547,7 +547,7 @@ if ('onhashchange' in window) {
<span id="L487" class="LineNr">487 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
<span id="L488" class="LineNr">488 </span><span class="Delimiter">}</span>
<span id="L489" class="LineNr">489 </span>
<span id="L490" class="LineNr">490 </span><span class="Normal">bool</span> <a href='032---operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L490" class="LineNr">490 </span><span class="Normal">bool</span> <a href='032operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L491" class="LineNr">491 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L492" class="LineNr">492 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">'-'</span> || s<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">'+'</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L493" class="LineNr">493 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>isdigit<span class="Delimiter">(</span>s<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span class="Comment">// includes '0x' prefix</span>
@ -564,7 +564,7 @@ if ('onhashchange' in window) {
<span id="L504" class="LineNr">504 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L505" class="LineNr">505 </span><span class="Delimiter">}</span>
<span id="L506" class="LineNr">506 </span>
<span id="L507" class="LineNr">507 </span><span class="Normal">int32_t</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L507" class="LineNr">507 </span><span class="Normal">int32_t</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L508" class="LineNr">508 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L509" class="LineNr">509 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011run.cc.html#L449'>contains_uppercase</a><span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L510" class="LineNr">510 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;uppercase hex not allowed: &quot;</span> &lt;&lt; s &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
@ -590,13 +590,13 @@ if ('onhashchange' in window) {
<span id="L530" class="LineNr">530 </span> <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">int32_t</span>&gt;<span class="Delimiter">(</span>uresult<span class="Delimiter">);</span>
<span id="L531" class="LineNr">531 </span><span class="Delimiter">}</span>
<span id="L532" class="LineNr">532 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
<span id="L533" class="LineNr">533 </span><span class="Normal">void</span> <a href='032---operands.cc.html#L533'>test_parse_int</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L534" class="LineNr">534 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0&quot;</span><span class="Delimiter">));</span>
<span id="L535" class="LineNr">535 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0x0&quot;</span><span class="Delimiter">));</span>
<span id="L536" class="LineNr">536 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0x0&quot;</span><span class="Delimiter">));</span>
<span id="L537" class="LineNr">537 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">16</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;10&quot;</span><span class="Delimiter">));</span> <span class="Comment">// hex always</span>
<span id="L538" class="LineNr">538 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;-1&quot;</span><span class="Delimiter">));</span>
<span id="L539" class="LineNr">539 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">,</span> <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0xffffffff&quot;</span><span class="Delimiter">));</span>
<span id="L533" class="LineNr">533 </span><span class="Normal">void</span> <a href='032operands.cc.html#L533'>test_parse_int</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L534" class="LineNr">534 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0&quot;</span><span class="Delimiter">));</span>
<span id="L535" class="LineNr">535 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0x0&quot;</span><span class="Delimiter">));</span>
<span id="L536" class="LineNr">536 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0x0&quot;</span><span class="Delimiter">));</span>
<span id="L537" class="LineNr">537 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span><span class="Constant">16</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;10&quot;</span><span class="Delimiter">));</span> <span class="Comment">// hex always</span>
<span id="L538" class="LineNr">538 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;-1&quot;</span><span class="Delimiter">));</span>
<span id="L539" class="LineNr">539 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>-<span class="Constant">1</span><span class="Delimiter">,</span> <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span><span class="Constant">&quot;0xffffffff&quot;</span><span class="Delimiter">));</span>
<span id="L540" class="LineNr">540 </span><span class="Delimiter">}</span>
</pre>
</body>

View File

@ -334,7 +334,7 @@ if ('onhashchange' in window) {
<span id="L273" class="LineNr">273 </span><span class="Comment">//: Many instructions can be checked just by comparing bitvectors.</span>
<span id="L274" class="LineNr">274 </span>
<span id="L275" class="LineNr">275 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L275'>compare_bitvector</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; maybe_op_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L276" class="LineNr">276 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='033check_operands.cc.html#L311'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L276" class="LineNr">276 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='033check_operands.cc.html#L311'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L277" class="LineNr">277 </span> <span class="Normal">uint8_t</span> bitvector = <a href='033check_operands.cc.html#L301'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L278" class="LineNr">278 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L279" class="LineNr">279 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>bitvector == expected<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// all good with this instruction</span>
@ -353,9 +353,9 @@ if ('onhashchange' in window) {
<span id="L292" class="LineNr">292 </span>
<span id="L293" class="LineNr">293 </span>string <a href='033check_operands.cc.html#L293'>maybe_name</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L294" class="LineNr">294 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L296" class="LineNr">296 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L297" class="LineNr">297 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L342'>Name</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L298" class="LineNr">298 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L299" class="LineNr">299 </span><span class="Delimiter">}</span>
<span id="L300" class="LineNr">300 </span>
@ -436,7 +436,7 @@ if ('onhashchange' in window) {
<span id="L375" class="LineNr">375 </span><span class="Delimiter">}</span>
<span id="L376" class="LineNr">376 </span>
<span id="L377" class="LineNr">377 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L377'>check_operands_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L378" class="LineNr">378 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L378" class="LineNr">378 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L379" class="LineNr">379 </span> <a href='033check_operands.cc.html#L437'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L380" class="LineNr">380 </span> <a href='033check_operands.cc.html#L437'>check_operand_metadata_present</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">,</span> op<span class="Delimiter">);</span>
<span id="L381" class="LineNr">381 </span> <span class="Comment">// no check for r32; some instructions don't use it; just assume it's 0 if missing</span>
@ -462,15 +462,15 @@ if ('onhashchange' in window) {
<span id="L401" class="LineNr">401 </span><span class="Comment">// same as compare_bitvector, with one additional exception for modrm-based</span>
<span id="L402" class="LineNr">402 </span><span class="Comment">// instructions: they may use an extra displacement on occasion</span>
<span id="L403" class="LineNr">403 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L403'>compare_bitvector_modrm</a><span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">uint8_t</span> expected<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; maybe_op_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L404" class="LineNr">404 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='033check_operands.cc.html#L311'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L404" class="LineNr">404 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L430'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &amp;&amp; <a href='033check_operands.cc.html#L311'>has_operands</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// deliberately programming in raw hex; we'll raise a warning elsewhere</span>
<span id="L405" class="LineNr">405 </span> <span class="Normal">uint8_t</span> bitvector = <a href='033check_operands.cc.html#L301'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
<span id="L406" class="LineNr">406 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// duplicate operand type</span>
<span id="L407" class="LineNr">407 </span> <span class="Comment">// update 'expected' bitvector for the additional exception</span>
<span id="L408" class="LineNr">408 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L409" class="LineNr">409 </span> <span class="Normal">int32_t</span> mod = <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L409" class="LineNr">409 </span> <span class="Normal">int32_t</span> mod = <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;mod&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">);</span>
<span id="L410" class="LineNr">410 </span> <span class="Normal">switch</span> <span class="Delimiter">(</span>mod<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L411" class="LineNr">411 </span> <span class="Normal">case</span> <span class="Constant">0</span>:
<span id="L412" class="LineNr">412 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">)</span> &amp;&amp; <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">)</span> == <span class="Constant">5</span><span class="Delimiter">)</span>
<span id="L412" class="LineNr">412 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">)</span> &amp;&amp; <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>metadata<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> <span class="Constant">&quot;rm32&quot;</span><span class="Delimiter">).</span>data<span class="Delimiter">)</span> == <span class="Constant">5</span><span class="Delimiter">)</span>
<span id="L413" class="LineNr">413 </span> expected |= <span class="Delimiter">(</span><span class="Constant">1</span>&lt;&lt;DISP32<span class="Delimiter">);</span>
<span id="L414" class="LineNr">414 </span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L415" class="LineNr">415 </span> <span class="Normal">case</span> <span class="Constant">1</span>:
@ -506,7 +506,7 @@ if ('onhashchange' in window) {
<span id="L445" class="LineNr">445 </span><span class="Delimiter">}</span>
<span id="L446" class="LineNr">446 </span>
<span id="L447" class="LineNr">447 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L447'>test_modrm_with_displacement</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L448" class="LineNr">448 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L448" class="LineNr">448 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u = <span class="Constant">0x1</span><span class="Delimiter">;</span>
<span id="L449" class="LineNr">449 </span> transform<span class="Delimiter">(</span>
<span id="L450" class="LineNr">450 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L451" class="LineNr">451 </span> <span class="Comment">// just avoid null pointer</span>
@ -533,7 +533,7 @@ if ('onhashchange' in window) {
<span id="L472" class="LineNr">472 </span> <span class="Constant">&quot;8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX\n&quot;</span> <span class="Comment">// missing disp32</span>
<span id="L473" class="LineNr">473 </span> <span class="Delimiter">);</span>
<span id="L474" class="LineNr">474 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L475" class="LineNr">475 </span> <span class="Constant">&quot;error: '8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX' (copy rm32 to r32): missing <a href='040---tests.cc.html#L82'>disp32</a> operand\n&quot;</span>
<span id="L475" class="LineNr">475 </span> <span class="Constant">&quot;error: '8b/copy 0/mod/indirect 5/rm32/.disp32 2/r32/EDX' (copy rm32 to r32): missing <a href='040tests.cc.html#L82'>disp32</a> operand\n&quot;</span>
<span id="L476" class="LineNr">476 </span> <span class="Delimiter">);</span>
<span id="L477" class="LineNr">477 </span><span class="Delimiter">}</span>
<span id="L478" class="LineNr">478 </span>
@ -651,7 +651,7 @@ if ('onhashchange' in window) {
<span id="L590" class="LineNr">590 </span> <span class="Constant">&quot;59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP\n&quot;</span>
<span id="L591" class="LineNr">591 </span> <span class="Delimiter">);</span>
<span id="L592" class="LineNr">592 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L593" class="LineNr">593 </span> <span class="Constant">&quot;error: '59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP' (<a href='013direct_addressing.cc.html#L1270'>pop</a> top of stack to <a href='010---vm.cc.html#L11'>ECX</a>): unexpected modrm operand\n&quot;</span>
<span id="L593" class="LineNr">593 </span> <span class="Constant">&quot;error: '59/pop-to-ECX 3/mod/direct 1/rm32/ECX 4/r32/ESP' (<a href='013direct_addressing.cc.html#L1270'>pop</a> top of stack to <a href='010vm.cc.html#L11'>ECX</a>): unexpected modrm operand\n&quot;</span>
<span id="L594" class="LineNr">594 </span> <span class="Delimiter">);</span>
<span id="L595" class="LineNr">595 </span><span class="Delimiter">}</span>
<span id="L596" class="LineNr">596 </span>
@ -664,7 +664,7 @@ if ('onhashchange' in window) {
<span id="L603" class="LineNr">603 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L604" class="LineNr">604 </span> <span class="Delimiter">}</span>
<span id="L605" class="LineNr">605 </span> <a href='011run.cc.html#L127'>word</a> op = <a href='033check_operands.cc.html#L41'>preprocess_op</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span>
<span id="L606" class="LineNr">606 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L606" class="LineNr">606 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L607" class="LineNr">607 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;unknown 2-byte opcode '0f &quot;</span> &lt;&lt; op<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L608" class="LineNr">608 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L609" class="LineNr">609 </span> <span class="Delimiter">}</span>
@ -682,7 +682,7 @@ if ('onhashchange' in window) {
<span id="L621" class="LineNr">621 </span> <span class="Constant">&quot; 0f 84 # jmp if ZF to ??\n&quot;</span>
<span id="L622" class="LineNr">622 </span> <span class="Delimiter">);</span>
<span id="L623" class="LineNr">623 </span> <a href='003trace.cc.html#L292'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L624" class="LineNr">624 </span> <span class="Constant">&quot;error: '0f 84' (jump <a href='040---tests.cc.html#L82'>disp32</a> bytes away if equal, if <a href='010---vm.cc.html#L80'>ZF</a> is set): missing <a href='040---tests.cc.html#L82'>disp32</a> operand\n&quot;</span>
<span id="L624" class="LineNr">624 </span> <span class="Constant">&quot;error: '0f 84' (jump <a href='040tests.cc.html#L82'>disp32</a> bytes away if equal, if <a href='010vm.cc.html#L80'>ZF</a> is set): missing <a href='040tests.cc.html#L82'>disp32</a> operand\n&quot;</span>
<span id="L625" class="LineNr">625 </span> <span class="Delimiter">);</span>
<span id="L626" class="LineNr">626 </span><span class="Delimiter">}</span>
<span id="L627" class="LineNr">627 </span>
@ -741,9 +741,9 @@ if ('onhashchange' in window) {
<span id="L680" class="LineNr">680 </span>
<span id="L681" class="LineNr">681 </span>string <a href='033check_operands.cc.html#L681'>maybe_name_0f</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L682" class="LineNr">682 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_hex_byte<span class="Delimiter">(</span>op<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L683" class="LineNr">683 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L683" class="LineNr">683 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L684" class="LineNr">684 </span> <span class="Comment">// strip stuff in parens from the name</span>
<span id="L685" class="LineNr">685 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L685" class="LineNr">685 </span> <span class="Normal">const</span> string&amp; s = get<span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L343'>Name_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L686" class="LineNr">686 </span> <span class="Identifier">return</span> <span class="Constant">&quot; (&quot;</span>+s<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> s<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">&quot; (&quot;</span><span class="Delimiter">))</span>+<span class="Constant">')'</span><span class="Delimiter">;</span>
<span id="L687" class="LineNr">687 </span><span class="Delimiter">}</span>
<span id="L688" class="LineNr">688 </span>

View File

@ -105,7 +105,7 @@ if ('onhashchange' in window) {
<span id="L45" class="LineNr"> 45 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;::iterator p = <span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='034check_operand_bounds.cc.html#L15'>Operand_bound</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_operand_metadata<span class="Delimiter">(</span>w<span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr"> 47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!looks_like_hex_int<span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// later transforms are on their own to do their own bounds checking</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">int32_t</span> x = <a href='032---operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Normal">int32_t</span> x = <a href='032operands.cc.html#L507'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x &gt;= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;disp8&quot;</span> || p<span class="Delimiter">-&gt;</span>first == <span class="Constant">&quot;disp16&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span>x<span class="Delimiter">)</span> &gt;= p<span class="Delimiter">-&gt;</span>second/<span class="Constant">2</span><span class="Delimiter">)</span>

View File

@ -96,10 +96,10 @@ if ('onhashchange' in window) {
<span id="L38" class="LineNr">38 </span> <span class="Comment">// valid address for user space, so assume we're creating a real ELF binary, not just running a test</span>
<span id="L39" class="LineNr">39 </span> curr<span class="Delimiter">.</span>start &amp;= <span class="Constant">0xfffff000</span><span class="Delimiter">;</span> <span class="Comment">// same number of zeros as the p_align used when emitting the ELF binary</span>
<span id="L40" class="LineNr">40 </span> curr<span class="Delimiter">.</span>start |= <span class="Delimiter">(</span>p_offset &amp; <span class="Constant">0xfff</span><span class="Delimiter">);</span>
<span id="L41" class="LineNr">41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; begins at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; curr<span class="Delimiter">.</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr">41 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; begins at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; curr<span class="Delimiter">.</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L42" class="LineNr">42 </span> <span class="Delimiter">}</span>
<span id="L43" class="LineNr">43 </span> p_offset += size_of<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L44" class="LineNr">44 </span> assert<span class="Delimiter">(</span>p_offset &lt; <a href='010---vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span> <span class="Comment">// for now we get less and less available space in each successive segment</span>
<span id="L44" class="LineNr">44 </span> assert<span class="Delimiter">(</span>p_offset &lt; <a href='010vm.cc.html#L89'>SEGMENT_ALIGNMENT</a><span class="Delimiter">);</span> <span class="Comment">// for now we get less and less available space in each successive segment</span>
<span id="L45" class="LineNr">45 </span> <span class="Delimiter">}</span>
<span id="L46" class="LineNr">46 </span><span class="Delimiter">}</span>
<span id="L47" class="LineNr">47 </span>

View File

@ -96,7 +96,7 @@ if ('onhashchange' in window) {
<span id="L37" class="LineNr"> 37 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;run: 0x00000001 opcode: 05&quot;</span><span class="Delimiter">);</span>
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(before &quot;End <a href='032---operands.cc.html#L490'>looks_like_hex_int</a>(s) Detectors&quot;)</span>
<span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(before &quot;End <a href='032operands.cc.html#L490'>looks_like_hex_int</a>(s) Detectors&quot;)</span>
<span id="L41" class="LineNr"> 41 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">)</span> == <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L42" class="LineNr"> 42 </span>
<span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(code)</span>
@ -192,7 +192,7 @@ if ('onhashchange' in window) {
<span id="L133" class="LineNr">133 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L134" class="LineNr">134 </span> <span class="Normal">const</span> line&amp; inst = code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L135" class="LineNr">135 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='036labels.cc.html#L184'>Source_lines_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">()</span> &amp;&amp; !inst<span class="Delimiter">.</span>original<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; <span class="Comment">/*</span><span class="Comment">not a label</span><span class="Comment">*/</span> *inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>data<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> != <span class="Constant">':'</span><span class="Delimiter">)</span>
<span id="L136" class="LineNr">136 </span> <span class="Special"><a href='036labels.cc.html#L184'>Source_lines_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>original &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L136" class="LineNr">136 </span> <span class="Special"><a href='036labels.cc.html#L184'>Source_lines_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; inst<span class="Delimiter">.</span>original &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">const</span> word&amp; curr = inst<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span> <span class="Comment">// hack: if we have any operand metadata left after previous transforms,</span>
@ -219,12 +219,12 @@ if ('onhashchange' in window) {
<span id="L160" class="LineNr">160 </span> <span class="Comment">// ensure labels look sufficiently different from raw hex</span>
<span id="L161" class="LineNr">161 </span> <a href='036labels.cc.html#L84'>check_valid_name</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span>
<span id="L162" class="LineNr">162 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L264'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">))</span>
<span id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L447'>contains_any_operand_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">))</span>
<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': label definition (':') not allowed in operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L165" class="LineNr">165 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L166" class="LineNr">166 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': labels can only be the first <a href='011run.cc.html#L127'>word</a> in a line.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L167" class="LineNr">167 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L168" class="LineNr">168 </span> <span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L168" class="LineNr">168 </span> <span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>code<span class="Delimiter">.</span>start + current_byte<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">' '</span> &lt;&lt; label &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span>byte_index<span class="Delimiter">,</span> label<span class="Delimiter">)</span> &amp;&amp; label != <span class="Constant">&quot;Entry&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L170" class="LineNr">170 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;duplicate label '&quot;</span> &lt;&lt; label &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L171" class="LineNr">171 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>

View File

@ -118,13 +118,13 @@ if ('onhashchange' in window) {
<span id="L57" class="LineNr"> 57 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>j &gt; <span class="Constant">0</span><span class="Delimiter">)</span>
<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;': global variable names can only be the first <a href='011run.cc.html#L127'>word</a> in a line.\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span><span class="Delimiter">.</span>is_open<span class="Delimiter">())</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; variable &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Special"><a href='036labels.cc.html#L183'>Labels_file</a></span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; <span class="Constant">' '</span> &lt;&lt; variable &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L228'>raise</a> &lt;&lt; <span class="Constant">&quot;duplicate global '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L64" class="LineNr"> 64 </span> <span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span>address<span class="Delimiter">,</span> variable<span class="Delimiter">,</span> current_address<span class="Delimiter">);</span>
<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;global variable '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;' is at address 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; end<span class="Delimiter">();</span>
<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;global variable '&quot;</span> &lt;&lt; variable &lt;&lt; <span class="Constant">&quot;' is at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; current_address &lt;&lt; end<span class="Delimiter">();</span>
<span id="L67" class="LineNr"> 67 </span> <span class="Comment">// no modifying current_address; global variable definitions won't be in the final binary</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Delimiter">}</span>
<span id="L69" class="LineNr"> 69 </span> <span class="Delimiter">}</span>
@ -179,7 +179,7 @@ if ('onhashchange' in window) {
<span id="L118" class="LineNr">118 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L119" class="LineNr">119 </span> <span class="Normal">const</span> word&amp; curr = l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L120" class="LineNr">120 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L121" class="LineNr">121 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032---operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L121" class="LineNr">121 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='032operands.cc.html#L490'>looks_like_hex_int</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L122" class="LineNr">122 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm32&quot;</span><span class="Delimiter">))</span>
<span id="L123" class="LineNr">123 </span> emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L124" class="LineNr">124 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>curr<span class="Delimiter">,</span> <span class="Constant">&quot;imm16&quot;</span><span class="Delimiter">))</span>
@ -201,7 +201,7 @@ if ('onhashchange' in window) {
<span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span>
<span id="L141" class="LineNr">141 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span> <span class="Delimiter">}</span>
<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot; maps to &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; curr<span class="Delimiter">.</span>data &lt;&lt; <span class="Constant">&quot; maps to &quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L144" class="LineNr">144 </span> emit_hex_bytes<span class="Delimiter">(</span>new_l<span class="Delimiter">,</span> get<span class="Delimiter">(</span>address<span class="Delimiter">,</span> curr<span class="Delimiter">.</span>data<span class="Delimiter">),</span> <span class="Constant">4</span><span class="Delimiter">);</span>
<span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span>
<span id="L146" class="LineNr">146 </span> l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 038---literal_strings.cc</title>
<title>Mu - 038literal_strings.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
@ -56,14 +56,14 @@ if ('onhashchange' in window) {
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/038---literal_strings.cc'>https://github.com/akkartik/mu/blob/master/038---literal_strings.cc</a>
<a href='https://github.com/akkartik/mu/blob/master/038literal_strings.cc'>https://github.com/akkartik/mu/blob/master/038literal_strings.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Allow instructions to mention literals directly.</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//:</span>
<span id="L3" class="LineNr"> 3 </span><span class="Comment">//: This layer will transparently move them to the global segment (assumed to</span>
<span id="L4" class="LineNr"> 4 </span><span class="Comment">//: always be the second segment).</span>
<span id="L5" class="LineNr"> 5 </span>
<span id="L6" class="LineNr"> 6 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L6'>test_transform_literal_string</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L6" class="LineNr"> 6 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L6'>test_transform_literal_string</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L7" class="LineNr"> 7 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L8" class="LineNr"> 8 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L9" class="LineNr"> 9 </span> <span class="Constant">&quot;b8/copy \&quot;</span>test\<span class="Constant">&quot;/imm32\n&quot;</span>
@ -80,14 +80,14 @@ if ('onhashchange' in window) {
<span id="L20" class="LineNr"> 20 </span><span class="Comment">//: knows about labels and global variables and will emit them for previous</span>
<span id="L21" class="LineNr"> 21 </span><span class="Comment">//: layers to transform.</span>
<span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(after &quot;Begin Transforms&quot;)</span>
<span id="L23" class="LineNr"> 23 </span><span class="Special"><a href='031transforms.cc.html#L4'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='038---literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">);</span>
<span id="L23" class="LineNr"> 23 </span><span class="Special"><a href='031transforms.cc.html#L4'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='038literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">);</span>
<span id="L24" class="LineNr"> 24 </span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">int</span> <span class="Special">Next_auto_global</span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L28" class="LineNr"> 28 </span><span class="Special">Next_auto_global</span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(code)</span>
<span id="L30" class="LineNr"> 30 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L30" class="LineNr"> 30 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L30'>transform_literal_strings</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- move literal strings to data segment&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L32" class="LineNr"> 32 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L33" class="LineNr"> 33 </span> vector&lt;line&gt; new_lines<span class="Delimiter">;</span>
@ -103,7 +103,7 @@ if ('onhashchange' in window) {
<span id="L43" class="LineNr"> 43 </span> ostringstream global_name<span class="Delimiter">;</span>
<span id="L44" class="LineNr"> 44 </span> global_name &lt;&lt; <span class="Constant">&quot;__subx_global_&quot;</span> &lt;&lt; <span class="Special">Next_auto_global</span><span class="Delimiter">;</span>
<span id="L45" class="LineNr"> 45 </span> ++<span class="Special">Next_auto_global</span><span class="Delimiter">;</span>
<span id="L46" class="LineNr"> 46 </span> <a href='038---literal_strings.cc.html#L57'>add_global_to_data_segment</a><span class="Delimiter">(</span>global_name<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> curr<span class="Delimiter">,</span> new_lines<span class="Delimiter">);</span>
<span id="L46" class="LineNr"> 46 </span> <a href='038literal_strings.cc.html#L57'>add_global_to_data_segment</a><span class="Delimiter">(</span>global_name<span class="Delimiter">.</span>str<span class="Delimiter">(),</span> curr<span class="Delimiter">,</span> new_lines<span class="Delimiter">);</span>
<span id="L47" class="LineNr"> 47 </span> curr<span class="Delimiter">.</span>data = global_name<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span>
<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;line after transform: '&quot;</span> &lt;&lt; data_to_string<span class="Delimiter">(</span>line<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
@ -114,7 +114,7 @@ if ('onhashchange' in window) {
<span id="L54" class="LineNr"> 54 </span> data<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>insert<span class="Delimiter">(</span>data<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>end<span class="Delimiter">(),</span> new_lines<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> new_lines<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L55" class="LineNr"> 55 </span><span class="Delimiter">}</span>
<span id="L56" class="LineNr"> 56 </span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L57'>add_global_to_data_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; <a href='011run.cc.html#L111'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; value<span class="Delimiter">,</span> vector&lt;line&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L57" class="LineNr"> 57 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L57'>add_global_to_data_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; <a href='011run.cc.html#L111'>name</a><span class="Delimiter">,</span> <span class="Normal">const</span> word&amp; value<span class="Delimiter">,</span> vector&lt;line&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding global variable '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' containing &quot;</span> &lt;&lt; value<span class="Delimiter">.</span>data &lt;&lt; end<span class="Delimiter">();</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Comment">// emit label</span>
<span id="L60" class="LineNr"> 60 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>label<span class="Delimiter">(</span><a href='011run.cc.html#L111'>name</a><span class="Delimiter">));</span>
@ -127,7 +127,7 @@ if ('onhashchange' in window) {
<span id="L67" class="LineNr"> 67 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip start quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L170'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">.</span>data<span class="Delimiter">)</span>-<span class="Comment">/*</span><span class="Comment">skip end quote</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L68" class="LineNr"> 68 </span> <span class="Normal">char</span> c = value<span class="Delimiter">.</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L69" class="LineNr"> 69 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">());</span>
<span id="L70" class="LineNr"> 70 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='032---operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span>c<span class="Delimiter">);</span>
<span id="L70" class="LineNr"> 70 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='032operands.cc.html#L296'>hex_byte_to_string</a><span class="Delimiter">(</span>c<span class="Delimiter">);</span>
<span id="L71" class="LineNr"> 71 </span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>string<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">,</span> c<span class="Delimiter">));</span>
<span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span>
<span id="L73" class="LineNr"> 73 </span><span class="Delimiter">}</span>
@ -135,7 +135,7 @@ if ('onhashchange' in window) {
<span id="L75" class="LineNr"> 75 </span><span class="Comment">//: Within strings, whitespace is significant. So we need to redo our instruction</span>
<span id="L76" class="LineNr"> 76 </span><span class="Comment">//: parsing.</span>
<span id="L77" class="LineNr"> 77 </span>
<span id="L78" class="LineNr"> 78 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L78'>test_instruction_with_string_literal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L78" class="LineNr"> 78 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L78'>test_instruction_with_string_literal</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L79" class="LineNr"> 79 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Constant">&quot;a \&quot;</span>abc def\<span class="Constant">&quot; z\n&quot;</span> <span class="Comment">// two spaces inside string</span>
<span id="L81" class="LineNr"> 81 </span> <span class="Delimiter">);</span>
@ -148,7 +148,7 @@ if ('onhashchange' in window) {
<span id="L88" class="LineNr"> 88 </span> <a href='003trace.cc.html#L296'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span>
<span id="L90" class="LineNr"> 90 </span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L91'>test_string_literal_in_data_segment</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L91'>test_string_literal_in_data_segment</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L94" class="LineNr"> 94 </span> <span class="Constant">&quot;b8/copy X/imm32\n&quot;</span>
@ -163,7 +163,7 @@ if ('onhashchange' in window) {
<span id="L103" class="LineNr">103 </span> <span class="Delimiter">);</span>
<span id="L104" class="LineNr">104 </span><span class="Delimiter">}</span>
<span id="L105" class="LineNr">105 </span>
<span id="L106" class="LineNr">106 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L106'>test_string_literal_with_missing_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L106" class="LineNr">106 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L106'>test_string_literal_with_missing_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L107" class="LineNr">107 </span> <span class="Special">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L108" class="LineNr">108 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L109" class="LineNr">109 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span>
@ -194,7 +194,7 @@ if ('onhashchange' in window) {
<span id="L134" class="LineNr">134 </span> result<span class="Delimiter">.</span>original = line_data<span class="Delimiter">;</span>
<span id="L135" class="LineNr">135 </span> <span class="Comment">// add tokens (words or strings) one by one</span>
<span id="L136" class="LineNr">136 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L251'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L137" class="LineNr">137 </span> <a href='038---literal_strings.cc.html#L205'>skip_whitespace</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span>
<span id="L137" class="LineNr">137 </span> <a href='038literal_strings.cc.html#L205'>skip_whitespace</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span>
<span id="L138" class="LineNr">138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L139" class="LineNr">139 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L140" class="LineNr">140 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>c == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// comment; drop rest of line</span>
@ -262,13 +262,13 @@ if ('onhashchange' in window) {
<span id="L202" class="LineNr">202 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span>
<span id="L204" class="LineNr">204 </span>
<span id="L205" class="LineNr">205 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L205'>skip_whitespace</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L205" class="LineNr">205 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L205'>skip_whitespace</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L206" class="LineNr">206 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L251'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> <span class="Delimiter">{</span>
<span id="L207" class="LineNr">207 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span>
<span id="L209" class="LineNr">209 </span><span class="Delimiter">}</span>
<span id="L210" class="LineNr">210 </span>
<span id="L211" class="LineNr">211 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L211'>skip_comment</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L211" class="LineNr">211 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L211'>skip_comment</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L212" class="LineNr">212 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L251'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L213" class="LineNr">213 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L214" class="LineNr">214 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L251'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> &amp;&amp; in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
@ -288,7 +288,7 @@ if ('onhashchange' in window) {
<span id="L228" class="LineNr">228 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>line_data<span class="Delimiter">,</span> out<span class="Delimiter">);</span>
<span id="L229" class="LineNr">229 </span><span class="Delimiter">}</span>
<span id="L230" class="LineNr">230 </span>
<span id="L231" class="LineNr">231 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L231'>test_parse2_comment_token_in_middle</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L231" class="LineNr">231 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L231'>test_parse2_comment_token_in_middle</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L232" class="LineNr">232 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L233" class="LineNr">233 </span> <span class="Constant">&quot;a . z\n&quot;</span>
<span id="L234" class="LineNr">234 </span> <span class="Delimiter">);</span>
@ -301,7 +301,7 @@ if ('onhashchange' in window) {
<span id="L241" class="LineNr">241 </span> <a href='003trace.cc.html#L296'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
<span id="L242" class="LineNr">242 </span><span class="Delimiter">}</span>
<span id="L243" class="LineNr">243 </span>
<span id="L244" class="LineNr">244 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L244'>test_parse2_word_starting_with_dot</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L244'>test_parse2_word_starting_with_dot</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L245" class="LineNr">245 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L246" class="LineNr">246 </span> <span class="Constant">&quot;a .b c\n&quot;</span>
<span id="L247" class="LineNr">247 </span> <span class="Delimiter">);</span>
@ -312,7 +312,7 @@ if ('onhashchange' in window) {
<span id="L252" class="LineNr">252 </span> <span class="Delimiter">);</span>
<span id="L253" class="LineNr">253 </span><span class="Delimiter">}</span>
<span id="L254" class="LineNr">254 </span>
<span id="L255" class="LineNr">255 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L255'>test_parse2_comment_token_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L255" class="LineNr">255 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L255'>test_parse2_comment_token_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L256" class="LineNr">256 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L257" class="LineNr">257 </span> <span class="Constant">&quot;. a b\n&quot;</span>
<span id="L258" class="LineNr">258 </span> <span class="Delimiter">);</span>
@ -323,7 +323,7 @@ if ('onhashchange' in window) {
<span id="L263" class="LineNr">263 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L127'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span>
<span id="L265" class="LineNr">265 </span>
<span id="L266" class="LineNr">266 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L266'>test_parse2_comment_token_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L266" class="LineNr">266 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L266'>test_parse2_comment_token_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L267" class="LineNr">267 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L268" class="LineNr">268 </span> <span class="Constant">&quot;a b .\n&quot;</span>
<span id="L269" class="LineNr">269 </span> <span class="Delimiter">);</span>
@ -334,7 +334,7 @@ if ('onhashchange' in window) {
<span id="L274" class="LineNr">274 </span> <a href='003trace.cc.html#L294'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2: <a href='011run.cc.html#L127'>word</a>: .&quot;</span><span class="Delimiter">);</span>
<span id="L275" class="LineNr">275 </span><span class="Delimiter">}</span>
<span id="L276" class="LineNr">276 </span>
<span id="L277" class="LineNr">277 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L277'>test_parse2_word_starting_with_dot_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L277" class="LineNr">277 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L277'>test_parse2_word_starting_with_dot_at_start</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L278" class="LineNr">278 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L279" class="LineNr">279 </span> <span class="Constant">&quot;.a b c\n&quot;</span>
<span id="L280" class="LineNr">280 </span> <span class="Delimiter">);</span>
@ -345,7 +345,7 @@ if ('onhashchange' in window) {
<span id="L285" class="LineNr">285 </span> <span class="Delimiter">);</span>
<span id="L286" class="LineNr">286 </span><span class="Delimiter">}</span>
<span id="L287" class="LineNr">287 </span>
<span id="L288" class="LineNr">288 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L288'>test_parse2_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L288" class="LineNr">288 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L288'>test_parse2_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L289" class="LineNr">289 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L290" class="LineNr">290 </span> <span class="Constant">&quot;.a b/c d\n&quot;</span>
<span id="L291" class="LineNr">291 </span> <span class="Delimiter">);</span>
@ -356,7 +356,7 @@ if ('onhashchange' in window) {
<span id="L296" class="LineNr">296 </span> <span class="Delimiter">);</span>
<span id="L297" class="LineNr">297 </span><span class="Delimiter">}</span>
<span id="L298" class="LineNr">298 </span>
<span id="L299" class="LineNr">299 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L299'>test_parse2_string_with_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L299" class="LineNr">299 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L299'>test_parse2_string_with_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L300" class="LineNr">300 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L301" class="LineNr">301 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32 g\n&quot;</span>
<span id="L302" class="LineNr">302 </span> <span class="Delimiter">);</span>
@ -367,7 +367,7 @@ if ('onhashchange' in window) {
<span id="L307" class="LineNr">307 </span> <span class="Delimiter">);</span>
<span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span>
<span id="L309" class="LineNr">309 </span>
<span id="L310" class="LineNr">310 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L310'>test_parse2_string_with_metadata_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L310" class="LineNr">310 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L310'>test_parse2_string_with_metadata_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L311" class="LineNr">311 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L312" class="LineNr">312 </span> <span class="Constant">&quot;a \&quot;</span>bc def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L313" class="LineNr">313 </span> <span class="Delimiter">);</span>
@ -377,7 +377,7 @@ if ('onhashchange' in window) {
<span id="L317" class="LineNr">317 </span> <span class="Delimiter">);</span>
<span id="L318" class="LineNr">318 </span><span class="Delimiter">}</span>
<span id="L319" class="LineNr">319 </span>
<span id="L320" class="LineNr">320 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L320'>test_parse2_string_with_metadata_at_end_of_line_without_newline</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L320" class="LineNr">320 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L320'>test_parse2_string_with_metadata_at_end_of_line_without_newline</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L321" class="LineNr">321 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L322" class="LineNr">322 </span> <span class="Constant">&quot;68/push \&quot;</span>test\<span class="Constant">&quot;/f&quot;</span> <span class="Comment">// no newline, which is how calls from parse() will look</span>
<span id="L323" class="LineNr">323 </span> <span class="Delimiter">);</span>
@ -390,7 +390,7 @@ if ('onhashchange' in window) {
<span id="L330" class="LineNr">330 </span><span class="Comment">//: Make sure slashes inside strings don't trigger adding stuff from inside the</span>
<span id="L331" class="LineNr">331 </span><span class="Comment">//: string to metadata.</span>
<span id="L332" class="LineNr">332 </span>
<span id="L333" class="LineNr">333 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L333'>test_parse2_string_containing_slashes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L333" class="LineNr">333 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L333'>test_parse2_string_containing_slashes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L334" class="LineNr">334 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L335" class="LineNr">335 </span> <span class="Constant">&quot;a \&quot;</span>bc/def\<span class="Constant">&quot;/disp32\n&quot;</span>
<span id="L336" class="LineNr">336 </span> <span class="Delimiter">);</span>
@ -399,7 +399,7 @@ if ('onhashchange' in window) {
<span id="L339" class="LineNr">339 </span> <span class="Delimiter">);</span>
<span id="L340" class="LineNr">340 </span><span class="Delimiter">}</span>
<span id="L341" class="LineNr">341 </span>
<span id="L342" class="LineNr">342 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L342'>test_instruction_with_string_literal_with_escaped_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L342" class="LineNr">342 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L342'>test_instruction_with_string_literal_with_escaped_quote</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L343" class="LineNr">343 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L344" class="LineNr">344 </span> <span class="Constant">&quot;\&quot;</span>a\\\<span class="Constant">&quot;b\&quot;</span>\n<span class="Constant">&quot; // escaped quote inside string</span>
<span id="L345" class="LineNr">345 </span><span class="Constant"> );</span>
@ -410,7 +410,7 @@ if ('onhashchange' in window) {
<span id="L350" class="LineNr">350 </span> <a href='003trace.cc.html#L296'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;parse2&quot;</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L351" class="LineNr">351 </span><span class="Delimiter">}</span>
<span id="L352" class="LineNr">352 </span>
<span id="L353" class="LineNr">353 </span><span class="Normal">void</span> <a href='038---literal_strings.cc.html#L353'>test_instruction_with_string_literal_with_escaped_backslash</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L353" class="LineNr">353 </span><span class="Normal">void</span> <a href='038literal_strings.cc.html#L353'>test_instruction_with_string_literal_with_escaped_backslash</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L354" class="LineNr">354 </span> parse_instruction_character_by_character<span class="Delimiter">(</span>
<span id="L355" class="LineNr">355 </span> <span class="Constant">&quot;\&quot;</span>a\\\\b\<span class="Constant">&quot;\n&quot;</span> <span class="Comment">// escaped backslash inside string</span>
<span id="L356" class="LineNr">356 </span> <span class="Delimiter">);</span>

View File

@ -98,28 +98,28 @@ if ('onhashchange' in window) {
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(after &quot;Run One Instruction&quot;)</span>
<span id="L41" class="LineNr"> 41 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">))</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;== label &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">))</span>
<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L41" class="LineNr"> 41 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">))</span>
<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;== label &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L43" class="LineNr"> 43 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">))</span>
<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L9'>Source_line</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span><span class="Normal">else</span>
<span id="L46" class="LineNr"> 46 </span> <span class="Comment">// no source line info; do what you can</span>
<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; <a href='039debug.cc.html#L50'>debug_info</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;inst: &quot;</span> &lt;&lt; <a href='039debug.cc.html#L50'>debug_info</a><span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span>
<span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(code)</span>
<span id="L50" class="LineNr"> 50 </span>string <a href='039debug.cc.html#L50'>debug_info</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> inst_address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Normal">uint8_t</span> op = <a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>inst_address<span class="Delimiter">);</span>
<span id="L51" class="LineNr"> 51 </span> <span class="Normal">uint8_t</span> op = <a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>inst_address<span class="Delimiter">);</span>
<span id="L52" class="LineNr"> 52 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>op != <span class="Constant">0xe8</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L53" class="LineNr"> 53 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L54" class="LineNr"> 54 </span> out &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">);</span>
<span id="L54" class="LineNr"> 54 </span> out &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span>op<span class="Delimiter">);</span>
<span id="L55" class="LineNr"> 55 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Normal">int32_t</span> offset = <a href='010---vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span>inst_address+<span class="Comment">/*</span><span class="Comment">skip op</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L57" class="LineNr"> 57 </span> <span class="Normal">int32_t</span> offset = <a href='010vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span>inst_address+<span class="Comment">/*</span><span class="Comment">skip op</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L58" class="LineNr"> 58 </span> <span class="Normal">uint32_t</span> next_eip = inst_address+<span class="Comment">/*</span><span class="Comment">inst length</span><span class="Comment">*/</span><span class="Constant">5</span>+offset<span class="Delimiter">;</span>
<span id="L59" class="LineNr"> 59 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> next_eip<span class="Delimiter">))</span>
<span id="L60" class="LineNr"> 60 </span> <span class="Identifier">return</span> <span class="Constant">&quot;e8/call &quot;</span>+get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> next_eip<span class="Delimiter">);</span>
<span id="L61" class="LineNr"> 61 </span> ostringstream out<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> out &lt;&lt; <span class="Constant">&quot;e8/call 0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; next_eip<span class="Delimiter">;</span>
<span id="L62" class="LineNr"> 62 </span> out &lt;&lt; <span class="Constant">&quot;e8/call 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; next_eip<span class="Delimiter">;</span>
<span id="L63" class="LineNr"> 63 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span>
<span id="L65" class="LineNr"> 65 </span>
@ -138,18 +138,18 @@ if ('onhashchange' in window) {
<span id="L78" class="LineNr"> 78 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L73'>Watch_points</a></span><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L79" class="LineNr"> 79 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;dbg&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;watch points:&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L80" class="LineNr"> 80 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">uint32_t</span>&gt;::iterator p = <span class="Special"><a href='039debug.cc.html#L73'>Watch_points</a></span><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <span class="Special"><a href='039debug.cc.html#L73'>Watch_points</a></span><span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L81" class="LineNr"> 81 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;dbg&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010---vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L81" class="LineNr"> 81 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Special">Callstack_depth</span><span class="Delimiter">,</span> <span class="Constant">&quot;dbg&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; p<span class="Delimiter">-&gt;</span>first &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; p<span class="Delimiter">-&gt;</span>second &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <a href='010vm.cc.html#L172'>read_mem_u32</a><span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span>
<span id="L83" class="LineNr"> 83 </span>
<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L85" class="LineNr"> 85 </span>string <span class="Special">Watch_this_effective_address</span><span class="Delimiter">;</span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(after &quot;Run One Instruction&quot;)</span>
<span id="L87" class="LineNr"> 87 </span><span class="Special">Watch_this_effective_address</span> = <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L88" class="LineNr"> 88 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &amp;&amp; <a href='001help.cc.html#L106'>starts_with</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">),</span> <span class="Constant">&quot;$watch-&quot;</span><span class="Delimiter">))</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Special">Watch_this_effective_address</span> = get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L88" class="LineNr"> 88 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &amp;&amp; <a href='001help.cc.html#L106'>starts_with</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">),</span> <span class="Constant">&quot;$watch-&quot;</span><span class="Delimiter">))</span>
<span id="L89" class="LineNr"> 89 </span> <span class="Special">Watch_this_effective_address</span> = get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(after &quot;Found <a href='013direct_addressing.cc.html#L101'>effective_address</a>(addr)&quot;)</span>
<span id="L91" class="LineNr"> 91 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!<span class="Special">Watch_this_effective_address</span><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L92" class="LineNr"> 92 </span> <a href='003trace.cc.html#L441'>dbg</a> &lt;&lt; <span class="Constant">&quot;now watching &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; for &quot;</span> &lt;&lt; <span class="Special">Watch_this_effective_address</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L92" class="LineNr"> 92 </span> <a href='003trace.cc.html#L441'>dbg</a> &lt;&lt; <span class="Constant">&quot;now watching &quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; for &quot;</span> &lt;&lt; <span class="Special">Watch_this_effective_address</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L93" class="LineNr"> 93 </span> <a href='001help.cc.html#L229'>put</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L73'>Watch_points</a></span><span class="Delimiter">,</span> <span class="Special">Watch_this_effective_address</span><span class="Delimiter">,</span> addr<span class="Delimiter">);</span>
<span id="L94" class="LineNr"> 94 </span><span class="Delimiter">}</span>
<span id="L95" class="LineNr"> 95 </span>
@ -157,14 +157,14 @@ if ('onhashchange' in window) {
<span id="L97" class="LineNr"> 97 </span><span class="Comment">//: Not a general mechanism; by the time you get here you're willing to hack</span>
<span id="L98" class="LineNr"> 98 </span><span class="Comment">//: on the emulator.</span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(after &quot;Run One Instruction&quot;)</span>
<span id="L100" class="LineNr">100 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010---vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> == <span class="Constant">&quot;$dump-stream-at-EAX&quot;</span><span class="Delimiter">)</span>
<span id="L101" class="LineNr">101 </span> <a href='039debug.cc.html#L103'>dump_stream_at</a><span class="Delimiter">(</span><span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L100" class="LineNr">100 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L233'>contains_key</a><span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> &amp;&amp; get<span class="Delimiter">(</span><span class="Special"><a href='039debug.cc.html#L8'>Symbol_name</a></span><span class="Delimiter">,</span> <a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">)</span> == <span class="Constant">&quot;$dump-stream-at-EAX&quot;</span><span class="Delimiter">)</span>
<span id="L101" class="LineNr">101 </span> <a href='039debug.cc.html#L103'>dump_stream_at</a><span class="Delimiter">(</span><span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>u<span class="Delimiter">);</span>
<span id="L102" class="LineNr">102 </span><span class="Delimiter">:(code)</span>
<span id="L103" class="LineNr">103 </span><span class="Normal">void</span> <a href='039debug.cc.html#L103'>dump_stream_at</a><span class="Delimiter">(</span><span class="Normal">uint32_t</span> stream_start<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">int32_t</span> stream_length = <a href='010---vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span>stream_start + <span class="Constant">8</span><span class="Delimiter">);</span>
<span id="L104" class="LineNr">104 </span> <span class="Normal">int32_t</span> stream_length = <a href='010vm.cc.html#L176'>read_mem_i32</a><span class="Delimiter">(</span>stream_start + <span class="Constant">8</span><span class="Delimiter">);</span>
<span id="L105" class="LineNr">105 </span> <a href='003trace.cc.html#L441'>dbg</a> &lt;&lt; <span class="Constant">&quot;stream length: &quot;</span> &lt;&lt; std::dec &lt;&lt; stream_length &lt;&lt; end<span class="Delimiter">();</span>
<span id="L106" class="LineNr">106 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; stream_length + <span class="Constant">12</span><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span>
<span id="L107" class="LineNr">107 </span> <a href='003trace.cc.html#L441'>dbg</a> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010---vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>stream_start+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010---vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span><a href='010---vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>stream_start+i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L107" class="LineNr">107 </span> <a href='003trace.cc.html#L441'>dbg</a> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L395'>HEXWORD</a> &lt;&lt; <span class="Delimiter">(</span>stream_start+i<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; <a href='010vm.cc.html#L394'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L397'>NUM</a><span class="Delimiter">(</span><a href='010vm.cc.html#L165'>read_mem_u8</a><span class="Delimiter">(</span>stream_start+i<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span>
<span id="L109" class="LineNr">109 </span>
<span id="L110" class="LineNr">110 </span><span class="Comment">//: helpers</span>

View File

@ -2,7 +2,7 @@
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 040---tests.cc</title>
<title>Mu - 040tests.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
@ -55,7 +55,7 @@ if ('onhashchange' in window) {
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/040---tests.cc'>https://github.com/akkartik/mu/blob/master/040---tests.cc</a>
<a href='https://github.com/akkartik/mu/blob/master/040tests.cc'>https://github.com/akkartik/mu/blob/master/040tests.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Automatically aggregate functions starting with 'test-' into a test suite</span>
<span id="L2" class="LineNr"> 2 </span><span class="Comment">//: called 'run-tests'. Running this function will run all tests.</span>
@ -69,12 +69,12 @@ if ('onhashchange' in window) {
<span id="L10" class="LineNr">10 </span><span class="Comment">//: We don't rely on any transforms running in previous layers, but this layer</span>
<span id="L11" class="LineNr">11 </span><span class="Comment">//: knows about labels and will emit labels for previous layers to transform.</span>
<span id="L12" class="LineNr">12 </span><span class="Delimiter">:(after &quot;Begin Transforms&quot;)</span>
<span id="L13" class="LineNr">13 </span><span class="Special"><a href='031transforms.cc.html#L4'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040---tests.cc.html#L34'>create_test_function</a><span class="Delimiter">);</span>
<span id="L13" class="LineNr">13 </span><span class="Special"><a href='031transforms.cc.html#L4'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040tests.cc.html#L34'>create_test_function</a><span class="Delimiter">);</span>
<span id="L14" class="LineNr">14 </span>
<span id="L15" class="LineNr">15 </span><span class="Delimiter">:(code)</span>
<span id="L16" class="LineNr">16 </span><span class="Normal">void</span> <a href='040---tests.cc.html#L16'>test_run_test</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L17" class="LineNr">17 </span> <span class="Special"><a href='010---vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L18" class="LineNr">18 </span> <span class="Special"><a href='010---vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000100</span><span class="Delimiter">;</span>
<span id="L16" class="LineNr">16 </span><span class="Normal">void</span> <a href='040tests.cc.html#L16'>test_run_test</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L17" class="LineNr">17 </span> <span class="Special"><a href='010vm.cc.html#L154'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span><span class="Constant">0xbd000000</span><span class="Delimiter">));</span> <span class="Comment">// manually allocate memory</span>
<span id="L18" class="LineNr">18 </span> <span class="Special"><a href='010vm.cc.html#L25'>Reg</a></span>[ESP]<span class="Delimiter">.</span>u = <span class="Constant">0xbd000100</span><span class="Delimiter">;</span>
<span id="L19" class="LineNr">19 </span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L20" class="LineNr">20 </span> <span class="Constant">&quot;== code 0x1\n&quot;</span> <span class="Comment">// code segment</span>
<span id="L21" class="LineNr">21 </span> <span class="Constant">&quot;main:\n&quot;</span>
@ -90,7 +90,7 @@ if ('onhashchange' in window) {
<span id="L31" class="LineNr">31 </span> <span class="Delimiter">);</span>
<span id="L32" class="LineNr">32 </span><span class="Delimiter">}</span>
<span id="L33" class="LineNr">33 </span>
<span id="L34" class="LineNr">34 </span><span class="Normal">void</span> <a href='040---tests.cc.html#L34'>create_test_function</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L34" class="LineNr">34 </span><span class="Normal">void</span> <a href='040tests.cc.html#L34'>create_test_function</a><span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L35" class="LineNr">35 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L36" class="LineNr">36 </span> segment&amp; code = *find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">);</span>
<span id="L37" class="LineNr">37 </span> <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- create 'run-tests'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
@ -108,7 +108,7 @@ if ('onhashchange' in window) {
<span id="L49" class="LineNr">49 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_insts<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// no tests found</span>
<span id="L50" class="LineNr">50 </span> code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>label<span class="Delimiter">(</span><span class="Constant">&quot;run-tests&quot;</span><span class="Delimiter">));</span>
<span id="L51" class="LineNr">51 </span> code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>insert<span class="Delimiter">(</span>code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>end<span class="Delimiter">(),</span> new_insts<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> new_insts<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L52" class="LineNr">52 </span> code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040---tests.cc.html#L89'>ret</a><span class="Delimiter">());</span>
<span id="L52" class="LineNr">52 </span> code<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040tests.cc.html#L89'>ret</a><span class="Delimiter">());</span>
<span id="L53" class="LineNr">53 </span><span class="Delimiter">}</span>
<span id="L54" class="LineNr">54 </span>
<span id="L55" class="LineNr">55 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> segment&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
@ -127,7 +127,7 @@ if ('onhashchange' in window) {
<span id="L68" class="LineNr">68 </span><a href='011run.cc.html#L121'>line</a> call<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L69" class="LineNr">69 </span> <a href='011run.cc.html#L121'>line</a> result<span class="Delimiter">;</span>
<span id="L70" class="LineNr">70 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>call<span class="Delimiter">());</span>
<span id="L71" class="LineNr">71 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040---tests.cc.html#L82'>disp32</a><span class="Delimiter">(</span>s<span class="Delimiter">));</span>
<span id="L71" class="LineNr">71 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040tests.cc.html#L82'>disp32</a><span class="Delimiter">(</span>s<span class="Delimiter">));</span>
<span id="L72" class="LineNr">72 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L73" class="LineNr">73 </span><span class="Delimiter">}</span>
<span id="L74" class="LineNr">74 </span>
@ -138,14 +138,14 @@ if ('onhashchange' in window) {
<span id="L79" class="LineNr">79 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L80" class="LineNr">80 </span><span class="Delimiter">}</span>
<span id="L81" class="LineNr">81 </span>
<span id="L82" class="LineNr">82 </span><a href='011run.cc.html#L127'>word</a> <a href='040---tests.cc.html#L82'>disp32</a><span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L82" class="LineNr">82 </span><a href='011run.cc.html#L127'>word</a> <a href='040tests.cc.html#L82'>disp32</a><span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr">83 </span> <a href='011run.cc.html#L127'>word</a> result<span class="Delimiter">;</span>
<span id="L84" class="LineNr">84 </span> result<span class="Delimiter">.</span>data = s<span class="Delimiter">;</span>
<span id="L85" class="LineNr">85 </span> result<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><span class="Constant">&quot;disp32&quot;</span><span class="Delimiter">);</span>
<span id="L86" class="LineNr">86 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L87" class="LineNr">87 </span><span class="Delimiter">}</span>
<span id="L88" class="LineNr">88 </span>
<span id="L89" class="LineNr">89 </span><a href='011run.cc.html#L121'>line</a> <a href='040---tests.cc.html#L89'>ret</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L89" class="LineNr">89 </span><a href='011run.cc.html#L121'>line</a> <a href='040tests.cc.html#L89'>ret</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L90" class="LineNr">90 </span> <a href='011run.cc.html#L121'>line</a> result<span class="Delimiter">;</span>
<span id="L91" class="LineNr">91 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">());</span>
<span id="L92" class="LineNr">92 </span> result<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <span class="Constant">&quot;c3&quot;</span><span class="Delimiter">;</span>