about summary refs log tree commit diff stats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* xep-0308: enable corrections for outgoing encrypted messagesMichael Vetter2020-02-128-44/+55
|
* Distinguish between _win_print() and _win_printf()Michael Vetter2020-02-121-19/+17
| | | | | | | | | | | | | | | | | | | | _win_print() and _win_printf() sound like they are the same. But actually they are something totally different. I renamed _win_print() to _win_print_internal() for that reason. It's more about actually drawing to the ncurses window. _win_printf() calls _win_print() and also writes the text to the window buffer. Which _win_print() didn't, it was really just the ncurses specific things. In some cases there is _win_print_internal() called after a buffer_append() in those cases it might be more correct to actually call _win_printf(). It was not done so far. But probably is better. But will mean a bit more operations. I'll have to check this later.
* Rename win_correct_incoming to win_correctMichael Vetter2020-02-121-4/+4
| | | | and make it static.
* xep-0308: update the UI upon sending a corrected messageMichael Vetter2020-02-118-24/+37
| | | | | So far we don't do this for encrypted messages. Still needs to be done. And MUC also needs to be done.
* xep-0308: Implement `/correct` to correct the last send messageMichael Vetter2020-02-1013-11/+132
| | | | | | | | So far the correction is sent. But the UI in Profanity itself is not updated. Also autocompletion for `/correct` with the last sent message is missing.
* xep-0308: make correction.char themeableMichael Vetter2020-02-101-0/+8
|
* xep-0308: create setting to toggle lmcMichael Vetter2020-02-107-11/+27
| | | | and print settings if only `/correction` is run.
* xep-0308: set correction char in configMichael Vetter2020-02-105-1/+58
|
* xep-0308: add `correction` autocompletionMichael Vetter2020-02-104-0/+48
|
* xep-0308: Initial support for incoming LMCMichael Vetter2020-02-105-7/+75
|
* avatar: use unique id for stanza idMichael Vetter2020-02-073-7/+10
| | | | "retrieve1" should have been only for testing.
* Clear buffer upon /clearMichael Vetter2020-02-071-0/+2
| | | | | | | | I think both the window and the buffer should also be cleared in case `/clear` is issue and persist_history is off. Otherwise it could happen that win_redraw() redraws the whole content of the buffer again.
* Set PREF_COLOR_NICK to false by defaultMichael Vetter2020-02-061-1/+1
|
* Add default pref for PREF_COLOR_NICKPaul Fariello2020-02-051-0/+2
| | | | Fix a segfault if corresponding preference is not saved in config file.
* rosterwin: end correct colorsMichael Vetter2020-02-031-1/+1
| | | | | Actually presence_colour should be stopped there. Thanks to rumin-miller for finding this.
* Add `/omemo char` autocompletionMichael Vetter2020-02-031-0/+1
| | | | Seems this got forgotten.
* Add context to autocomplete_with_func and use it for omemo trust commandPaul Fariello2020-01-3123-129/+159
| | | | Fix #1068
* fix: Initialize variable in stanza_get_oldest_delay()Michael Vetter2020-01-301-1/+1
|
* Fix error in stanza_get_oldest_delay()Michael Vetter2020-01-301-3/+3
| | | | Introduced in bf2e09feee1697c570fcfb9e1e44a8ec991bd196.
* muc: save oldest timestampMichael Vetter2020-01-303-3/+38
| | | | | | | | | | | | | | | | | | So far we saved the timestamp which also had the `from`. But we need this only to find out whether it's MUC history. For displaying we should use the oldest delay timestamp. Also in https://github.com/profanity-im/profanity/commit/61f66966ddfe8ebd8bae26dd7ff92d777004edda#diff-4926fd4577a336bd3eb240f8104a5c5bL837 a error was introduced. Before we saved the timestamp in all cases. And only if timestamp AND from was given we went into MUC history case. Normal timestamp saving was not done anymore only if it also had a from attribute. Regards https://github.com/profanity-im/profanity/issues/1254
* stanza: Refactor stanza_get_delay_from()Michael Vetter2020-01-301-26/+49
| | | | Have two helper functions one for XEP-0203 and one for XEP-0091.
* Change theme handlingMichael Vetter2020-01-296-17/+51
| | | | | | | | | | | | | | | | So far when loading a theme it also overwrote the preferences the user set. Lengthy discussion can be found at https://github.com/profanity-im/profanity/issues/1077 Now we use `/theme load themename` to load the [colours] part of a themem only. `/theme full-load themename` will load the complete theme including preferences set in there. Regards https://github.com/profanity-im/profanity/issues/1077
* Add comments to preferences.cMichael Vetter2020-01-291-2/+2
|
* Refactor theme.cMichael Vetter2020-01-291-27/+44
| | | | | | Make _theme_list_dir() static. Sort _load_preferences() loadings accoding to type. Add comments.
* Revert "Save first delay tag as timestamp"Michael Vetter2020-01-281-9/+0
| | | | | | | | This reverts commit ef00b10c90aef8b75415fae558789d21bb975d75. According to reply by user in https://github.com/profanity-im/profanity/issues/1254#issuecomment-578389784 it didn't help.
* Save first delay tag as timestampMichael Vetter2020-01-241-0/+9
| | | | | | | | | | | | So far we got the first delay with a from that comes from the server. This way we know it's MUC history. Now we take the first time stamp we actually find. Which is likely the one being added first. And should contain the correct time to display. It would be nicer to actually compare the dates though. Regards https://github.com/profanity-im/profanity/issues/1254
* XEP-0092: Add configuration option to choose whether to send OS nameMichael Vetter2020-01-246-1/+36
| | | | | `/os on|off` now let's one choose whether to include the OS name once `/software` (XEP-0092) is ran on us.
* Fix typo in commentMichael Vetter2020-01-231-1/+1
|
* xep-0092: add config option to set whether OS is revealedMichael Vetter2020-01-233-14/+27
| | | | | | Default is on. `revail.os=false` in the `connection` section of the config can disable it. A command to configure this will follow.
* xep-0092: send OS tooMichael Vetter2020-01-231-0/+23
| | | | | So far we only sent client name and version. Let's also send the OS name.
* Add option to notify about version requestMichael Vetter2020-01-233-0/+12
| | | | | | | | | | Cannot be configured for now. Can be set via `adv.notify.discoversion` in the `notification` section. Will notify about version requests via XEP-0092 and XEP-0232. Client version can still be seen via caps (capabilities). See `stanza_attach_caps()`.
* Add myself to copyrightMichael Vetter2020-01-232-0/+2
|
* Refactor rosterwin_roster()Michael Vetter2020-01-231-18/+17
| | | | Use helper function for duplicate code.
* Fix titlebar and rosterbar descriptionMichael Vetter2020-01-231-3/+2
|
* Add option to display MUC name or JID in titlebarMichael Vetter2020-01-239-9/+77
| | | | Add `/titlebar use [name|jid]`.
* Display MUC name in titlebarMichael Vetter2020-01-231-1/+8
|
* Fix spacing in titlebar.cMichael Vetter2020-01-231-2/+0
|
* Print `roster rooms use` in info pageMichael Vetter2020-01-231-0/+4
|
* Respect `/roster room use` setting also when sorted for serviceMichael Vetter2020-01-231-8/+14
|
* NULL room_name in win_create_muc()Michael Vetter2020-01-231-0/+1
|
* Add `/roster room use` autocompletionMichael Vetter2020-01-231-0/+12
|
* Add `/roster room use` commandMichael Vetter2020-01-236-2/+48
| | | | | | | `/roster room use name` to use the name of the MUC in the roster list. `/roster room use jid` to use the jid of the MUC in the roster list. Display it only in case `/roster room by none` is set so far.
* Save MUC room name in ProfMucWinMichael Vetter2020-01-233-0/+6
| | | | We will need this if we want to display the Name instead of the JID.
* xep-0084: use hash table for avatar lookupMichael Vetter2020-01-221-8/+11
|
* XEP-0392: get background color from themeMichael Vetter2020-01-223-1/+17
| | | | | | | So far we just used -1 (default color). Now we actually check whether `bkgnd` is set in the theme file and use this if available. Fix https://github.com/profanity-im/profanity/issues/1255
* rosterwin: remove duplicate ifMichael Vetter2020-01-221-3/+0
|
* Add support for 12 bytes IVPaul Fariello2020-01-203-4/+4
| | | | | | | 16 bytes IV should be used. Some clients can't use it so we should also support decrypting 12 bytes IV. Fix #1253
* Fix maybe uninitialized and don't guard g_freePaul Fariello2020-01-201-17/+14
|
* Ignore invalid base64 in OMEMO stanzasPaul Fariello2020-01-201-10/+44
| | | | Fixes #1239
* Use OMEMO for offline MUC members (#1242)Paul Fariello2020-01-208-37/+128
|
n class="p">> 2 </span><span class="Comment">//: an x86 instruction they're for.</span> <span id="L3" class="LineNr"> 3 </span><span class="Comment">//:</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment">//: The x86 instruction set is variable-length, and how a byte is interpreted</span> <span id="L5" class="LineNr"> 5 </span><span class="Comment">//: affects later instruction boundaries. A lot of the pain in programming</span> <span id="L6" class="LineNr"> 6 </span><span class="Comment">//: machine code stems from computer and programmer going out of sync on what</span> <span id="L7" class="LineNr"> 7 </span><span class="Comment">//: a byte means. The miscommunication is usually not immediately caught, and</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">//: metastasizes at runtime into kilobytes of misinterpreted instructions.</span> <span id="L9" class="LineNr"> 9 </span><span class="Comment">//:</span> <span id="L10" class="LineNr"> 10 </span><span class="Comment">//: To mitigate these issues, we'll start programming in terms of logical</span> <span id="L11" class="LineNr"> 11 </span><span class="Comment">//: operands rather than physical bytes. Some operands are smaller than a</span> <span id="L12" class="LineNr"> 12 </span><span class="Comment">//: byte, and others may consist of multiple bytes. This layer will correctly</span> <span id="L13" class="LineNr"> 13 </span><span class="Comment">//: pack and order the bytes corresponding to the operands in an instruction.</span> <span id="L14" class="LineNr"> 14 </span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Texts&quot;)</span> <span id="L16" class="LineNr"> 16 </span><a href='001help.cc.html#L262'>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;instructions&quot;</span><span class="Delimiter">,</span> <span id="L17" class="LineNr"> 17 </span> <span class="Constant">&quot;Each x86 instruction consists of an instruction or opcode and some number\n&quot;</span> <span id="L18" class="LineNr"> 18 </span> <span class="Constant">&quot;of operands.\n&quot;</span> <span id="L19" class="LineNr"> 19 </span> <span class="Constant">&quot;Each operand has a type. An instruction won't have more than one operand of\n&quot;</span> <span id="L20" class="LineNr"> 20 </span> <span class="Constant">&quot;any type.\n&quot;</span> <span id="L21" class="LineNr"> 21 </span> <span class="Constant">&quot;Each instruction has some set of allowed operand types. It'll reject others.\n&quot;</span> <span id="L22" class="LineNr"> 22 </span> <span class="Constant">&quot;The complete list of operand <a href='031check_operands.cc.html#L434'>types</a>: mod, subop, r32 (register), rm32\n&quot;</span> <span id="L23" class="LineNr"> 23 </span> <span class="Constant">&quot;(register or memory), scale, index, base, disp8, disp16, disp32, imm8,\n&quot;</span> <span id="L24" class="LineNr"> 24 </span> <span class="Constant">&quot;imm32.\n&quot;</span> <span id="L25" class="LineNr"> 25 </span> <span class="Constant">&quot;Each of these has its own help page. Try reading 'subx help mod' next.\n&quot;</span> <span id="L26" class="LineNr"> 26 </span><span class="Delimiter">);</span> <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Contents&quot;)</span> <span id="L28" class="LineNr"> 28 </span>cerr &lt;&lt; <span class="Constant">&quot; instructions\n&quot;</span><span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(scenario pack_immediate_constants)</span> <span id="L31" class="LineNr"> 31 </span>== <span class="Constant">0x1</span> <span id="L32" class="LineNr"> 32 </span>bb <span class="Constant">0x2a</span>/imm32 <span id="L33" class="LineNr"> 33 </span><span class="traceContains">+transform: packing instruction 'bb 0x2a/imm32'</span> <span id="L34" class="LineNr"> 34 </span><span class="traceContains">+transform: instruction after packing: 'bb 2a 00 00 00'</span> <span id="L35" class="LineNr"> 35 </span><span class="traceContains">+run: copy <a href='037heap.cc.html#L23'>imm32</a> 0x0000002a to <a href='010---vm.cc.html#L16'>EBX</a></span> <span id="L36" class="LineNr"> 36 </span> <span id="L37" class="LineNr"> 37 </span><span class="Comment">//: complete set of valid operand types</span> <span id="L38" class="LineNr"> 38 </span> <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span> <span id="L40" class="LineNr"> 40 </span>set&lt;string&gt; <span class="Special"><a href='030---operands.cc.html#L40'>Instruction_operands</a></span><span class="Delimiter">;</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span> <span id="L42" class="LineNr"> 42 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L43" class="LineNr"> 43 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L44" class="LineNr"> 44 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L45" class="LineNr"> 45 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L46" class="LineNr"> 46 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L47" class="LineNr"> 47 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L48" class="LineNr"> 48 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L49" class="LineNr"> 49 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L50" class="LineNr"> 50 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L51" class="LineNr"> 51 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L52" class="LineNr"> 52 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L53" class="LineNr"> 53 </span><span class="Special"><a href='030---operands.cc.html#L40'>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="L54" class="LineNr"> 54 </span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Texts&quot;)</span> <span id="L56" class="LineNr"> 56 </span><a href='030---operands.cc.html#L58'>init_operand_type_help</a><span class="Delimiter">();</span> <span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(code)</span> <span id="L58" class="LineNr"> 58 </span><span class="Normal">void</span> <a href='030---operands.cc.html#L58'>init_operand_type_help</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L59" class="LineNr"> 59 </span> <a href='001help.cc.html#L252'>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="L60" class="LineNr"> 60 </span> <span class="Constant">&quot;2-bit operand controlling the _addressing mode_ of many instructions,\n&quot;</span> <span id="L61" class="LineNr"> 61 </span> <span class="Constant">&quot;to determine how to compute the _effective address_ to look up memory at\n&quot;</span> <span id="L62" class="LineNr"> 62 </span> <span class="Constant">&quot;based on the 'rm32' operand and potentially others.\n&quot;</span> <span id="L63" class="LineNr"> 63 </span> <span class="Constant">&quot;\n&quot;</span> <span id="L64" class="LineNr"> 64 </span> <span class="Constant">&quot;If mod = 3, just operate on the <a href='003trace.cc.html#L74'>contents</a> of the register specified by rm32\n&quot;</span> <span id="L65" class="LineNr"> 65 </span> <span class="Constant">&quot; (direct mode).\n&quot;</span> <span id="L66" class="LineNr"> 66 </span> <span class="Constant">&quot;If mod = 2, effective address is usually* rm32 + disp32\n&quot;</span> <span id="L67" class="LineNr"> 67 </span> <span class="Constant">&quot; (indirect mode with displacement).\n&quot;</span> <span id="L68" class="LineNr"> 68 </span> <span class="Constant">&quot;If mod = 1, effective address is usually* rm32 + disp8\n&quot;</span> <span id="L69" class="LineNr"> 69 </span> <span class="Constant">&quot; (indirect mode with displacement).\n&quot;</span> <span id="L70" class="LineNr"> 70 </span> <span class="Constant">&quot;If mod = 0, effective address is usually* rm32 (indirect mode).\n&quot;</span> <span id="L71" class="LineNr"> 71 </span> <span class="Constant">&quot;(* - The exception is when rm32 is '4'. Register 4 is the stack pointer (ESP).\n&quot;</span> <span id="L72" class="LineNr"> 72 </span> <span class="Constant">&quot; Using it as an address gets more involved. For more details,\n&quot;</span> <span id="L73" class="LineNr"> 73 </span> <span class="Constant">&quot; try reading the help pages for 'base', 'index' and 'scale'.)\n&quot;</span> <span id="L74" class="LineNr"> 74 </span> <span class="Constant">&quot;\n&quot;</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">&quot;For complete details, spend some time with two tables in the IA-32 software\n&quot;</span> <span id="L76" class="LineNr"> 76 </span> <span class="Constant">&quot;developer's manual that are also included in this repo:\n&quot;</span> <span id="L77" class="LineNr"> 77 </span> <span class="Constant">&quot; - modrm.pdf: volume 2, table 2-2, \&quot;</span><span class="Constant">32</span>-bit addressing with the ModR/<span class="Special">M</span> byte<span class="Delimiter">.</span>\<span class="Constant">&quot;.\n&quot;</span> <span id="L78" class="LineNr"> 78 </span> <span class="Constant">&quot; - sib.pdf: volume 2, table 2-3, \&quot;</span><span class="Constant">32</span>-bit addressing with the SIB byte<span class="Delimiter">.</span>\<span class="Constant">&quot;.\n&quot;</span> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">);</span> <span id="L80" class="LineNr"> 80 </span> <a href='001help.cc.html#L252'>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;subop&quot;</span><span class="Delimiter">,</span> <span id="L81" class="LineNr"> 81 </span> <span class="Constant">&quot;Additional 3-bit operand for determining the instruction when the opcode is 81, 8f or ff.\n&quot;</span> <span id="L82" class="LineNr"> 82 </span> <span class="Constant">&quot;Can't coexist with operand of type 'r32' in a single instruction, because the two use the same bits.\n&quot;</span> <span id="L83" class="LineNr"> 83 </span> <span class="Delimiter">);</span> <span id="L84" class="LineNr"> 84 </span> <a href='001help.cc.html#L252'>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;r32&quot;</span><span class="Delimiter">,</span> <span id="L85" class="LineNr"> 85 </span> <span class="Constant">&quot;3-bit operand specifying a register operand used directly, without any further addressing modes.\n&quot;</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">);</span> <span id="L87" class="LineNr"> 87 </span> <a href='001help.cc.html#L252'>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;rm32&quot;</span><span class="Delimiter">,</span> <span id="L88" class="LineNr"> 88 </span> <span class="Constant">&quot;32-bit value in register or memory. The precise details of its construction\n&quot;</span> <span id="L89" class="LineNr"> 89 </span> <span class="Constant">&quot;depend on the eponymous 3-bit 'rm32' operand, the 'mod' operand, and also\n&quot;</span> <span id="L90" class="LineNr"> 90 </span> <span class="Constant">&quot;potentially the 'SIB' operands ('scale', 'index' and 'base') and a displacement\n&quot;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Constant">&quot;('disp8' or 'disp32').\n&quot;</span> <span id="L92" class="LineNr"> 92 </span> <span class="Constant">&quot;\n&quot;</span> <span id="L93" class="LineNr"> 93 </span> <span class="Constant">&quot;For complete details, spend some time with two tables in the IA-32 software\n&quot;</span> <span id="L94" class="LineNr"> 94 </span> <span class="Constant">&quot;developer's manual that are also included in this repo:\n&quot;</span> <span id="L95" class="LineNr"> 95 </span> <span class="Constant">&quot; - modrm.pdf: volume 2, table 2-2, \&quot;</span><span class="Constant">32</span>-bit addressing with the ModR/<span class="Special">M</span> byte<span class="Delimiter">.</span>\<span class="Constant">&quot;.\n&quot;</span> <span id="L96" class="LineNr"> 96 </span> <span class="Constant">&quot; - sib.pdf: volume 2, table 2-3, \&quot;</span><span class="Constant">32</span>-bit addressing with the SIB byte<span class="Delimiter">.</span>\<span class="Constant">&quot;.\n&quot;</span> <span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">);</span> <span id="L98" class="LineNr"> 98 </span> <a href='001help.cc.html#L252'>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;base&quot;</span><span class="Delimiter">,</span> <span id="L99" class="LineNr"> 99 </span> <span class="Constant">&quot;Additional 3-bit operand (when 'rm32' is 4, unless 'mod' is 3) specifying the\n&quot;</span> <span id="L100" class="LineNr">100 </span> <span class="Constant">&quot;register containing an address to look up.\n&quot;</span> <span id="L101" class="LineNr">101 </span> <span class="Constant">&quot;This address may be further modified by 'index' and 'scale' operands.\n&quot;</span> <span id="L102" class="LineNr">102 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or disp32)\n&quot;</span> <span id="L103" class="LineNr">103 </span> <span class="Constant">&quot;For complete details, spend some time with the IA-32 software developer's manual,\n&quot;</span> <span id="L104" class="LineNr">104 </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="L105" class="LineNr">105 </span> <span class="Constant">&quot;It is included in this repository as 'sib.pdf'.\n&quot;</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">);</span> <span id="L107" class="LineNr">107 </span> <a href='001help.cc.html#L252'>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="L108" class="LineNr">108 </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="L109" class="LineNr">109 </span> <span class="Constant">&quot;the 'base' operand to compute the 'effective address' at which to look up memory.\n&quot;</span> <span id="L110" class="LineNr">110 </span> <span class="Constant">&quot; effective address = base + index*scale + displacement (disp8 or disp32)\n&quot;</span> <span id="L111" class="LineNr">111 </span> <span class="Constant">&quot;For complete details, spend some time with the IA-32 software developer's manual,\n&quot;</span> <span id="L112" class="LineNr">112 </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="L113" class="LineNr">113 </span> <span class="Constant">&quot;It is included in this repository as 'sib.pdf'.\n&quot;</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">);</span> <span id="L115" class="LineNr">115 </span> <a href='001help.cc.html#L252'>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;scale&quot;</span><span class="Delimiter">,</span> <span id="L116" class="LineNr">116 </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="L117" class="LineNr">117 </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="L118" class="LineNr">118 </span> <span class="Constant">&quot;the 'base' operand to compute the _effective address_ to operate on.\n&quot;</span> <span id="L119" class="LineNr">119 </span> <span class="Constant">&quot; effective address = base + index * scale + displacement (disp8 or disp32)\n&quot;</span> <span id="L120" class="LineNr">120 </span> <span class="Constant">&quot;\n&quot;</span> <span id="L121" class="LineNr">121 </span> <span class="Constant">&quot;When scale is 0, use index unmodified.\n&quot;</span> <span id="L122" class="LineNr">122 </span> <span class="Constant">&quot;When scale is 1, multiply index by 2.\n&quot;</span> <span id="L123" class="LineNr">123 </span> <span class="Constant">&quot;When scale is 2, multiply index by 4.\n&quot;</span> <span id="L124" class="LineNr">124 </span> <span class="Constant">&quot;When scale is 3, multiply index by 8.\n&quot;</span> <span id="L125" class="LineNr">125 </span> <span class="Constant">&quot;\n&quot;</span> <span id="L126" class="LineNr">126 </span> <span class="Constant">&quot;For complete details, spend some time with the IA-32 software developer's manual,\n&quot;</span> <span id="L127" class="LineNr">127 </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="L128" class="LineNr">128 </span> <span class="Constant">&quot;It is included in this repository as 'sib.pdf'.\n&quot;</span> <span id="L129" class="LineNr">129 </span> <span class="Delimiter">);</span> <span id="L130" class="LineNr">130 </span> <a href='001help.cc.html#L252'>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;disp8&quot;</span><span class="Delimiter">,</span> <span id="L131" class="LineNr">131 </span> <span class="Constant">&quot;8-bit value to be added in many instructions.\n&quot;</span> <span id="L132" class="LineNr">132 </span> <span class="Delimiter">);</span> <span id="L133" class="LineNr">133 </span> <a href='001help.cc.html#L252'>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;disp16&quot;</span><span class="Delimiter">,</span> <span id="L134" class="LineNr">134 </span> <span class="Constant">&quot;16-bit value to be added in many instructions.\n&quot;</span> <span id="L135" class="LineNr">135 </span> <span class="Delimiter">);</span> <span id="L136" class="LineNr">136 </span> <a href='001help.cc.html#L252'>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;disp32&quot;</span><span class="Delimiter">,</span> <span id="L137" class="LineNr">137 </span> <span class="Constant">&quot;32-bit value to be added in many instructions.\n&quot;</span> <span id="L138" class="LineNr">138 </span> <span class="Delimiter">);</span> <span id="L139" class="LineNr">139 </span> <a href='001help.cc.html#L252'>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;imm8&quot;</span><span class="Delimiter">,</span> <span id="L140" class="LineNr">140 </span> <span class="Constant">&quot;8-bit value for many instructions.\n&quot;</span> <span id="L141" class="LineNr">141 </span> <span class="Delimiter">);</span> <span id="L142" class="LineNr">142 </span> <a href='001help.cc.html#L252'>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;imm32&quot;</span><span class="Delimiter">,</span> <span id="L143" class="LineNr">143 </span> <span class="Constant">&quot;32-bit value for many instructions.\n&quot;</span> <span id="L144" class="LineNr">144 </span> <span class="Delimiter">);</span> <span id="L145" class="LineNr">145 </span><span class="Delimiter">}</span> <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="SalientComment">//:: transform packing operands into bytes in the right order</span> <span id="L148" class="LineNr">148 </span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">:(after &quot;Begin Transforms&quot;)</span> <span id="L150" class="LineNr">150 </span><span class="Comment">// Begin Level-2 Transforms</span> <span id="L151" class="LineNr">151 </span><span class="Special"><a href='011run.cc.html#L229'>Transform</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pack_operands<span class="Delimiter">);</span> <span id="L152" class="LineNr">152 </span><span class="Comment">// End Level-2 Transforms</span> <span id="L153" class="LineNr">153 </span> <span id="L154" class="LineNr">154 </span><span class="Delimiter">:(code)</span> <span id="L155" class="LineNr">155 </span><span class="Normal">void</span> pack_operands<span class="Delimiter">(</span>program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L156" class="LineNr">156 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L100'>segments</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L157" class="LineNr">157 </span> segment&amp; <a href='031check_operands.cc.html#L11'>code</a> = p<span class="Delimiter">.</span><a href='011run.cc.html#L100'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L158" class="LineNr">158 </span> <span class="Comment">// Pack Operands(segment code)</span> <span id="L159" class="LineNr">159 </span> <a href='003trace.cc.html#L183'>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;-- pack operands&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span id="L160" class="LineNr">160 </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#L166'>SIZE</a><span class="Delimiter">(</span><a href='031check_operands.cc.html#L11'>code</a><span class="Delimiter">.</span><a href='011run.cc.html#L109'>lines</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L161" class="LineNr">161 </span> line&amp; inst = <a href='031check_operands.cc.html#L11'>code</a><span class="Delimiter">.</span><a href='011run.cc.html#L109'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L162" class="LineNr">162 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L379'>all_hex_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L183'>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="L164" class="LineNr">164 </span> pack_operands<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> <span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L183'>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> <span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span> <span id="L167" class="LineNr">167 </span><span class="Delimiter">}</span> <span id="L168" class="LineNr">168 </span> <span id="L169" class="LineNr">169 </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="L170" class="LineNr">170 </span> <a href='011run.cc.html#L117'>line</a> new_inst<span class="Delimiter">;</span> <span id="L171" class="LineNr">171 </span> <a href='030---operands.cc.html#L179'>add_opcodes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span> <span id="L172" class="LineNr">172 </span> <a href='030---operands.cc.html#L189'>add_modrm_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span> <span id="L173" class="LineNr">173 </span> <a href='030---operands.cc.html#L215'>add_sib_byte</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span> <span id="L174" class="LineNr">174 </span> <a href='030---operands.cc.html#L237'>add_disp_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span> <span id="L175" class="LineNr">175 </span> <a href='030---operands.cc.html#L249'>add_imm_bytes</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> new_inst<span class="Delimiter">);</span> <span id="L176" class="LineNr">176 </span> inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><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="Normal">void</span> <a href='030---operands.cc.html#L179'>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="L180" class="LineNr">180 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span id="L181" class="LineNr">181 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>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#L118'>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#L118'>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="L182" class="LineNr">182 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span> <span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>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> &amp;&amp; in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span> <span id="L184" class="LineNr">184 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span> <span id="L185" class="LineNr">185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>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> &amp;&amp; in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>data == <span class="Constant">&quot;0f&quot;</span><span class="Delimiter">)</span> <span id="L186" class="LineNr">186 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><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='030---operands.cc.html#L189'>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="L190" class="LineNr">190 </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="L191" class="LineNr">191 </span> <span class="Normal">bool</span> emit =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L192" class="LineNr">192 </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#L166'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L193" class="LineNr">193 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L194" class="LineNr">194 </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;mod&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L195" class="LineNr">195 </span> mod = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L196" class="LineNr">196 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </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;rm32&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L199" class="LineNr">199 </span> rm32 = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L200" class="LineNr">200 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span> <span id="L202" class="LineNr">202 </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;r32&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L203" class="LineNr">203 </span> reg_subop = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L205" class="LineNr">205 </span> <span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </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;subop&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L207" class="LineNr">207 </span> reg_subop = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L208" class="LineNr">208 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L209" class="LineNr">209 </span> <span class="Delimiter">}</span> <span id="L210" class="LineNr">210 </span> <span class="Delimiter">}</span> <span id="L211" class="LineNr">211 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>emit<span class="Delimiter">)</span> <span id="L212" class="LineNr">212 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030---operands.cc.html#L279'>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="L213" class="LineNr">213 </span><span class="Delimiter">}</span> <span id="L214" class="LineNr">214 </span> <span id="L215" class="LineNr">215 </span><span class="Normal">void</span> <a href='030---operands.cc.html#L215'>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="L216" class="LineNr">216 </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="L217" class="LineNr">217 </span> <span class="Normal">bool</span> emit =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L218" class="LineNr">218 </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#L166'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L219" class="LineNr">219 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L220" class="LineNr">220 </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;scale&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L221" class="LineNr">221 </span> scale = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L222" class="LineNr">222 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L223" class="LineNr">223 </span> <span class="Delimiter">}</span> <span id="L224" class="LineNr">224 </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;index&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L225" class="LineNr">225 </span> index = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L226" class="LineNr">226 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L227" class="LineNr">227 </span> <span class="Delimiter">}</span> <span id="L228" class="LineNr">228 </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;base&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L229" class="LineNr">229 </span> base = <a href='011run.cc.html#L273'>hex_byte</a><span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L230" class="LineNr">230 </span> emit =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L231" class="LineNr">231 </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">if</span> <span class="Delimiter">(</span>emit<span class="Delimiter">)</span> <span id="L234" class="LineNr">234 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030---operands.cc.html#L279'>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="L235" class="LineNr">235 </span><span class="Delimiter">}</span> <span id="L236" class="LineNr">236 </span> <span id="L237" class="LineNr">237 </span><span class="Normal">void</span> <a href='030---operands.cc.html#L237'>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="L238" class="LineNr">238 </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#L166'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L239" class="LineNr">239 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L240" class="LineNr">240 </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> <span id="L241" class="LineNr">241 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L242" class="LineNr">242 </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;disp16&quot;</span><span class="Delimiter">))</span> <span id="L243" class="LineNr">243 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L244" class="LineNr">244 </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;disp32&quot;</span><span class="Delimiter">))</span> <span id="L245" class="LineNr">245 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">4</span><span class="Delimiter">);</span> <span id="L246" class="LineNr">246 </span> <span class="Delimiter">}</span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span> <span id="L248" class="LineNr">248 </span> <span id="L249" class="LineNr">249 </span><span class="Normal">void</span> <a href='030---operands.cc.html#L249'>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="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#L166'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L251" class="LineNr">251 </span> <span class="Normal">const</span> word&amp; curr = in<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L252" class="LineNr">252 </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> <span id="L253" class="LineNr">253 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L254" class="LineNr">254 </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;imm32&quot;</span><span class="Delimiter">))</span> <span id="L255" class="LineNr">255 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">4</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="Delimiter">}</span> <span id="L258" class="LineNr">258 </span> <span id="L259" class="LineNr">259 </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="L260" class="LineNr">260 </span> assert<span class="Delimiter">(</span>num &lt;= <span class="Constant">4</span><span class="Delimiter">);</span> <span id="L261" class="LineNr">261 </span> <span class="Normal">bool</span> is_number = <a href='030---operands.cc.html#L439'>looks_like_hex_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span> <span id="L262" class="LineNr">262 </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="L263" class="LineNr">263 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>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="L264" class="LineNr">264 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_number<span class="Delimiter">)</span> <span id="L265" class="LineNr">265 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">().</span>data = <a href='030---operands.cc.html#L286'>hex_byte_to_string</a><span class="Delimiter">(</span><a href='011run.cc.html#L362'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">));</span> <span id="L266" class="LineNr">266 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L267" class="LineNr">267 </span> <span class="Delimiter">}</span> <span id="L268" class="LineNr">268 </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='011run.cc.html#L362'>parse_int</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">)),</span> num<span class="Delimiter">);</span> <span id="L269" class="LineNr">269 </span><span class="Delimiter">}</span> <span id="L270" class="LineNr">270 </span> <span id="L271" class="LineNr">271 </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="L272" class="LineNr">272 </span> assert<span class="Delimiter">(</span>num &lt;= <span class="Constant">4</span><span class="Delimiter">);</span> <span id="L273" class="LineNr">273 </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="L274" class="LineNr">274 </span> out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030---operands.cc.html#L279'>hex_byte_text</a><span class="Delimiter">(</span>val &amp; <span class="Constant">0xff</span><span class="Delimiter">));</span> <span id="L275" class="LineNr">275 </span> val = val &gt;&gt; <span class="Constant">8</span><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 id="L279" class="LineNr">279 </span><a href='011run.cc.html#L123'>word</a> <a href='030---operands.cc.html#L279'>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="L280" class="LineNr">280 </span> <a href='011run.cc.html#L123'>word</a> result<span class="Delimiter">;</span> <span id="L281" class="LineNr">281 </span> result<span class="Delimiter">.</span>data = <a href='030---operands.cc.html#L286'>hex_byte_to_string</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span> <span id="L282" class="LineNr">282 </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="L283" class="LineNr">283 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L284" class="LineNr">284 </span><span class="Delimiter">}</span> <span id="L285" class="LineNr">285 </span> <span id="L286" class="LineNr">286 </span>string <a href='030---operands.cc.html#L286'>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="L287" class="LineNr">287 </span> ostringstream out<span class="Delimiter">;</span> <span id="L288" class="LineNr">288 </span> <span class="Comment">// uint8_t prints without padding, but int8_t will expand to 32 bits again</span> <span id="L289" class="LineNr">289 </span> out &lt;&lt; <a href='010---vm.cc.html#L412'>HEXBYTE</a> &lt;&lt; <a href='010---vm.cc.html#L415'>NUM</a><span class="Delimiter">(</span>val<span class="Delimiter">);</span> <span id="L290" class="LineNr">290 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L291" class="LineNr">291 </span><span class="Delimiter">}</span> <span id="L292" class="LineNr">292 </span> <span id="L293" class="LineNr">293 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;word&gt;&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L294" class="LineNr">294 </span> ostringstream out<span class="Delimiter">;</span> <span id="L295" class="LineNr">295 </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#L166'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L296" class="LineNr">296 </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">' '</span><span class="Delimiter">;</span> <span id="L297" class="LineNr">297 </span> out &lt;&lt; in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>data<span class="Delimiter">;</span> <span id="L298" class="LineNr">298 </span> <span class="Delimiter">}</span> <span id="L299" class="LineNr">299 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L300" class="LineNr">300 </span><span class="Delimiter">}</span> <span id="L301" class="LineNr">301 </span> <span id="L302" class="LineNr">302 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span> <span id="L303" class="LineNr">303 </span><span class="Normal">void</span> <a href='030---operands.cc.html#L303'>test_preserve_metadata_when_emitting_single_byte</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L304" class="LineNr">304 </span> <a href='011run.cc.html#L123'>word</a> in<span class="Delimiter">;</span> <span id="L305" class="LineNr">305 </span> in<span class="Delimiter">.</span>data = <span class="Constant">&quot;f0&quot;</span><span class="Delimiter">;</span> <span id="L306" class="LineNr">306 </span> in<span class="Delimiter">.</span>original = <span class="Constant">&quot;f0/foo&quot;</span><span class="Delimiter">;</span> <span id="L307" class="LineNr">307 </span> <a href='011run.cc.html#L117'>line</a> out<span class="Delimiter">;</span> <span id="L308" class="LineNr">308 </span> emit_hex_bytes<span class="Delimiter">(</span>out<span class="Delimiter">,</span> in<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L309" class="LineNr">309 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>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> <span class="Constant">&quot;f0&quot;</span><span class="Delimiter">);</span> <span id="L310" class="LineNr">310 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>out<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original<span class="Delimiter">,</span> <span class="Constant">&quot;f0/foo&quot;</span><span class="Delimiter">);</span> <span id="L311" class="LineNr">311 </span><span class="Delimiter">}</span> <span id="L312" class="LineNr">312 </span> <span id="L313" class="LineNr">313 </span><span class="Delimiter">:(scenario pack_disp8)</span> <span id="L314" class="LineNr">314 </span>== <span class="Constant">0x1</span> <span id="L315" class="LineNr">315 </span><span class="Constant">74</span> <span class="Constant">2</span>/disp8 <span class="Comment"># jump 2 bytes away if ZF is set</span> <span id="L316" class="LineNr">316 </span><span class="traceContains">+transform: packing instruction '74 2/disp8'</span> <span id="L317" class="LineNr">317 </span><span class="traceContains">+transform: instruction after packing: '74 02'</span> <span id="L318" class="LineNr">318 </span> <span id="L319" class="LineNr">319 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L320" class="LineNr">320 </span><span class="Delimiter">:(scenario pack_disp8_negative)</span> <span id="L321" class="LineNr">321 </span>== <span class="Constant">0x1</span> <span id="L322" class="LineNr">322 </span><span class="Comment"># running this will cause an infinite loop</span> <span id="L323" class="LineNr">323 </span><span class="Constant">74</span> -<span class="Constant">1</span>/disp8 <span class="Comment"># jump 1 byte before if ZF is set</span> <span id="L324" class="LineNr">324 </span><span class="traceContains">+transform: packing instruction '74 -1/disp8'</span> <span id="L325" class="LineNr">325 </span><span class="traceContains">+transform: instruction after packing: '74 ff'</span> <span id="L326" class="LineNr">326 </span><span class="Delimiter">:(scenarios run)</span> <span id="L327" class="LineNr">327 </span> <span id="L328" class="LineNr">328 </span><span class="Comment">//: helper for scenario</span> <span id="L329" class="LineNr">329 </span><span class="Delimiter">:(code)</span> <span id="L330" class="LineNr">330 </span><span class="Normal">void</span> <a href='011run.cc.html#L231'>transform</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; text_bytes<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L331" class="LineNr">331 </span> <a href='011run.cc.html#L99'>program</a> p<span class="Delimiter">;</span> <span id="L332" class="LineNr">332 </span> istringstream in<span class="Delimiter">(</span>text_bytes<span class="Delimiter">);</span> <span id="L333" class="LineNr">333 </span> parse<span class="Delimiter">(</span>in<span class="Delimiter">,</span> p<span class="Delimiter">);</span> <span id="L334" class="LineNr">334 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L204'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L335" class="LineNr">335 </span> <a href='011run.cc.html#L231'>transform</a><span class="Delimiter">(</span>p<span class="Delimiter">);</span> <span id="L336" class="LineNr">336 </span><span class="Delimiter">}</span> <span id="L337" class="LineNr">337 </span> <span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario pack_modrm_imm32)</span> <span id="L339" class="LineNr">339 </span>== <span class="Constant">0x1</span> <span id="L340" class="LineNr">340 </span><span class="Comment"># instruction effective address operand displacement immediate</span> <span id="L341" class="LineNr">341 </span><span class="Comment"># op subop mod rm32 base index scale r32</span> <span id="L342" class="LineNr">342 </span><span class="Comment"># 1-3 bytes 3 bits 2 bits 3 bits 3 bits 3 bits 2 bits 2 bits 0/1/2/4 bytes 0/1/2/4 bytes</span> <span id="L343" class="LineNr">343 </span> <span class="Constant">81</span> <span class="Constant">0</span>/add/subop <span class="Constant">3</span>/mod/direct <span class="Constant">3</span>/ebx/rm32 <span class="Constant">1</span>/imm32 <span class="Comment"># add 1 to EBX</span> <span id="L344" class="LineNr">344 </span><span class="traceContains">+transform: packing instruction '81 0/add/subop 3/mod/direct 3/ebx/rm32 1/imm32'</span> <span id="L345" class="LineNr">345 </span><span class="traceContains">+transform: instruction after packing: '81 c3 01 00 00 00'</span> <span id="L346" class="LineNr">346 </span> <span id="L347" class="LineNr">347 </span><span class="Delimiter">:(scenario pack_imm32_large)</span> <span id="L348" class="LineNr">348 </span>== <span class="Constant">0x1</span> <span id="L349" class="LineNr">349 </span>b9 <span class="Constant">0x080490a7</span>/imm32 <span id="L350" class="LineNr">350 </span><span class="traceContains">+transform: packing instruction 'b9 0x080490a7/imm32'</span> <span id="L351" class="LineNr">351 </span><span class="traceContains">+transform: instruction after packing: 'b9 a7 90 04 08'</span> <span id="L352" class="LineNr">352 </span> <span id="L353" class="LineNr">353 </span><span class="Delimiter">:(scenario pack_immediate_constants_hex)</span> <span id="L354" class="LineNr">354 </span>== <span class="Constant">0x1</span> <span id="L355" class="LineNr">355 </span>b9 <span class="Constant">0x2a</span>/imm32 <span id="L356" class="LineNr">356 </span><span class="traceContains">+transform: packing instruction 'b9 0x2a/imm32'</span> <span id="L357" class="LineNr">357 </span><span class="traceContains">+transform: instruction after packing: 'b9 2a 00 00 00'</span> <span id="L358" class="LineNr">358 </span><span class="traceContains">+run: copy <a href='037heap.cc.html#L23'>imm32</a> 0x0000002a to <a href='010---vm.cc.html#L14'>ECX</a></span> <span id="L359" class="LineNr">359 </span> <span id="L360" class="LineNr">360 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L361" class="LineNr">361 </span><span class="Delimiter">:(scenario pack_silently_ignores_non_hex)</span> <span id="L362" class="LineNr">362 </span><span class="Special">% Hide_errors = true;</span> <span id="L363" class="LineNr">363 </span>== <span class="Constant">0x1</span> <span id="L364" class="LineNr">364 </span>b9 foo/imm32 <span id="L365" class="LineNr">365 </span><span class="traceContains">+transform: packing instruction 'b9 foo/imm32'</span> <span id="L366" class="LineNr">366 </span><span class="Comment"># no change (we're just not printing metadata to the trace)</span> <span id="L367" class="LineNr">367 </span><span class="traceContains">+transform: instruction after packing: 'b9 foo'</span> <span id="L368" class="LineNr">368 </span><span class="Delimiter">:(scenarios run)</span> <span id="L369" class="LineNr">369 </span> <span id="L370" class="LineNr">370 </span><span class="Delimiter">:(scenario pack_flags_bad_hex)</span> <span id="L371" class="LineNr">371 </span><span class="Special">% Hide_errors = true;</span> <span id="L372" class="LineNr">372 </span>== <span class="Constant">0x1</span> <span id="L373" class="LineNr">373 </span>b9 0xfoo/imm32 <span id="L374" class="LineNr">374 </span><span class="traceContains">+error: not a number: 0xfoo</span> <span id="L375" class="LineNr">375 </span> <span id="L376" class="LineNr">376 </span><span class="SalientComment">//:: helpers</span> <span id="L377" class="LineNr">377 </span> <span id="L378" class="LineNr">378 </span><span class="Delimiter">:(code)</span> <span id="L379" class="LineNr">379 </span><span class="Normal">bool</span> <a href='030---operands.cc.html#L379'>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="L380" class="LineNr">380 </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#L166'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L381" class="LineNr">381 </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#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span id="L382" class="LineNr">382 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L383" class="LineNr">383 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span> <span id="L385" class="LineNr">385 </span> <span id="L386" class="LineNr">386 </span><span class="Normal">bool</span> <a href='030---operands.cc.html#L386'>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="L387" class="LineNr">387 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030---operands.cc.html#L396'>contains_any_operand_metadata</a><span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span id="L388" class="LineNr">388 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L389" class="LineNr">389 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L166'>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="L390" class="LineNr">390 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L391" class="LineNr">391 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>data<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">&quot;0123456789abcdefABCDEF&quot;</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span id="L392" class="LineNr">392 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L393" class="LineNr">393 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L394" class="LineNr">394 </span><span class="Delimiter">}</span> <span id="L395" class="LineNr">395 </span> <span id="L396" class="LineNr">396 </span><span class="Normal">bool</span> <a href='030---operands.cc.html#L396'>contains_any_operand_metadata</a><span class="Delimiter">(</span><span class="Normal">const</span> word&amp; <a href='011run.cc.html#L123'>word</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L397" class="LineNr">397 </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#L166'>SIZE</a><span class="Delimiter">(</span><a href='011run.cc.html#L123'>word</a><span class="Delimiter">.</span>metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L398" class="LineNr">398 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='030---operands.cc.html#L40'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span><a href='011run.cc.html#L123'>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='030---operands.cc.html#L40'>Instruction_operands</a></span><span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span id="L399" class="LineNr">399 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L400" class="LineNr">400 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L401" class="LineNr">401 </span><span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span> <span id="L403" class="LineNr">403 </span><span class="Normal">bool</span> has_operand_metadata<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; m<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L404" class="LineNr">404 </span> <span class="Normal">bool</span> result =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L405" class="LineNr">405 </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#L166'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L406" class="LineNr">406 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> m<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L407" class="LineNr">407 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L408" class="LineNr">408 </span> <a href='003trace.cc.html#L190'>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;' has conflicting &quot;</span> &lt;&lt; m &lt;&lt; <span class="Constant">&quot; operands\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span id="L409" class="LineNr">409 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L410" class="LineNr">410 </span> <span class="Delimiter">}</span> <span id="L411" class="LineNr">411 </span> result =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L412" class="LineNr">412 </span> <span class="Delimiter">}</span> <span id="L413" class="LineNr">413 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L414" class="LineNr">414 </span><span class="Delimiter">}</span> <span id="L415" class="LineNr">415 </span> <span id="L416" class="LineNr">416 </span><span class="Normal">bool</span> has_operand_metadata<span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; m<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L417" class="LineNr">417 </span> <span class="Normal">bool</span> result =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L418" class="LineNr">418 </span> <span class="Normal">bool</span> metadata_found =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L419" class="LineNr">419 </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#L166'>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="L420" class="LineNr">420 </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="L421" class="LineNr">421 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special"><a href='030---operands.cc.html#L40'>Instruction_operands</a></span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> == <span class="Special"><a href='030---operands.cc.html#L40'>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="L422" class="LineNr">422 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>metadata_found<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L423" class="LineNr">423 </span> <a href='003trace.cc.html#L190'>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="L424" class="LineNr">424 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L425" class="LineNr">425 </span> <span class="Delimiter">}</span> <span id="L426" class="LineNr">426 </span> metadata_found =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L427" class="LineNr">427 </span> result = <span class="Delimiter">(</span>curr == m<span class="Delimiter">);</span> <span id="L428" class="LineNr">428 </span> <span class="Delimiter">}</span> <span id="L429" class="LineNr">429 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span> <span id="L431" class="LineNr">431 </span> <span id="L432" class="LineNr">432 </span><a href='011run.cc.html#L123'>word</a> metadata<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; m<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L433" class="LineNr">433 </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#L166'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L434" class="LineNr">434 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_operand_metadata<span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> m<span class="Delimiter">))</span> <span id="L435" class="LineNr">435 </span> <span class="Identifier">return</span> inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L436" class="LineNr">436 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L437" class="LineNr">437 </span><span class="Delimiter">}</span> <span id="L438" class="LineNr">438 </span> <span id="L439" class="LineNr">439 </span><span class="Normal">bool</span> <a href='030---operands.cc.html#L439'>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="L440" class="LineNr">440 </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="L441" class="LineNr">441 </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="L442" class="LineNr">442 </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> <span id="L443" class="LineNr">443 </span> <span class="Comment">// End looks_like_hex_int(s) Detectors</span> <span id="L444" class="LineNr">444 </span> <span class="Identifier">return</span><span class="Constant"> false</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="Delimiter">:(code)</span> <span id="L448" class="LineNr">448 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> line&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L449" class="LineNr">449 </span> ostringstream out<span class="Delimiter">;</span> <span id="L450" class="LineNr">450 </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#L166'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L451" class="LineNr">451 </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">' '</span><span class="Delimiter">;</span> <span id="L452" class="LineNr">452 </span> out &lt;&lt; inst<span class="Delimiter">.</span><a href='011run.cc.html#L118'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original<span class="Delimiter">;</span> <span id="L453" class="LineNr">453 </span> <span class="Delimiter">}</span> <span id="L454" class="LineNr">454 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L455" class="LineNr">455 </span><span class="Delimiter">}</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->