about summary refs log tree commit diff stats
path: root/html/033check_operands.cc.html
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-01-30 00:14:53 -0800
committerKartik Agaram <vc@akkartik.com>2020-01-30 00:14:53 -0800
commit4c0b4b461160237f4ec61dd2d2f6d7cc451b149d (patch)
treece0f0129ea4a296a31b8dc4e8eeca0fe0abc7b60 /html/033check_operands.cc.html
parent9eac92069d4c06dc17c15fb086b4780378b2e0b0 (diff)
downloadmu-4c0b4b461160237f4ec61dd2d2f6d7cc451b149d.tar.gz
5958
Diffstat (limited to 'html/033check_operands.cc.html')
-rw-r--r--html/033check_operands.cc.html148
1 files changed, 71 insertions, 77 deletions
diff --git a/html/033check_operands.cc.html b/html/033check_operands.cc.html
index f771f27e..72f14492 100644
--- a/html/033check_operands.cc.html
+++ b/html/033check_operands.cc.html
@@ -100,7 +100,7 @@ if ('onhashchange' in window) {
 <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span>
 <span id="L40" class="LineNr"> 40 </span>
 <span id="L41" class="LineNr"> 41 </span><a href='011run.cc.html#L127'>word</a> <a href='033check_operands.cc.html#L41'>preprocess_op</a><span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span id="L42" class="LineNr"> 42 </span>  op<span class="Delimiter">.</span>data = <a href='033check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
+<span id="L42" class="LineNr"> 42 </span>  op<span class="Delimiter">.</span>data = <a href='033check_operands.cc.html#L673'>tolower</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span>
 <span id="L43" class="LineNr"> 43 </span>  <span class="Comment">// opcodes can't be negative</span>
 <span id="L44" class="LineNr"> 44 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L106'>starts_with</a><span class="Delimiter">(</span>op<span class="Delimiter">.</span>data<span class="Delimiter">,</span> <span class="Constant">&quot;0x&quot;</span><span class="Delimiter">))</span>
 <span id="L45" class="LineNr"> 45 </span>    op<span class="Delimiter">.</span>data = op<span class="Delimiter">.</span>data<span class="Delimiter">.</span>substr<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
@@ -319,16 +319,16 @@ if ('onhashchange' in window) {
 <span id="L258" class="LineNr">258 </span>  <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L99'>Permitted_operands</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
 <span id="L259" class="LineNr">259 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span> <span class="Delimiter">{</span>
 <span id="L260" class="LineNr">260 </span>    <a href='033check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
-<span id="L261" class="LineNr">261 </span>    <a href='033check_operands.cc.html#L398'>compare_bitvector_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
+<span id="L261" class="LineNr">261 </span>    <a href='033check_operands.cc.html#L398'>compare_bitvector_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">));</span>
 <span id="L262" class="LineNr">262 </span>  <span class="Delimiter">}</span>
 <span id="L263" class="LineNr">263 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
-<span id="L264" class="LineNr">264 </span>    <a href='033check_operands.cc.html#L270'>compare_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
+<span id="L264" class="LineNr">264 </span>    <a href='033check_operands.cc.html#L270'>compare_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">));</span>
 <span id="L265" class="LineNr">265 </span>  <span class="Delimiter">}</span>
 <span id="L266" class="LineNr">266 </span><span class="Delimiter">}</span>
 <span id="L267" class="LineNr">267 </span>
 <span id="L268" class="LineNr">268 </span><span class="Comment">//: Many instructions can be checked just by comparing bitvectors.</span>
 <span id="L269" class="LineNr">269 </span>
-<span id="L270" class="LineNr">270 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L270'>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> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L270" class="LineNr">270 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L270'>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="L271" class="LineNr">271 </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#L306'>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="L272" class="LineNr">272 </span>  <span class="Normal">uint8_t</span> bitvector = <a href='033check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
 <span id="L273" class="LineNr">273 </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>
@@ -338,9 +338,9 @@ if ('onhashchange' in window) {
 <span id="L277" class="LineNr">277 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// all good with this operand</span>
 <span id="L278" class="LineNr">278 </span>    <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='033check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
 <span id="L279" class="LineNr">279 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
-<span id="L280" class="LineNr">280 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L280" class="LineNr">280 </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;'&quot;</span> &lt;&lt; maybe_op_name &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
 <span id="L281" class="LineNr">281 </span>    <span class="Normal">else</span>
-<span id="L282" class="LineNr">282 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L282" class="LineNr">282 </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;'&quot;</span> &lt;&lt; maybe_op_name &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
 <span id="L283" class="LineNr">283 </span>    <span class="Comment">// continue giving all errors for a single instruction</span>
 <span id="L284" class="LineNr">284 </span>  <span class="Delimiter">}</span>
 <span id="L285" class="LineNr">285 </span>  <span class="Comment">// ignore settings in any unused bits</span>
@@ -456,7 +456,7 @@ if ('onhashchange' in window) {
 <span id="L395" class="LineNr">395 </span>
 <span id="L396" class="LineNr">396 </span><span class="Comment">// same as compare_bitvector, with one additional exception for modrm-based</span>
 <span id="L397" class="LineNr">397 </span><span class="Comment">// instructions: they may use an extra displacement on occasion</span>
-<span id="L398" class="LineNr">398 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L398'>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> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L398" class="LineNr">398 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L398'>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="L399" class="LineNr">399 </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#L306'>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="L400" class="LineNr">400 </span>  <span class="Normal">uint8_t</span> bitvector = <a href='033check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
 <span id="L401" class="LineNr">401 </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>
@@ -482,9 +482,9 @@ if ('onhashchange' in window) {
 <span id="L421" class="LineNr">421 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// all good with this operand</span>
 <span id="L422" class="LineNr">422 </span>    <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='033check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
 <span id="L423" class="LineNr">423 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
-<span id="L424" class="LineNr">424 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L424" class="LineNr">424 </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;'&quot;</span> &lt;&lt; maybe_op_name &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
 <span id="L425" class="LineNr">425 </span>    <span class="Normal">else</span>
-<span id="L426" class="LineNr">426 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L288'>maybe_name</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L426" class="LineNr">426 </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;'&quot;</span> &lt;&lt; maybe_op_name &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
 <span id="L427" class="LineNr">427 </span>    <span class="Comment">// continue giving all errors for a single instruction</span>
 <span id="L428" class="LineNr">428 </span>  <span class="Delimiter">}</span>
 <span id="L429" class="LineNr">429 </span>  <span class="Comment">// ignore settings in any unused bits</span>
@@ -681,75 +681,69 @@ if ('onhashchange' in window) {
 <span id="L620" class="LineNr">620 </span>  <span class="Delimiter">);</span>
 <span id="L621" class="LineNr">621 </span><span class="Delimiter">}</span>
 <span id="L622" class="LineNr">622 </span>
-<span id="L623" class="LineNr">623 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<span id="L624" class="LineNr">624 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">bitvector</span><span class="Comment">*/</span><span class="Normal">uint8_t</span>&gt; <span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">;</span>
-<span id="L625" class="LineNr">625 </span><span class="Delimiter">:(before &quot;End Init Permitted Operands&quot;)</span>
-<span id="L626" class="LineNr">626 </span><span class="SalientComment">//// Class D: just op and disp32</span>
-<span id="L627" class="LineNr">627 </span><span class="Comment">//  imm32 imm8  disp32 |disp16  disp8 subop modrm</span>
-<span id="L628" class="LineNr">628 </span><span class="Comment">//  0     0     1      |0       0     0     0</span>
-<span id="L629" class="LineNr">629 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L630" class="LineNr">630 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L631" class="LineNr">631 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L632" class="LineNr">632 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L633" class="LineNr">633 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L634" class="LineNr">634 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L635" class="LineNr">635 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L636" class="LineNr">636 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L637" class="LineNr">637 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L638" class="LineNr">638 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
-<span id="L639" class="LineNr">639 </span>
-<span id="L640" class="LineNr">640 </span><span class="SalientComment">//// Class M: using ModR/M byte</span>
-<span id="L641" class="LineNr">641 </span><span class="Comment">//  imm32 imm8  disp32 |disp16  disp8 subop modrm</span>
-<span id="L642" class="LineNr">642 </span><span class="Comment">//  0     0     0      |0       0     0     1</span>
-<span id="L643" class="LineNr">643 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
-<span id="L644" class="LineNr">644 </span>
-<span id="L645" class="LineNr">645 </span><span class="Delimiter">:(code)</span>
-<span id="L646" class="LineNr">646 </span><span class="Normal">void</span> check_operands_0f<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="L647" class="LineNr">647 </span>  <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L624'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
-<span id="L648" class="LineNr">648 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span>
-<span id="L649" class="LineNr">649 </span>    <a href='033check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
-<span id="L650" class="LineNr">650 </span>  <a href='033check_operands.cc.html#L653'>compare_bitvector_0f</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> CLEAR<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">),</span> op<span class="Delimiter">);</span>
-<span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span>
+<span id="L623" class="LineNr">623 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L623'>test_0f_opcode_with_modrm</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L624" class="LineNr">624 </span>  transform<span class="Delimiter">(</span>
+<span id="L625" class="LineNr">625 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
+<span id="L626" class="LineNr">626 </span>      <span class="Constant">&quot;0f af/multiply 2/mod/*+disp32 5/rm32/ebp 8/disp32 0/r32\n&quot;</span>
+<span id="L627" class="LineNr">627 </span>  <span class="Delimiter">);</span>
+<span id="L628" class="LineNr">628 </span>  <a href='003trace.cc.html#L306'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span>
+<span id="L629" class="LineNr">629 </span><span class="Delimiter">}</span>
+<span id="L630" class="LineNr">630 </span>
+<span id="L631" class="LineNr">631 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<span id="L632" class="LineNr">632 </span>map&lt;<span class="Comment">/*</span><span class="Comment">op</span><span class="Comment">*/</span>string<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">bitvector</span><span class="Comment">*/</span><span class="Normal">uint8_t</span>&gt; <span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">;</span>
+<span id="L633" class="LineNr">633 </span><span class="Delimiter">:(before &quot;End Init Permitted Operands&quot;)</span>
+<span id="L634" class="LineNr">634 </span><span class="SalientComment">//// Class D: just op and disp32</span>
+<span id="L635" class="LineNr">635 </span><span class="Comment">//  imm32 imm8  disp32 |disp16  disp8 subop modrm</span>
+<span id="L636" class="LineNr">636 </span><span class="Comment">//  0     0     1      |0       0     0     0</span>
+<span id="L637" class="LineNr">637 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;82&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L638" class="LineNr">638 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;83&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L639" class="LineNr">639 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;84&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L640" class="LineNr">640 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;85&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L641" class="LineNr">641 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;86&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L642" class="LineNr">642 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;87&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L643" class="LineNr">643 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8c&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L644" class="LineNr">644 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8d&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L645" class="LineNr">645 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8e&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L646" class="LineNr">646 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;8f&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x10</span><span class="Delimiter">);</span>
+<span id="L647" class="LineNr">647 </span>
+<span id="L648" class="LineNr">648 </span><span class="SalientComment">//// Class M: using ModR/M byte</span>
+<span id="L649" class="LineNr">649 </span><span class="Comment">//  imm32 imm8  disp32 |disp16  disp8 subop modrm</span>
+<span id="L650" class="LineNr">650 </span><span class="Comment">//  0     0     0      |0       0     0     1</span>
+<span id="L651" class="LineNr">651 </span><a href='001help.cc.html#L239'>put_new</a><span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;af&quot;</span><span class="Delimiter">,</span> <span class="Constant">0x01</span><span class="Delimiter">);</span>
 <span id="L652" class="LineNr">652 </span>
-<span id="L653" class="LineNr">653 </span><span class="Normal">void</span> <a href='033check_operands.cc.html#L653'>compare_bitvector_0f</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> word&amp; op<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span id="L654" class="LineNr">654 </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#L306'>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="L655" class="LineNr">655 </span>  <span class="Normal">uint8_t</span> bitvector = <a href='033check_operands.cc.html#L296'>compute_expected_operand_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">);</span>
-<span id="L656" class="LineNr">656 </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="L657" class="LineNr">657 </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>
-<span id="L658" class="LineNr">658 </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='033check_operands.cc.html#L76'>NUM_OPERAND_TYPES</a><span class="Delimiter">;</span>  ++i<span class="Delimiter">,</span> bitvector &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">,</span> expected &gt;&gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span id="L659" class="LineNr">659 </span><span class="CommentedCode">//?     cerr &lt;&lt; &quot;comparing &quot; &lt;&lt; HEXBYTE &lt;&lt; NUM(bitvector) &lt;&lt; &quot; with &quot; &lt;&lt; NUM(expected) &lt;&lt; '\n';</span>
-<span id="L660" class="LineNr">660 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> == <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// all good with this operand</span>
-<span id="L661" class="LineNr">661 </span>    <span class="Normal">const</span> string&amp; optype = <span class="Special"><a href='033check_operands.cc.html#L79'>Operand_type_name</a></span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-<span id="L662" class="LineNr">662 </span>    <span class="Normal">if</span> <span class="Delimiter">((</span>bitvector &amp; <span class="Constant">0x1</span><span class="Delimiter">)</span> &gt; <span class="Delimiter">(</span>expected &amp; <span class="Constant">0x1</span><span class="Delimiter">))</span>
-<span id="L663" class="LineNr">663 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L671'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: unexpected &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span id="L664" class="LineNr">664 </span>    <span class="Normal">else</span>
-<span id="L665" class="LineNr">665 </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;'&quot;</span> &lt;&lt; <a href='033check_operands.cc.html#L671'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: missing &quot;</span> &lt;&lt; optype &lt;&lt; <span class="Constant">&quot; operand\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<span id="L666" class="LineNr">666 </span>    <span class="Comment">// continue giving all errors for a single instruction</span>
-<span id="L667" class="LineNr">667 </span>  <span class="Delimiter">}</span>
-<span id="L668" class="LineNr">668 </span>  <span class="Comment">// ignore settings in any unused bits</span>
-<span id="L669" class="LineNr">669 </span><span class="Delimiter">}</span>
-<span id="L670" class="LineNr">670 </span>
-<span id="L671" class="LineNr">671 </span>string <a href='033check_operands.cc.html#L671'>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="L672" class="LineNr">672 </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="L673" class="LineNr">673 </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="L674" class="LineNr">674 </span>  <span class="Comment">// strip stuff in parens from the name</span>
-<span id="L675" class="LineNr">675 </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="L676" class="LineNr">676 </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="L677" class="LineNr">677 </span><span class="Delimiter">}</span>
-<span id="L678" class="LineNr">678 </span>
-<span id="L679" class="LineNr">679 </span>string <a href='033check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<span id="L680" class="LineNr">680 </span>  ostringstream out<span class="Delimiter">;</span>
-<span id="L681" class="LineNr">681 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  *s<span class="Delimiter">;</span>  ++s<span class="Delimiter">)</span>
-<span id="L682" class="LineNr">682 </span>    out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><a href='033check_operands.cc.html#L679'>tolower</a><span class="Delimiter">(</span>*s<span class="Delimiter">));</span>
-<span id="L683" class="LineNr">683 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
-<span id="L684" class="LineNr">684 </span><span class="Delimiter">}</span>
-<span id="L685" class="LineNr">685 </span>
-<span id="L686" class="LineNr">686 </span><span class="PreProc">#undef HAS</span>
-<span id="L687" class="LineNr">687 </span><span class="PreProc">#undef SET</span>
-<span id="L688" class="LineNr">688 </span><span class="PreProc">#undef CLEAR</span>
-<span id="L689" class="LineNr">689 </span>
-<span id="L690" class="LineNr">690 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
-<span id="L691" class="LineNr">691 </span><span class="PreProc">#include</span><span class="Constant">&lt;cctype&gt;</span>
+<span id="L653" class="LineNr">653 </span><span class="Delimiter">:(code)</span>
+<span id="L654" class="LineNr">654 </span><span class="Normal">void</span> check_operands_0f<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="L655" class="LineNr">655 </span>  <span class="Normal">uint8_t</span> expected_bitvector = get<span class="Delimiter">(</span><span class="Special"><a href='033check_operands.cc.html#L632'>Permitted_operands_0f</a></span><span class="Delimiter">,</span> op<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
+<span id="L656" class="LineNr">656 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>HAS<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L657" class="LineNr">657 </span>    <a href='033check_operands.cc.html#L372'>check_operands_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> op<span class="Delimiter">);</span>
+<span id="L658" class="LineNr">658 </span>    <a href='033check_operands.cc.html#L398'>compare_bitvector_modrm</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L665'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">));</span>
+<span id="L659" class="LineNr">659 </span>  <span class="Delimiter">}</span>
+<span id="L660" class="LineNr">660 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<span id="L661" class="LineNr">661 </span>    <a href='033check_operands.cc.html#L270'>compare_bitvector</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> CLEAR<span class="Delimiter">(</span>expected_bitvector<span class="Delimiter">,</span> <a href='033check_operands.cc.html#L69'>MODRM</a><span class="Delimiter">),</span> <a href='033check_operands.cc.html#L665'>maybe_name_0f</a><span class="Delimiter">(</span>op<span class="Delimiter">));</span>
+<span id="L662" class="LineNr">662 </span>  <span class="Delimiter">}</span>
+<span id="L663" class="LineNr">663 </span><span class="Delimiter">}</span>
+<span id="L664" class="LineNr">664 </span>
+<span id="L665" class="LineNr">665 </span>string <a href='033check_operands.cc.html#L665'>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="L666" class="LineNr">666 </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="L667" class="LineNr">667 </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="L668" class="LineNr">668 </span>  <span class="Comment">// strip stuff in parens from the name</span>
+<span id="L669" class="LineNr">669 </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="L670" class="LineNr">670 </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="L671" class="LineNr">671 </span><span class="Delimiter">}</span>
+<span id="L672" class="LineNr">672 </span>
+<span id="L673" class="LineNr">673 </span>string <a href='033check_operands.cc.html#L673'>tolower</a><span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L674" class="LineNr">674 </span>  ostringstream out<span class="Delimiter">;</span>
+<span id="L675" class="LineNr">675 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">nada</span><span class="Comment">*/</span><span class="Delimiter">;</span>  *s<span class="Delimiter">;</span>  ++s<span class="Delimiter">)</span>
+<span id="L676" class="LineNr">676 </span>    out &lt;&lt; <span class="Normal">static_cast</span>&lt;<span class="Normal">char</span>&gt;<span class="Delimiter">(</span><a href='033check_operands.cc.html#L673'>tolower</a><span class="Delimiter">(</span>*s<span class="Delimiter">));</span>
+<span id="L677" class="LineNr">677 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
+<span id="L678" class="LineNr">678 </span><span class="Delimiter">}</span>
+<span id="L679" class="LineNr">679 </span>
+<span id="L680" class="LineNr">680 </span><span class="PreProc">#undef HAS</span>
+<span id="L681" class="LineNr">681 </span><span class="PreProc">#undef SET</span>
+<span id="L682" class="LineNr">682 </span><span class="PreProc">#undef CLEAR</span>
+<span id="L683" class="LineNr">683 </span>
+<span id="L684" class="LineNr">684 </span><span class="Delimiter">:(before &quot;End Includes&quot;)</span>
+<span id="L685" class="LineNr">685 </span><span class="PreProc">#include</span><span class="Constant">&lt;cctype&gt;</span>
 </pre>
 </body>
 </html>