From 29c394bc91ec741195185e29d6df9e89e30d6150 Mon Sep 17 00:00:00 2001 From: Ralph Ronnquist Date: Mon, 13 Jan 2025 11:06:19 +1100 Subject: [PATCH 1/1] download 2023-06-01 --- ReadMe.txt | 781 + armdoc/InstructionFormatsARM.asm | 1884 ++ armdoc/InstructionFormatsARM64.asm | 3831 +++ armdoc/InstructionFormatsFPA.asm | 1271 + armdoc/InstructionFormatsIWMMXT.asm | 630 + armdoc/InstructionFormatsMAVERICK.asm | 278 + armdoc/InstructionFormatsSIMD.asm | 3056 +++ armdoc/InstructionFormatsTHUMB16.asm | 477 + armdoc/InstructionFormatsTHUMB32.asm | 1226 + armdoc/InstructionFormatsVFP.asm | 1120 + armdoc/InstructionFormatsXSCALE.asm | 101 + examples/arm64/armpe64.asm | 40 + examples/arm64/armpe64.exe | Bin 0 -> 2048 bytes examples/arm64/semihosting.asm | 68 + examples/arm64/semihosting.bin | Bin 0 -> 215 bytes examples/armdwarf/armdwarf.asm | 13 + examples/armdwarf/armdwarf.axf | Bin 0 -> 836 bytes examples/armelf/armelf | Bin 0 -> 152 bytes examples/armelf/armelf.asm | 17 + examples/armpe/armpe.asm | 34 + examples/armpe/armpe.exe | Bin 0 -> 1024 bytes examples/armpe/armpe2.asm | 21 + examples/armpe/armpe2.exe | Bin 0 -> 1536 bytes examples/armpe/armpe3.asm | 13 + examples/armpe/armpe3.exe | Bin 0 -> 1536 bytes examples/armpe/armpe4.asm | 122 + examples/armpe/armpe4.exe | Bin 0 -> 2560 bytes fasmarm.exe | Bin 0 -> 245760 bytes fasmarm.o | Bin 0 -> 280220 bytes fasmarm.orig-20250113 | Bin 0 -> 231068 bytes fasmarm.x64 | Bin 0 -> 243888 bytes fasmwarm.exe | Bin 0 -> 283648 bytes include/apice/coredll.inc | 1231 + include/macro/armlitrl.inc | 223 + include/macro/armresrc.inc | 19 + include/macro/armstruc.inc | 199 + include/macro/importce.inc | 67 + include/macro/procaps.inc | 690 + include/wince.inc | 8 + include/wincex.inc | 22 + source/armtable.inc | 11321 +++++++++ source/armv8.inc | 30304 ++++++++++++++++++++++++ source/ide/fasmw/fasmarm.inc | 465 + source/ide/fasmw/make_arm.bat | 6 + source/libc/fasmarm.asm | 356 + source/linux/fasmarm.asm | 441 + source/linux/x64/fasmarm.asm | 460 + source/win32/fasmarm.asm | 423 + source/win32/systemarm.inc | 628 + 49 files changed, 61846 insertions(+) create mode 100644 ReadMe.txt create mode 100644 armdoc/InstructionFormatsARM.asm create mode 100644 armdoc/InstructionFormatsARM64.asm create mode 100644 armdoc/InstructionFormatsFPA.asm create mode 100644 armdoc/InstructionFormatsIWMMXT.asm create mode 100644 armdoc/InstructionFormatsMAVERICK.asm create mode 100644 armdoc/InstructionFormatsSIMD.asm create mode 100644 armdoc/InstructionFormatsTHUMB16.asm create mode 100644 armdoc/InstructionFormatsTHUMB32.asm create mode 100644 armdoc/InstructionFormatsVFP.asm create mode 100644 armdoc/InstructionFormatsXSCALE.asm create mode 100644 examples/arm64/armpe64.asm create mode 100644 examples/arm64/armpe64.exe create mode 100644 examples/arm64/semihosting.asm create mode 100644 examples/arm64/semihosting.bin create mode 100644 examples/armdwarf/armdwarf.asm create mode 100755 examples/armdwarf/armdwarf.axf create mode 100755 examples/armelf/armelf create mode 100644 examples/armelf/armelf.asm create mode 100644 examples/armpe/armpe.asm create mode 100644 examples/armpe/armpe.exe create mode 100644 examples/armpe/armpe2.asm create mode 100644 examples/armpe/armpe2.exe create mode 100644 examples/armpe/armpe3.asm create mode 100644 examples/armpe/armpe3.exe create mode 100644 examples/armpe/armpe4.asm create mode 100644 examples/armpe/armpe4.exe create mode 100755 fasmarm.exe create mode 100644 fasmarm.o create mode 100755 fasmarm.orig-20250113 create mode 100755 fasmarm.x64 create mode 100644 fasmwarm.exe create mode 100644 include/apice/coredll.inc create mode 100644 include/macro/armlitrl.inc create mode 100644 include/macro/armresrc.inc create mode 100644 include/macro/armstruc.inc create mode 100644 include/macro/importce.inc create mode 100644 include/macro/procaps.inc create mode 100644 include/wince.inc create mode 100644 include/wincex.inc create mode 100644 source/armtable.inc create mode 100644 source/armv8.inc create mode 100644 source/ide/fasmw/fasmarm.inc create mode 100644 source/ide/fasmw/make_arm.bat create mode 100644 source/libc/fasmarm.asm create mode 100644 source/linux/fasmarm.asm create mode 100644 source/linux/x64/fasmarm.asm create mode 100644 source/win32/fasmarm.asm create mode 100644 source/win32/systemarm.inc diff --git a/ReadMe.txt b/ReadMe.txt new file mode 100644 index 0000000..6d1583e --- /dev/null +++ b/ReadMe.txt @@ -0,0 +1,781 @@ + +FASMARM v1.44 + +This package is an ARM assembler add-on for FASM. + +FASMARM currently supports the full range of instructions for 32-bit and 64-bit +ARM processors and coprocessors up to and including v8. + +Contents: + + 1. ARM assembly compatibility + 2. UAL and pre-UAL syntaxes + 3. IT block handling + 4. Alternate encodings + 5. Output formats + 6. Control directives + 7. Data definitions + 8. Defining registers lists inside macros + 9. Half-precision number formatting + 10. Variants supported + 11. Further information + 12. Version history + +_______________________________________________________________________________ + 1. ARM assembly compatibility + +There are a few restrictions how the ARM instruction set is implemented. The +changes are minor and mostly have a minor impact. For the most part the basic +instruction outline is the same. Where possible the original style is used but +there are some differences: + +Not everything matches the ARM ADS assembly style, where possible the original +style is used but there are some differences +1) label names cannot begin with a digit +2) CPSIE and CPSID formats are changed, use "iflags_aif" form instead of "aif" + (eg. "CPSIE iflags_i" instead of "CPSID i") +3) SRS with writeback must have a separating space after the mode number and + before "!" (eg. "SRSDB 16 !" instead of "SRSDB 16!") +4) macro, rept, irp, format, if, virtual etc. are all significant changes from + the ARM ADS, so you will need to re-write those sections of existing code + + Original ARM Syntax | fasmarm Syntax + ----------------------+---------------------- + cpsie a | cpsie iflags_a + | + srsdb #29! | srsdb #29 ! ;or, + | srsdb 29 ! + +_______________________________________________________________________________ + 2. UAL and pre-UAL syntaxes + +fasmarm supports the original pre-UAL syntax and the newer UAL syntax. These +two syntaxes only affect THUMB encodings. + +UAL stands for: Universal Assembly Language. + +pre-UAL syntax is selected with the directive CODE16. +UAL syntax is selected with the directive THUMB. + +pre-UAL syntax does not specify the "s" (flag update) in the opcodes for +arithmetic operations involving the low set of registers (r0-r7). For example: + + pre-UAL Syntax | UAL Syntax ;Note + ----------------+------------------------------------------------------ + add r0,r1 | adds r0,r1 ;"s" was implicit with all registers <=r7 + adds r0,r1 | adds r0,r1 + | add r0,r1 ;only available inside an IT block, or + | ;as 32-bit T2 instruction + add r8,r1 | add r8,r1 ;high register used, does not update PSR + adds r8,r1 | adds r8,r1 ;only available as 32-bit T2 instruction + | + mov r0,r1 | movs r0,r1 ;"s" was implicit with all registers <=r7 + mov r8,r1 | mov r8,r1 ;high register used, does not update PSR + movs r0,r1 | movs r0,r1 + movs r8,r1 | movs r8,r1 ;only available as 32-bit T2 instruction + | + cpy r0,r1 | cpy r0,r1 ;also: mov r0,r1 in UAL + +Code written in UAL syntax can generally be assembled without modification in +both ARM and THUMB modes. It is recommended to use UAL syntax for all new code. +UAL syntax is get-what-you-write, whereas pre-UAL syntax has an implicit "s" +flag which can potentially be unclear about what you will get. This is +especially important in macros and structures where register numbers may be +unknown until instantiated. + +Both syntaxes support triple and double register operands: "add r0,r0,r1" can +be shortened to "add r0,r1" + +_______________________________________________________________________________ + 3. IT block handling + +In THUMB mode fasmarm can insert IT blocks automatically: + + thumb ;use UAL syntax + ;itet eq ;fasmarm inserts an automatic "IT EQ" block + subeq r0,r1 ;T(rue) = eq + subsne r2,r3 ;E(lse) = ne + subseq r4,r5 ;T(rue) = eq + + +fasmarm will check that manually placed IT blocks are consistent with +subsequent code: + + thumb ;use UAL syntax + itet eq ;manually placed IT block + subeq r0,r1 ;T(rue) = eq, fasmarm checks the conditions are matched + subsne r2,r3 ;E(lse) = ne, fasmarm checks the conditions are matched + subseq r4,r5 ;T(rue) = eq, fasmarm checks the conditions are matched + + +IT blocks cannot span across labels: + + thumb ;use UAL syntax + ;it eq ;fasmarm inserts an automatic "IT EQ" block + subeq r0,r1 ;T(rue) = eq +lab1: ;ite ne ;fasmarm inserts a new "IT NE" block + subsne r2,r3 ;T(rue) = ne + subseq r4,r5 ;E(lse) = eq + + +fasmarm will check that manually placed IT blocks do not span labels: + + ite mi ;manually placed IT block + submi r0,r1 ;T(rue) = mi, fasmarm checks the conditions are matched +lab2: subspl r2,r3 ;Error: IT block would span across the label + + +IT blocks cannot span across changes to PC: + + thumb ;use UAL syntax + ;ite eq ;fasmarm inserts an automatic "IT EQ" block + subeq r0,r1 ;T(rue) = eq + bne lab2 ;E(lse) = ne, branch will finish the IT block + ;it eq ;fasmarm inserts a new "IT EQ" block + subseq r4,r5 ;T(rue) = eq + +_______________________________________________________________________________ + 4. Alternate encodings + +fasmarm follows this principle: Find a way to encode it, the smaller the better + +What this means is that even though you may write a particular opcocde, fasmarm +may assemble another as a replacement. This can only happen where the +functionality is exactly the same. The reason for doing this is to increase the +likelihood of a successful assembly. This will only affect you if you want to +look at a disassembly listing and match it to the original source. Example: + + What you coded | What is assembled ;reason + -------------------+--------------------------------------------------- + ARM + and r0,0xfffffff0 | bic r0,0x0000000f ;immediate could not be encoded + add r1,-4 | sub r1,4 ;immediate could not be encoded + cmp r2,0xffffe500 | cmn r2,0x00001b00 ;immediate could not be encoded + lsr r1,r2,r3 | mov r1,r2,lsr r3 ;ARM mode does not have LSR + pop {r0-r3} | ldmfd r13!,{r0-r3} ;ARM mode does not have POP + mul r4,r4,r11 | mul r4,r11,r4 ;encoding restriction for + | ;CPU versions before v6 + THUMB + ldmfd r13!,{r0-r3} | pop {r0-r3} ;THUMB mode uses pop + ldmfd r10!,{r8} | ldr r8,[r10],4 ;forbidden single register LDMs + pop {r8} | ldr r8,[r13],4 ;forbidden single register POP + add r2,0x89a | addw r2,0x89a ;immediate could not be encoded + BOTH + mov r1,0x4567 | movw r1,0x4567 ;immediate could not be encoded + +Other instructions than just what is shown above are also affected. + +The last part of the principles, the smaller the better, may impact THUMB code +where a particular alignment is required. If you need to ensure that a +particular instruction is always 32-bit, or always 16-bit, then you can use the +qualifiers ".W" and ".N" after the opcodes and conditions to force either wide +(32-bit) or narrow (16-bit) encodings. If the instruction cannot be encoded in +the desired width fasmarm will give an error. If the instruction does not have +both wide an narrow forms then the .W and .N suffixes are undefined. If you +give no width suffix fasmarm will select the narrow form if it is available and +encodable, and the wide form otherwise. + +To see how this impacts code using IT blocks examine the following example: + + thumb ;use UAL syntax + sub r0,r1 ;only encodable as 32-bit outside an IT block + subs r2,r3 ;fasmarm chooses the 16-bit form + subs.w r4,r5 ;32-bit "wide" encoding forced + b .next1 + ;... + .next1: + ;ittt al ;fasmarm inserts an automatic "IT AL" block + sub r0,r1 ;fasmarm chooses the 16-bit form inside an IT block + sub r2,r3 ;fasmarm chooses the 16-bit form inside an IT block + b .next2 ;IT block extends to here + ;... + .next2: + ;itttt al ;fasmarm inserts an automatic "IT AL" block + sub r0,r1 ;fasmarm chooses the 16-bit form inside an IT block + sub r2,r3 ;fasmarm chooses the 16-bit form inside an IT block + sub r9,r5 ;high register used, only encodable as 32-bit + sub r6,r7 ;fasmarm chooses the 16-bit form inside an IT block + +The insertion of automatic "IT AL" blocks is only done when a reduction in code +size is possible. To inhibit automatic "IT AL" block insertion you can force +affected instructions to use the wide encoding with a .W suffix, or use the +directive ITNOAUTO. To enable automatic insertion of IT AL blocks use the +ITAUTO directive. ITAUTO is the default mode at startup. ITNOAUTO and ITAUTO +directives only affect IT blocks using AL. Other condition codes will still +be inserted automatically if not included explicitly. + + itauto ;enable automatic IT AL insertion from now onwards + thumb ;use UAL syntax + sub.w r0,r1 ;32-bit "wide" encoding forced + sub.w r2,r3 ;32-bit "wide" encoding forced + b .next2 + ;... + .next2: + itnoauto ;inhibit automatic IT AL insertion from now onwards + sub r0,r1 ;32-bit "wide" encoding used + sub r2,r3 ;32-bit "wide" encoding used + +_______________________________________________________________________________ + 5. Output formats + +The "format" directive will produce ARM code in all the same formats as the X86 +version plus one additional format: ELF DWARF. The ELF DWARF is compatible with +the ARM AXD debugger. The DWARF format produced includes all program labels, +line numbers and module names for full symbolic debugging. The ELF format has +been changed to set the FLAGS, code base and machine type compatible for +ARM-LINUX. The PE format has been changed to set the machine type, subsystem +and code base compatible with WinCE. PE64 format is available without +relocations. ELF64 format has not yet been updated. + +Use format like this to get the dwarf output: + + format elf dwarf executable [at ?] + +Line number and the symbol table generation are automatically enabled with this +format. Using "at" is optional and defaults to 0. + +The "section" directive for DWARF output is like this: + + section "name" [executable | readable | writeable | at ?] align ? + +The "name" is required. Align is required and must be a power of 2. All other +attributes are optional except that at least one of executable, readable or +writeable must be specified. Using "at" is optional and defaults to the next +aligned address. Attributes can be specified in any order except "name" which +must be first. + +The "org" directive is not allowed in DWARF output mode, otherwise everything +is the same as for normal ELF output. + +Relocations for ELF and PE are not supported at this time. + +_______________________________________________________________________________ + 6. Control directives + +There are five directives to control the code generation state: + + CODE64 - Switches to ARM64 (64bit instructions) code generation (alias + USE64) + CODE32 - Switches to ARM (32bit instructions) code generation (alias + USE32) + CODE16 - Switches to THUMB pre-UAL (16bit instructions) code + generation (alias USE16) + THUMB - Switches to THUMB UAL (16bit instructions) code generation + THUMBEE - Switches to ThumbEE UAL (16bit instructions) code generation + +At startup the default is CODE32. + +There are two directives to control the instruction set classes enabled: + + PROCESSOR + COPROCESSOR + +Where is a list instruction classes to enable or disable. Use a +plus symbol (+) to enable, and a minus symbol (-) to disable. By default only +the CPU32_* and COPRO_* instructions are enabled. + +To enable or disable one or more instruction classes without changing other +classes use a leading plus (+) or minus (-) to incrementally update the +settings. For example: + + processor cpu64_v8 ;enable only 64-bit version 8 base instructions + ;all other instruction classes are disabled + processor +cpu64_fp ;additionally enable the 64-bit floating point. + ;If they were already enabled then they remain + ;enabled. Other classes are unaffected. + + processor cpu64_v8 +cpu64_fp ;Both combined has the same effect as + ;above two examples. + + coprocessor -copro_vfp_v4 ;disable only the VFP V4 instructions. + ;If they were already disabled then + ;they remain disabled. Other classes + ;are unaffected. + +To query the selected instruction classes you can use the 'if' directive to do +logical tests. For example: + + if processor cpu32_v7 | processor cpu32_7m + ;do something + end if + + if coprocessor copro_vfp_v4 + ;do something + else + ;do something else + end if + +The following is a list of processor instruction classes supported: + CPU32_26BIT, CPU32_V1, CPU32_V2, CPU32_A, CPU32_V3, CPU32_M, CPU32_V4, + CPU32_V4T, CPU32_V5, CPU32_V5T, CPU32_E, CPU32_P, CPU32_J, CPU32_X, + CPU32_V6, CPU32_V6T, CPU32_ALIGN, CPU32_K, CPU32_Z, CPU32_6M, CPU32_7M, + CPU32_T2, CPU32_V7, CPU32_SYNC, CPU32_DIV, CPU32_T2EE, CPU32_MP, + CPU32_VE, CPU32_V8, CPU32_CRC, CPU64_V8, CPU64_FP, CPU64_SIMD, + CPU64_CRC, CPU64_CRYPTO + +The following is a list of coprocessor instruction classes supported: + COPRO_FPA_V1, COPRO_FPA_V2, COPRO_MAVERICK, COPRO_VFP_V1XD, + COPRO_VFP_V1, COPRO_VFP_V2, COPRO_VFP_V3, COPRO_VFP_D32, COPRO_VFP_HP, + COPRO_XSCALE, COPRO_IWMMXT_V1, COPRO_IWMMXT_V2, COPRO_SIMD_INT, + COPRO_SIMD_FLOAT, COPRO_SIMD_HP, COPRO_VFP_V4, COPRO_SIMD_V2, + COPRO_SIMD_V8, COPRO_SIMD_CRYPTO + +There are three combination instruction classes that will either enable or +disable all instructions within the class: + CPU32_ALL, CPU64_ALL, COPRO_ALL + +For backward compatibility with previous versions a single numeric constant can +be specified instead of a list of classes. This is only supported for the +following values: + + PROCESSOR supported immediate values: + CPU32_CAPABILITY_26BIT = 1 shl 00 + CPU32_CAPABILITY_V1 = 1 shl 01 + CPU32_CAPABILITY_V2 = 1 shl 02 + CPU32_CAPABILITY_A = 1 shl 03 + CPU32_CAPABILITY_V3 = 1 shl 04 + CPU32_CAPABILITY_M = 1 shl 05 + CPU32_CAPABILITY_V4 = 1 shl 06 + CPU32_CAPABILITY_V4T = 1 shl 07 + CPU32_CAPABILITY_V5 = 1 shl 08 + CPU32_CAPABILITY_V5T = 1 shl 09 + CPU32_CAPABILITY_E = 1 shl 10 + CPU32_CAPABILITY_P = 1 shl 11 + CPU32_CAPABILITY_J = 1 shl 12 + CPU32_CAPABILITY_X = 1 shl 13 + CPU32_CAPABILITY_V6 = 1 shl 14 + CPU32_CAPABILITY_V6T = 1 shl 15 + CPU32_CAPABILITY_ALIGN = 1 shl 16 + CPU32_CAPABILITY_K = 1 shl 17 + CPU32_CAPABILITY_Z = 1 shl 18 + CPU32_CAPABILITY_6M = 1 shl 19 + CPU32_CAPABILITY_7M = 1 shl 20 + CPU32_CAPABILITY_T2 = 1 shl 21 + CPU32_CAPABILITY_V7 = 1 shl 22 + CPU32_CAPABILITY_SYNC = 1 shl 23 + CPU32_CAPABILITY_DIV = 1 shl 24 + CPU32_CAPABILITY_T2EE = 1 shl 25 + CPU32_CAPABILITY_MP = 1 shl 26 + CPU32_CAPABILITY_VE = 1 shl 27 + CPU32_CAPABILITY_V8 = 1 shl 28 + CPU32_CAPABILITY_CRC = 1 shl 29 + + COPROCESSOR supported immediate values: + COPRO_CAPABILITY_FPA_V1 = 1 shl 00 + COPRO_CAPABILITY_FPA_V2 = 1 shl 01 + COPRO_CAPABILITY_MAVERICK = 1 shl 02 + COPRO_CAPABILITY_VFP_V1xD = 1 shl 03 + COPRO_CAPABILITY_VFP_V1 = 1 shl 04 + COPRO_CAPABILITY_VFP_V2 = 1 shl 05 + COPRO_CAPABILITY_VFP_V3 = 1 shl 06 + COPRO_CAPABILITY_VFP_D32 = 1 shl 07 + COPRO_CAPABILITY_VFP_HP = 1 shl 08 + COPRO_CAPABILITY_XSCALE = 1 shl 09 + COPRO_CAPABILITY_IWMMXT_V1 = 1 shl 10 + COPRO_CAPABILITY_IWMMXT_V2 = 1 shl 11 + COPRO_CAPABILITY_SIMD_INT = 1 shl 12 + COPRO_CAPABILITY_SIMD_FLOAT = 1 shl 13 + COPRO_CAPABILITY_SIMD_HP = 1 shl 14 + COPRO_CAPABILITY_VFP_V4 = 1 shl 15 + COPRO_CAPABILITY_SIMD_V2 = 1 shl 16 + COPRO_CAPABILITY_SIMD_V8 = 1 shl 17 + COPRO_CAPABILITY_SIMD_CRYPTO = 1 shl 18 + +The above symbol names and values are not defined by fasmarm. You can add them +to your source file to use them, or you can use just the raw numbers. + +There are two associated predefined symbols: %c and %p. %c is the bitmap value +of the current coprocessor set enabled. %p is the bitmap value of the current +processor set enabled. These predefined symbols only return values in the range +as shown above. That means you can't the %p value to determine if any of the +CPU64* instruction classes have been enabled. Instead use the 'if' form as +shown earlier. + +Examples using a numeric constant: + For ARM7TDMI CPUs: + processor 0xfe + coprocessor 0x0 + + For PXA25x CPUs: + processor 0x2ffe + coprocessor 0x0200 + + For PXA27x CPUs: + processor 0x2ffe + coprocessor 0x0600 + + For Cortex-A8 CPUs: + processor 0x2fffffe + coprocessor 0x30f8 + + For Cortex-A9 CPUs: + processor 0x6fffffe + coprocessor 0x30f8 + +At start-up the default is to enable the CPU32* instructions and all +coprocessors. It you want to use later instruction classes and any 64-bit +instructions these need to be specified with PROCESSOR before use. + +See the files in the ARMDOC folder for details about which instructions are +enabled by each setting. + +_______________________________________________________________________________ + 7. Data definitions + +Data definitions are different between ARM and X86. A "word" in ARM is 32 bits. + + X86 ARM comment + ---+----+--------- + DB | DB | byte: 8 bits + DW | DH | half word: 16 bits + DU | DU | half word strings: 16 bits + DD | DW | word: 32 bits + DQ | DD | double word: 64 bits + RB | RB | byte: 8 bits + RW | RH | half word: 16 bits + RD | RW | word: 32 bits + RQ | RD | double word: 64 bits + DF | -- | not valid + DP | -- | not valid + DT | -- | not valid + RF | -- | not valid + RP | -- | not valid + RT | -- | not valid + +Address sizes are always 64 bits in ARM64 state and 32 bits in ARM and THUMB +states, you can't use any address overrides. + +Data sizes are different between ARM and X86. A "word" in ARM is 32 bits. + + X86 ARM comment + --------+--------+--------------------- + BYTE | BYTE | same: 8 bits + WORD | HWORD | half word: 16 bits + DWORD | WORD | word: 32 bits + QWORD | DWORD | double word: 64 bits + DQWORD | QWORD | quad word: 128 bits + QQWORD | DQWORD | double quad word: 256 bits + +You can still use all the pre-processor and assembly features of FASM including +macros, structures, repeats etc. + +_______________________________________________________________________________ + 8. Defining registers lists inside macros + +The standard ARM syntax uses curly brackets, {}, to enclose registers lists. +The standard fasm syntax uses curly brackets to enclose macros. Both standards +are supported in fasmarm and you can mix them together. The way to state +registers lists within macros is to escape the closing curly bracket with a +leading backslash. + + macro block_copy destination, source, length { + local .loop + mov r0,source + mov r1,destination + add r2,r0,length + .loop: + ldmia r0!,{r3-r10\} ;we have to escape the closing bracket + stmia r1!,{r3-r10\} ;we have to escape the closing bracket + cmp r0,r2 + blo .loop + } + +_______________________________________________________________________________ + 9. Half-precision number formatting + +The ARM specification allows extended range half-precision numbers. Care must +be taken when defining numbers that fall within the extended range. Numbers in +the range 65520.0 to 131039.0 inclusive can be defined using the DH directive +and do not give any error. Values within this range place the exponent field at +0x1f. If the CPU is not placed into alternative half-precision (AHP) mode then +these numbers fall within the NaN and infinity encoding space. + +_______________________________________________________________________________ + 10. Variants supported + +Five standard variants of FASM binaries can been produced for FASMARM: + + FASMARM.EXE - WIN32 console + FASMWARM.EXE - WIN32 IDE + FASMARM - LINUX + FASMARM.X64 - LINUX64 console + FASMARM.O - LIBC + +_______________________________________________________________________________ + 11. Further information + +Visit http://www.arm.com for information on the ARM instruction sets and +processors. + +Visit http://flatassembler.net for the FASM x86 assembler package and tools. + +If you want to recompile the FASMARM code you will need the flatassembler +package from the above URL. + +To see what others have said and to participate in the development of fasmarm +see the active thread on the fasm message board: +http://board.flatassembler.net/topic.php?t=4191 + +If you have a problem, question, suggestion, comment etc. you can contact me at +http://board.flatassembler.net - my handle is revolution. + +_______________________________________________________________________________ + 12. Version history + +v1.44 2023-Jul-01 - Update for compatibility with fasm v1.73.30 + - MOVN/MOVZ with zero immediate now encodes any given shift + - Add Linux 64-bit version: fasmarm.x64 + - Add PE64 support for PIE code without relocations + - Fix PE header bug in SizeOf(Un)InitializedData values + - Fix errant check for thumb STRD duplicated source registers + - Add allowance for DSB, DMB and ISB to accept numeric values + - Honour two reg encoding for small immediates in thumb code + - Add missing {VPUSH|VPOP}{.32|.64} aliases + - Fix bug with 'IT LE' condition mis-tracking + - Add alias of APSR_NZCV to R15 for VMRS/FMRX + - Encode ROR by 0 to use LSL 0 + - Fix bug using LDMIA/STMDB for LDRB/STRB and LDRH/STRH + - Reduce aggressiveness of register swapping in thumb mode + - Fix detection of invalid values, this improves the + minimisation in thumb mode + - Fix STMDB/LDMIA conversion to PUsH/POP in thumb mode + - Encode single reg LDM as LDM, not as LDR, in thumb mode + - Fix bug with LDRD literal load permitting writeback + - Delay triggering of using wide instructions until 6 passes + before the last + - Add ITAUTO and ITNOAUTO directives + - Add support for '-' as input/output file in Linux, enabling + FASMARM to be used in pipeline + - Add Windows armpe64.asm example + - Add swapping of ADD(S) X?,X?,SP & W?,W?,WSP in 64-bit code + - Fix bug with ADRP erroneously giving unaligned error + - Fix ELF format flags for Version5 EABI + - Fix bug with undefined symbol used as an implicit address + giving unexpected invalid R15 usage error + - Fix crash bug in square and curly expression parsers + - Set machine type for ELF64 to AARCH64 + - Fix bug with explicit register expressions creating bad + immediate offsets + +v1.43 2017-Dec-26 - Fix a code minimisation logic regression + +v1.42 2017-Jul-23 - Fix a bug with unclosed curly and square bracket parsing + +v1.41 2016-Nov-09 - Fix a bug with forward referencing of labels in thumb mode + +v1.40 2016-May-14 - Fix a bug with unexpected size checks in 64-bit code for + immediate values not used for addressing + - Fix a bug with MOVK not respecting the shift amount when + the immediate is zero + - Change the IDE error summary dialog to show the full error + message + +v1.39 2016-May-01 - Add 64-bit v8 instructions + - Add simple expression evaluation inside address fields, + e.g. "ldr x1,[x2-4]" and/or "ldr x1,[x2,-4]" + - Add processing for lists of instruction classes to + PROCESSOR and COPROCESSOR directives + - Add 64-bit SemiHosting example program + +v1.38 2016-Apr-11 - Fixed more bugs with elf dwarf format file corruption + - Fixed a bug with "section ... at 0" not updating PC to 0 + - Fixed an encoding bug with VMULL.P8 + - Add 32-bit v8 instructions + +v1.37 2015-Nov-16 - Added code and data generation from macro lines to the line + number information table + - Fixed a bug with elf dwarf format symbol table corruption + - Fixed a bug where post-update instructions with a positive + sign (eg. ldr r0,[r1],+r2) would always be forced negative + +v1.36 2015-Oct-05 - Fixed another bug with elf dwarf format file corruption + +v1.35 2015-Oct-01 - Fixed a bug with elf dwarf format file corruption + +v1.34 2015-Jun-18 - Fixed a bug with elf section offsets using "at" + +v1.33 2015-May-28 - Added on demand memory allocation for WIN32 + - Fixed MRC bug with R15 as the destination + +v1.32 2014-Dec-21 - Update with all fasm changes as at 1.71.31 + - Change the format of the undocumented CRC32 directive + +v1.31 2014-Jan-29 - Fixed long file names error during line number processing + +v1.30 2013-Sep-12 - Fixed THUMB encoding of LDRB and LDRH. Updated for fasm + v1.71.13 + +v1.29 2012-Dec-24 - Added missing assert directive. Updated for fasm v1.71.07, + address space additions + +v1.28 2012-Jul-11 - Fixed a bug with 65-bit values in section origins + +v1.27 2012-Jun-09 - Updated for compatibility with fasm v1.70.02, 65-bit values + +v1.26 2012-Feb-24 - Added support for ARM/THUMB mode v7VE instructions + - Added support for ARM/THUMB mode VFPv4 instructions + - Added support for ARM/THUMB mode SIMDv2 instructions + - Added alternate two operand forms for absolute difference + - Removed alternate two operand forms for multiply-accumulate + +v1.25 2011-Oct-31 - Fixed a bug with BKPT handling in IT blocks in ARM mode + +v1.24 2011-Oct-29 - Fixed a bug with crashes during expression parsing + +v1.23 2011-Jul-31 - Fixed a bug with relocations corrupting patch code + +v1.22 2010-Nov-24 - Fixed a bug with handling nameless sections in dwarf format + +v1.21 2010-Oct-17 - Minimising the "code cannot be generated" problem. If the + assembler gets to a third repetition at the same state + then it takes action and uses wide instructions in + situations where the narrow instructions are causing + problems + +v1.20 2010-Sep-17 - Fixed a bug with handling of files names in dwarf format + +v1.19 2010-Sep-16 - Add support for half-precision and extended half-precision + number formatting. Compatible with fasm v1.69.24 + +v1.18 2010-Sep-09 - Update for compatibility with fasm v1.69.22 + +v1.17 2010-Sep-08 - Added support to separate byte and rotation values for + immediate values in shifter encoding + +v1.16 2010-Apr-26 - Added experimental instruction CRC32 + - Added experimental operator FIT + - Added alternate encoding logic for VMOV/VMVN 16-bit and + 32-bit forms + - Generate an error with more than 16 double registers in + FLDMD/FSTMD/VLDM/VSTM/VPOP/VPUSH + - Fixed erroneous generation of conditional instructions when + mixing VIRTUAL with IT blocks + - Fixed encoding for THUMB mode PC relative immediate + addressing when placed inside auto IT block + - Fixed encoding for WLDRx/WSTRx with PC relative addressing + +v1.15 2010-Apr-21 - Added support for ARM/THUMB mode v6T2 instructions + - Added support for ARM/THUMB mode v7 instructions + - Added support for ThumbEE instructions + - Added support for FPA coprocessors up to v2 + - Added support for VFP coprocessors up to v3 + - Added support for MAVERICK coprocessors + - Added support for Intel WMMXT coprocessors up to v2 + - Added support for Advanced SIMD coprocessors + - Added support for alternate two register data processing + operands. Implicit destination is the first operand + - Added support for expressions in addresses to access PC + relative variables and locations + - Added support for automatic efficient IT block generation + in THUMB mode + - Added support for UAL assembly syntax + - Added support for an optional hash (#) before literal + values + - Added predefined variables %c and %p + - Added ARMDOC folder with example instruction formats for + each opcode supported + - Extended the alternate encoding logic + - Changed numeric separation character from single quote (') + to underscore (_) + - Changed non-UAL SRS syntax to use a space, instead of a + comma, between the mode number and writeback operator + - Removed directives CODEFP, CODENOFP, CODEV5, CODEV6, + CODEVFP1, CODEVFP2, ARM5, ARM6, VFP1 and VFP2. Use + PROCESSOR and COPROCESSOR instead + +v1.14 2010-Feb-02 - Updated for compatibility with FASM 1.69.11 + - Changed "LDRx reg,[reg,0]!" to generate "LDRx reg,[reg,0]" + - Changed "LDRx reg,[reg],0" to generate "LDRx reg,[reg,0]" + - Changed "LDC Px,Cx,[reg,0]!" to generate + "LDC Px,Cx,[reg,0]" + - Changed "LDC Px,Cx,[reg],0" to generate + "LDC Px,Cx,[reg,0]" + - Fixed encoding for thumb mode BLX + - Fixed encoding for PKHTB without shift + - Fixed encoding for SSAT, SSAT16 + - Fixed encoding for UMAAL + - Allowed rotation parameter for SXTB, SXTH, UXTB, UXTH + +v1.13 2008-Nov-04 - Updated register restrictions for STREX, SMLALD, SMLSLD, + UMAAL, SMLALxy + - Relaxed restriction of rotation count=0 (or omitted) for + PKHTB + - Enabled THUMB mode aliases for SXTB, SXTH, UXTB, UXTH + +v1.12 2008-Jul-13 - Updated for compatibility with FASM 1.67.27 + - Fixed "error: undefined symbol" displaying the wrong line + +v1.11 2008-Mar-20 - Updated for compatibility with FASM 1.67.26 (note: no + version change) + +v1.11 2007-Aug-31 - Updated for compatibility with FASM 1.67.22 + - Fixed an address parser bug allowing "ldr rx,[constant]" + without a register base + +v1.10 2007-Mar-04 - Updated for compatibility with FASM 1.67.21 expression + calculation + - Allowed forward referencing of register based structure + addressing + - Fixed a bug in the ARMLITRL.INC when generating PC relative + offsets + +v1.09 2006-Aug-30 - Updated ARMTABLE.INC for compatibility with FASM 1.67 + binary searches + - Updated PE format to initialise several accounting fields + and also to reset the "relocs stripped" flag if relocs are + included + +v1.08 2006-Jun-09 - Fixed erroneous error with implicit r0 based addressing + - Fixed priority of unary minus to match FASM v1.66 priority + - Relaxed restrictions with register structure addresses when + using zero offset + - Enhanced MOV/MOVS to use ADD/SUB encoding when loading a + register structure member + - Generation of special encoding to allow user code to detect + unencodable immediate values and then select an alternate + coding without causing assembly errors + - Alignment bytes changed to 0xff to facilitate faster FLASH + ROM updates + - Added proc, apscall, import and literals macros to package, + see each individual file for usage and special notes + - STRUCT and RESOURCE converted from x86 to ARM format + - COREDLL.INC converted to an imports definition file + +v1.07 2006-May-26 - Patch for basic "format PE" support for WinCE + - Added ARMPE example for WinCE (2006-06-02) + - COREDLL.DLL import ordinal equates added in "COREDLL.INC" + (2006-06-02) + +v1.06 2006-Mar-03 - Updated to work within FASM version 1.66 + +v1.05 2006-Feb-14 - Patch for basic "format ELF executable" support + - Added ARMELF example + +v1.04 2005-Nov-09 - Fixed incorrect classification of data/code when using + TIMES + - Improved line number embedding generation for more + efficient tables + +v1.03 2005-Oct-20 - Fixed IF/ELSE/END IF skip bug with commas + +v1.02 2005-Oct-03 - Fixed CPS mode change code generation + - Fixed THUMB ASR and LSR shift range check + +v1.01 2005-Oct-01 - Fixed STMIA THUMB instruction checking for base register + validity + - Fixed error deferring for some expressions + - Fixed shift count of 32 + - Added ARMv6 instructions + - Added VFPv2 instructions + - Added register aliases a1-a4, v1-v8, sb, sl, fp, ip + - Added CODE16, CODE32, CODEFP, CODENOFP, CODEV5, CODEV6, + CODEVFP1, CODEVFP2 directives + - Added ARM5, ARM6, VFP1, VFP2 combination directives + - Enforced code typing (generates an error if new + instructions are used but not enabled) + - Enforced VFP to be explicitly enabled before use + - Removed condition code "NV" + +v1 2005-Sep-29 - First public release + +(C) 01-Jul-2023 revolution diff --git a/armdoc/InstructionFormatsARM.asm b/armdoc/InstructionFormatsARM.asm new file mode 100644 index 0000000..2ae7ac5 --- /dev/null +++ b/armdoc/InstructionFormatsARM.asm @@ -0,0 +1,1884 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition or flag +;writeback ("s") syntaxes. Almost all instructions can +;be conditional. The condition code should be added at +;the end of the main opcode and before any size/type +;specifiers. For example: "addhi" and "vaddhi.i16". The +;syntax also supports the pre-UAL style of putting the +;condition before any modifiers like "s" or "fd". For +;example: "ldmhifd", "ldmfdhi" and "addhis", "addshi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +processor CPU32_26BIT + + cmnp r0,1 + cmnp r0,1,2 + cmnp r0,r1 + cmnp r0,r1,rrx + cmnp r0,r1,lsl 2 + cmnp r0,r1,lsr 2 + cmnp r0,r1,asr 2 + cmnp r0,r1,ror 2 + cmnp r0,r1,lsl r2 + cmnp r0,r1,lsr r2 + cmnp r0,r1,asr r2 + cmnp r0,r1,ror r2 + + cmpp r0,1 + cmpp r0,1,2 + cmpp r0,r1 + cmpp r0,r1,rrx + cmpp r0,r1,lsl 2 + cmpp r0,r1,lsr 2 + cmpp r0,r1,asr 2 + cmpp r0,r1,ror 2 + cmpp r0,r1,lsl r2 + cmpp r0,r1,lsr r2 + cmpp r0,r1,asr r2 + cmpp r0,r1,ror r2 + + teqp r0,1 + teqp r0,1,2 + teqp r0,r1 + teqp r0,r1,rrx + teqp r0,r1,lsl 2 + teqp r0,r1,lsr 2 + teqp r0,r1,asr 2 + teqp r0,r1,ror 2 + teqp r0,r1,lsl r2 + teqp r0,r1,lsr r2 + teqp r0,r1,asr r2 + teqp r0,r1,ror r2 + + tstp r0,1 + tstp r0,1,2 + tstp r0,r1 + tstp r0,r1,rrx + tstp r0,r1,lsl 2 + tstp r0,r1,lsr 2 + tstp r0,r1,asr 2 + tstp r0,r1,ror 2 + tstp r0,r1,lsl r2 + tstp r0,r1,lsr r2 + tstp r0,r1,asr r2 + tstp r0,r1,ror r2 + +processor CPU32_V1 + + adc r0,1 + adc r0,1,2 + adc r0,r1 + adc r0,r1,rrx + adc r0,r1,lsl 2 + adc r0,r1,lsr 2 + adc r0,r1,asr 2 + adc r0,r1,ror 2 + adc r0,r1,lsl r2 + adc r0,r1,lsr r2 + adc r0,r1,asr r2 + adc r0,r1,ror r2 + adc r0,r1,2 + adc r0,r1,2,4 + adc r0,r1,r2 + adc r0,r1,r2,rrx + adc r0,r1,r2,lsl 3 + adc r0,r1,r2,lsr 3 + adc r0,r1,r2,asr 3 + adc r0,r1,r2,ror 3 + adc r0,r1,r2,lsl r3 + adc r0,r1,r2,lsr r3 + adc r0,r1,r2,asr r3 + adc r0,r1,r2,ror r3 + + add r0,1 + add r0,1,2 + add r0,r1 + add r0,r1,rrx + add r0,r1,lsl 2 + add r0,r1,lsr 2 + add r0,r1,asr 2 + add r0,r1,ror 2 + add r0,r1,lsl r2 + add r0,r1,lsr r2 + add r0,r1,asr r2 + add r0,r1,ror r2 + add r0,r1,2 + add r0,r1,2,4 + add r0,r1,r2 + add r0,r1,r2,rrx + add r0,r1,r2,lsl 3 + add r0,r1,r2,lsr 3 + add r0,r1,r2,asr 3 + add r0,r1,r2,ror 3 + add r0,r1,r2,lsl r3 + add r0,r1,r2,lsr r3 + add r0,r1,r2,asr r3 + add r0,r1,r2,ror r3 + + addw r0,1 + addw r0,r1,2 + + label_adr: + adr r0,label_adr + + and r0,1 + and r0,1,2 + and r0,r1 + and r0,r1,rrx + and r0,r1,lsl 2 + and r0,r1,lsr 2 + and r0,r1,asr 2 + and r0,r1,ror 2 + and r0,r1,lsl r2 + and r0,r1,lsr r2 + and r0,r1,asr r2 + and r0,r1,ror r2 + and r0,r1,2 + and r0,r1,2,4 + and r0,r1,r2 + and r0,r1,r2,rrx + and r0,r1,r2,lsl 3 + and r0,r1,r2,lsr 3 + and r0,r1,r2,asr 3 + and r0,r1,r2,ror 3 + and r0,r1,r2,lsl r3 + and r0,r1,r2,lsr r3 + and r0,r1,r2,asr r3 + and r0,r1,r2,ror r3 + + asr r0,1 + asr r0,r1 + asr r0,r1,2 + asr r0,r1,r2 + + label_b: + b label_b + + bic r0,1 + bic r0,1,2 + bic r0,r1 + bic r0,r1,rrx + bic r0,r1,lsl 2 + bic r0,r1,lsr 2 + bic r0,r1,asr 2 + bic r0,r1,ror 2 + bic r0,r1,lsl r2 + bic r0,r1,lsr r2 + bic r0,r1,asr r2 + bic r0,r1,ror r2 + bic r0,r1,2 + bic r0,r1,2,4 + bic r0,r1,r2 + bic r0,r1,r2,rrx + bic r0,r1,r2,lsl 3 + bic r0,r1,r2,lsr 3 + bic r0,r1,r2,asr 3 + bic r0,r1,r2,ror 3 + bic r0,r1,r2,lsl r3 + bic r0,r1,r2,lsr r3 + bic r0,r1,r2,asr r3 + bic r0,r1,r2,ror r3 + + label_bl: + bl label_bl + + cmn r0,1 + cmn r0,1,2 + cmn r0,r1 + cmn r0,r1,rrx + cmn r0,r1,lsl 2 + cmn r0,r1,lsr 2 + cmn r0,r1,asr 2 + cmn r0,r1,ror 2 + cmn r0,r1,lsl r2 + cmn r0,r1,lsr r2 + cmn r0,r1,asr r2 + cmn r0,r1,ror r2 + + cmp r0,1 + cmp r0,1,2 + cmp r0,r1 + cmp r0,r1,rrx + cmp r0,r1,lsl 2 + cmp r0,r1,lsr 2 + cmp r0,r1,asr 2 + cmp r0,r1,ror 2 + cmp r0,r1,lsl r2 + cmp r0,r1,lsr r2 + cmp r0,r1,asr r2 + cmp r0,r1,ror r2 + + cpy r0,r1 + + eor r0,1 + eor r0,1,2 + eor r0,r1 + eor r0,r1,rrx + eor r0,r1,lsl 2 + eor r0,r1,lsr 2 + eor r0,r1,asr 2 + eor r0,r1,ror 2 + eor r0,r1,lsl r2 + eor r0,r1,lsr r2 + eor r0,r1,asr r2 + eor r0,r1,ror r2 + eor r0,r1,2 + eor r0,r1,2,4 + eor r0,r1,r2 + eor r0,r1,r2,rrx + eor r0,r1,r2,lsl 3 + eor r0,r1,r2,lsr 3 + eor r0,r1,r2,asr 3 + eor r0,r1,r2,ror 3 + eor r0,r1,r2,lsl r3 + eor r0,r1,r2,lsr r3 + eor r0,r1,r2,asr r3 + eor r0,r1,r2,ror r3 + + ldm r0,{r1} + ldm r0,{r1,r2} + ldm r0,{r1-r3} + ldm r0,{r1-r3,r5} + ldm r0,{r1}^ + ldm r0,{r1,r2}^ + ldm r0,{r1-r3}^ + ldm r0,{r1-r3,r5}^ + ldm r0!,{r1} + ldm r0!,{r1,r2} + ldm r0!,{r1-r3} + ldm r0!,{r1-r3,r5} + ldm r0!,{r15}^ + ldm r0!,{r1,r2,r15}^ + ldm r0!,{r1-r3,r15}^ + ldm r0!,{r1-r3,r15}^ + + ldmda r0,{r1} + ldmda r0,{r1,r2} + ldmda r0,{r1-r3} + ldmda r0,{r1-r3,r5} + ldmda r0,{r1}^ + ldmda r0,{r1,r2}^ + ldmda r0,{r1-r3}^ + ldmda r0,{r1-r3,r5}^ + ldmda r0!,{r1} + ldmda r0!,{r1,r2} + ldmda r0!,{r1-r3} + ldmda r0!,{r1-r3,r5} + ldmda r0!,{r15}^ + ldmda r0!,{r1,r2,r15}^ + ldmda r0!,{r1-r3,r15}^ + ldmda r0!,{r1-r3,r15}^ + + ldmdb r0,{r1} + ldmdb r0,{r1,r2} + ldmdb r0,{r1-r3} + ldmdb r0,{r1-r3,r5} + ldmdb r0,{r1}^ + ldmdb r0,{r1,r2}^ + ldmdb r0,{r1-r3}^ + ldmdb r0,{r1-r3,r5}^ + ldmdb r0!,{r1} + ldmdb r0!,{r1,r2} + ldmdb r0!,{r1-r3} + ldmdb r0!,{r1-r3,r5} + ldmdb r0!,{r15}^ + ldmdb r0!,{r1,r2,r15}^ + ldmdb r0!,{r1-r3,r15}^ + ldmdb r0!,{r1-r3,r15}^ + + ldmea r0,{r1} + ldmea r0,{r1,r2} + ldmea r0,{r1-r3} + ldmea r0,{r1-r3,r5} + ldmea r0,{r1}^ + ldmea r0,{r1,r2}^ + ldmea r0,{r1-r3}^ + ldmea r0,{r1-r3,r5}^ + ldmea r0!,{r1} + ldmea r0!,{r1,r2} + ldmea r0!,{r1-r3} + ldmea r0!,{r1-r3,r5} + ldmea r0!,{r15}^ + ldmea r0!,{r1,r2,r15}^ + ldmea r0!,{r1-r3,r15}^ + ldmea r0!,{r1-r3,r15}^ + + ldmed r0,{r1} + ldmed r0,{r1,r2} + ldmed r0,{r1-r3} + ldmed r0,{r1-r3,r5} + ldmed r0,{r1}^ + ldmed r0,{r1,r2}^ + ldmed r0,{r1-r3}^ + ldmed r0,{r1-r3,r5}^ + ldmed r0!,{r1} + ldmed r0!,{r1,r2} + ldmed r0!,{r1-r3} + ldmed r0!,{r1-r3,r5} + ldmed r0!,{r15}^ + ldmed r0!,{r1,r2,r15}^ + ldmed r0!,{r1-r3,r15}^ + ldmed r0!,{r1-r3,r15}^ + + ldmfa r0,{r1} + ldmfa r0,{r1,r2} + ldmfa r0,{r1-r3} + ldmfa r0,{r1-r3,r5} + ldmfa r0,{r1}^ + ldmfa r0,{r1,r2}^ + ldmfa r0,{r1-r3}^ + ldmfa r0,{r1-r3,r5}^ + ldmfa r0!,{r1} + ldmfa r0!,{r1,r2} + ldmfa r0!,{r1-r3} + ldmfa r0!,{r1-r3,r5} + ldmfa r0!,{r15}^ + ldmfa r0!,{r1,r2,r15}^ + ldmfa r0!,{r1-r3,r15}^ + ldmfa r0!,{r1-r3,r15}^ + + ldmfd r0,{r1} + ldmfd r0,{r1,r2} + ldmfd r0,{r1-r3} + ldmfd r0,{r1-r3,r5} + ldmfd r0,{r1}^ + ldmfd r0,{r1,r2}^ + ldmfd r0,{r1-r3}^ + ldmfd r0,{r1-r3,r5}^ + ldmfd r0!,{r1} + ldmfd r0!,{r1,r2} + ldmfd r0!,{r1-r3} + ldmfd r0!,{r1-r3,r5} + ldmfd r0!,{r15}^ + ldmfd r0!,{r1,r2,r15}^ + ldmfd r0!,{r1-r3,r15}^ + ldmfd r0!,{r1-r3,r15}^ + + ldmia r0,{r1} + ldmia r0,{r1,r2} + ldmia r0,{r1-r3} + ldmia r0,{r1-r3,r5} + ldmia r0,{r1}^ + ldmia r0,{r1,r2}^ + ldmia r0,{r1-r3}^ + ldmia r0,{r1-r3,r5}^ + ldmia r0!,{r1} + ldmia r0!,{r1,r2} + ldmia r0!,{r1-r3} + ldmia r0!,{r1-r3,r5} + ldmia r0!,{r15}^ + ldmia r0!,{r1,r2,r15}^ + ldmia r0!,{r1-r3,r15}^ + ldmia r0!,{r1-r3,r15}^ + + ldmib r0,{r1} + ldmib r0,{r1,r2} + ldmib r0,{r1-r3} + ldmib r0,{r1-r3,r5} + ldmib r0,{r1}^ + ldmib r0,{r1,r2}^ + ldmib r0,{r1-r3}^ + ldmib r0,{r1-r3,r5}^ + ldmib r0!,{r1} + ldmib r0!,{r1,r2} + ldmib r0!,{r1-r3} + ldmib r0!,{r1-r3,r5} + ldmib r0!,{r15}^ + ldmib r0!,{r1,r2,r15}^ + ldmib r0!,{r1-r3,r15}^ + ldmib r0!,{r1-r3,r15}^ + + label_ldr: + ldr r0,[r1] + ldr r0,[r1],+r2 + ldr r0,[r1],-r2 + ldr r0,[r1],-r2,lsl 3 + ldr r0,[r1],r2,lsr 3 + ldr r0,[r1],r2,asr 3 + ldr r0,[r1],r2,ror 3 + ldr r0,[r1],-r2,lsl 3 + ldr r0,[r1],-r2,lsr 3 + ldr r0,[r1],-r2,asr 3 + ldr r0,[r1],-r2,ror 3 + ldr r0,[r1],r2,rrx + ldr r0,[r1],-r2,rrx + ldr r0,[r1],2 + ldr r0,[r1,2] + ldr r0,[r1,2]! + ldr r0,[r1,r2] + ldr r0,[r1,-r2] + ldr r0,[r1,r2]! + ldr r0,[r1,-r2]! + ldr r0,[r1,r2,lsl 3] + ldr r0,[r1,r2,lsr 3] + ldr r0,[r1,r2,asr 3] + ldr r0,[r1,r2,ror 3] + ldr r0,[r1,-r2,lsl 3] + ldr r0,[r1,-r2,lsr 3] + ldr r0,[r1,-r2,asr 3] + ldr r0,[r1,-r2,ror 3] + ldr r0,[r1,r2,lsl 3]! + ldr r0,[r1,r2,lsr 3]! + ldr r0,[r1,r2,asr 3]! + ldr r0,[r1,r2,ror 3]! + ldr r0,[r1,-r2,lsl 3]! + ldr r0,[r1,-r2,lsr 3]! + ldr r0,[r1,-r2,asr 3]! + ldr r0,[r1,-r2,ror 3]! + ldr r0,[r1,r2,rrx] + ldr r0,[r1,-r2,rrx] + ldr r0,[r1,r2,rrx]! + ldr r0,[r1,-r2,rrx]! + ldr r0,[label_ldr] + ldr r0,[expression.word] + ldr r0,[expression.word]! + + label_ldrb: + ldrb r0,[r1] + ldrb r0,[r1],r2 + ldrb r0,[r1],-r2 + ldrb r0,[r1],-r2,lsl 3 + ldrb r0,[r1],r2,lsr 3 + ldrb r0,[r1],r2,asr 3 + ldrb r0,[r1],r2,ror 3 + ldrb r0,[r1],-r2,lsl 3 + ldrb r0,[r1],-r2,lsr 3 + ldrb r0,[r1],-r2,asr 3 + ldrb r0,[r1],-r2,ror 3 + ldrb r0,[r1],r2,rrx + ldrb r0,[r1],-r2,rrx + ldrb r0,[r1],2 + ldrb r0,[r1,2] + ldrb r0,[r1,2]! + ldrb r0,[r1,r2] + ldrb r0,[r1,-r2] + ldrb r0,[r1,r2]! + ldrb r0,[r1,-r2]! + ldrb r0,[r1,r2,lsl 3] + ldrb r0,[r1,r2,lsr 3] + ldrb r0,[r1,r2,asr 3] + ldrb r0,[r1,r2,ror 3] + ldrb r0,[r1,-r2,lsl 3] + ldrb r0,[r1,-r2,lsr 3] + ldrb r0,[r1,-r2,asr 3] + ldrb r0,[r1,-r2,ror 3] + ldrb r0,[r1,r2,lsl 3]! + ldrb r0,[r1,r2,lsr 3]! + ldrb r0,[r1,r2,asr 3]! + ldrb r0,[r1,r2,ror 3]! + ldrb r0,[r1,-r2,lsl 3]! + ldrb r0,[r1,-r2,lsr 3]! + ldrb r0,[r1,-r2,asr 3]! + ldrb r0,[r1,-r2,ror 3]! + ldrb r0,[r1,r2,rrx] + ldrb r0,[r1,-r2,rrx] + ldrb r0,[r1,r2,rrx]! + ldrb r0,[r1,-r2,rrx]! + ldrb r0,[label_ldrb] + ldrb r0,[expression.byte] + ldrb r0,[expression.byte]! + + ldrbt r0,[r1] + ldrbt r0,[r1],r2 + ldrbt r0,[r1],-r2 + ldrbt r0,[r1],r2,lsl 3 + ldrbt r0,[r1],r2,lsr 3 + ldrbt r0,[r1],r2,asr 3 + ldrbt r0,[r1],r2,ror 3 + ldrbt r0,[r1],-r2,lsl 3 + ldrbt r0,[r1],-r2,lsr 3 + ldrbt r0,[r1],-r2,asr 3 + ldrbt r0,[r1],-r2,ror 3 + ldrbt r0,[r1],r2,rrx + ldrbt r0,[r1],-r2,rrx + ldrbt r0,[r1],2 + + ldrt r0,[r1] + ldrt r0,[r1],r2 + ldrt r0,[r1],-r2 + ldrt r0,[r1],r2,lsl 3 + ldrt r0,[r1],r2,lsr 3 + ldrt r0,[r1],r2,asr 3 + ldrt r0,[r1],r2,ror 3 + ldrt r0,[r1],-r2,lsl 3 + ldrt r0,[r1],-r2,lsr 3 + ldrt r0,[r1],-r2,asr 3 + ldrt r0,[r1],-r2,ror 3 + ldrt r0,[r1],r2,rrx + ldrt r0,[r1],-r2,rrx + ldrt r0,[r1],2 + + lsl r0,1 + lsl r0,r1 + lsl r0,r1,2 + lsl r0,r1,r2 + + lsr r0,1 + lsr r0,r1 + lsr r0,r1,2 + lsr r0,r1,r2 + + mov r0,1 + mov r0,1,2 + mov r0,r1 + mov r0,r1,rrx + mov r0,r1,lsl 2 + mov r0,r1,lsr 2 + mov r0,r1,asr 2 + mov r0,r1,ror 2 + mov r0,r1,lsl r2 + mov r0,r1,lsr r2 + mov r0,r1,asr r2 + mov r0,r1,ror r2 + mov r0,expression.word + + mvn r0,1 + mvn r0,1,2 + mvn r0,r1 + mvn r0,r1,rrx + mvn r0,r1,lsl 2 + mvn r0,r1,lsr 2 + mvn r0,r1,asr 2 + mvn r0,r1,ror 2 + mvn r0,r1,lsl r2 + mvn r0,r1,lsr r2 + mvn r0,r1,asr r2 + mvn r0,r1,ror r2 + + neg r0 + neg r0,r1 + + nop + + orr r0,1 + orr r0,1,2 + orr r0,r1 + orr r0,r1,rrx + orr r0,r1,lsl 2 + orr r0,r1,lsr 2 + orr r0,r1,asr 2 + orr r0,r1,ror 2 + orr r0,r1,lsl r2 + orr r0,r1,lsr r2 + orr r0,r1,asr r2 + orr r0,r1,ror r2 + orr r0,r1,2 + orr r0,r1,2,4 + orr r0,r1,r2 + orr r0,r1,r2,rrx + orr r0,r1,r2,lsl 3 + orr r0,r1,r2,lsr 3 + orr r0,r1,r2,asr 3 + orr r0,r1,r2,ror 3 + orr r0,r1,r2,lsl r3 + orr r0,r1,r2,lsr r3 + orr r0,r1,r2,asr r3 + orr r0,r1,r2,ror r3 + + pop {r0} + pop {r0,r1} + pop {r0-r2} + pop {r0-r2,r4} + + push {r0} + push {r0,r1} + push {r0-r2} + push {r0-r2,r4} + + ror r0,1 + ror r0,r1 + ror r0,r1,2 + ror r0,r1,r2 + + rrx r0 + rrx r0,r1 + + rsb r0,1 + rsb r0,1,2 + rsb r0,r1 + rsb r0,r1,rrx + rsb r0,r1,lsl 2 + rsb r0,r1,lsr 2 + rsb r0,r1,asr 2 + rsb r0,r1,ror 2 + rsb r0,r1,lsl r2 + rsb r0,r1,lsr r2 + rsb r0,r1,asr r2 + rsb r0,r1,ror r2 + rsb r0,r1,2 + rsb r0,r1,2,4 + rsb r0,r1,r2 + rsb r0,r1,r2,rrx + rsb r0,r1,r2,lsl 3 + rsb r0,r1,r2,lsr 3 + rsb r0,r1,r2,asr 3 + rsb r0,r1,r2,ror 3 + rsb r0,r1,r2,lsl r3 + rsb r0,r1,r2,lsr r3 + rsb r0,r1,r2,asr r3 + rsb r0,r1,r2,ror r3 + + rsc r0,1 + rsc r0,1,2 + rsc r0,r1 + rsc r0,r1,rrx + rsc r0,r1,lsl 2 + rsc r0,r1,lsr 2 + rsc r0,r1,asr 2 + rsc r0,r1,ror 2 + rsc r0,r1,lsl r2 + rsc r0,r1,lsr r2 + rsc r0,r1,asr r2 + rsc r0,r1,ror r2 + rsc r0,r1,2 + rsc r0,r1,2,4 + rsc r0,r1,r2 + rsc r0,r1,r2,rrx + rsc r0,r1,r2,lsl 3 + rsc r0,r1,r2,lsr 3 + rsc r0,r1,r2,asr 3 + rsc r0,r1,r2,ror 3 + rsc r0,r1,r2,lsl r3 + rsc r0,r1,r2,lsr r3 + rsc r0,r1,r2,asr r3 + rsc r0,r1,r2,ror r3 + + sbc r0,1 + sbc r0,1,2 + sbc r0,r1 + sbc r0,r1,rrx + sbc r0,r1,lsl 2 + sbc r0,r1,lsr 2 + sbc r0,r1,asr 2 + sbc r0,r1,ror 2 + sbc r0,r1,lsl r2 + sbc r0,r1,lsr r2 + sbc r0,r1,asr r2 + sbc r0,r1,ror r2 + sbc r0,r1,2 + sbc r0,r1,2,4 + sbc r0,r1,r2 + sbc r0,r1,r2,rrx + sbc r0,r1,r2,lsl 3 + sbc r0,r1,r2,lsr 3 + sbc r0,r1,r2,asr 3 + sbc r0,r1,r2,ror 3 + sbc r0,r1,r2,lsl r3 + sbc r0,r1,r2,lsr r3 + sbc r0,r1,r2,asr r3 + sbc r0,r1,r2,ror r3 + + stm r0,{r1} + stm r0,{r1,r2} + stm r0,{r1-r3} + stm r0,{r1-r3,r5} + stm r0,{r1}^ + stm r0,{r1,r2}^ + stm r0,{r1-r3}^ + stm r0,{r1-r3,r5}^ + stm r0!,{r1} + stm r0!,{r1,r2} + stm r0!,{r1-r3} + stm r0!,{r1-r3,r5} + + stmda r0,{r1} + stmda r0,{r1,r2} + stmda r0,{r1-r3} + stmda r0,{r1-r3,r5} + stmda r0,{r1}^ + stmda r0,{r1,r2}^ + stmda r0,{r1-r3}^ + stmda r0,{r1-r3,r5}^ + stmda r0!,{r1} + stmda r0!,{r1,r2} + stmda r0!,{r1-r3} + stmda r0!,{r1-r3,r5} + + stmdb r0,{r1} + stmdb r0,{r1,r2} + stmdb r0,{r1-r3} + stmdb r0,{r1-r3,r5} + stmdb r0,{r1}^ + stmdb r0,{r1,r2}^ + stmdb r0,{r1-r3}^ + stmdb r0,{r1-r3,r5}^ + stmdb r0!,{r1} + stmdb r0!,{r1,r2} + stmdb r0!,{r1-r3} + stmdb r0!,{r1-r3,r5} + + stmea r0,{r1} + stmea r0,{r1,r2} + stmea r0,{r1-r3} + stmea r0,{r1-r3,r5} + stmea r0,{r1}^ + stmea r0,{r1,r2}^ + stmea r0,{r1-r3}^ + stmea r0,{r1-r3,r5}^ + stmea r0!,{r1} + stmea r0!,{r1,r2} + stmea r0!,{r1-r3} + stmea r0!,{r1-r3,r5} + + stmed r0,{r1} + stmed r0,{r1,r2} + stmed r0,{r1-r3} + stmed r0,{r1-r3,r5} + stmed r0,{r1}^ + stmed r0,{r1,r2}^ + stmed r0,{r1-r3}^ + stmed r0,{r1-r3,r5}^ + stmed r0!,{r1} + stmed r0!,{r1,r2} + stmed r0!,{r1-r3} + stmed r0!,{r1-r3,r5} + + stmfa r0,{r1} + stmfa r0,{r1,r2} + stmfa r0,{r1-r3} + stmfa r0,{r1-r3,r5} + stmfa r0,{r1}^ + stmfa r0,{r1,r2}^ + stmfa r0,{r1-r3}^ + stmfa r0,{r1-r3,r5}^ + stmfa r0!,{r1} + stmfa r0!,{r1,r2} + stmfa r0!,{r1-r3} + stmfa r0!,{r1-r3,r5} + + stmfd r0,{r1} + stmfd r0,{r1,r2} + stmfd r0,{r1-r3} + stmfd r0,{r1-r3,r5} + stmfd r0,{r1}^ + stmfd r0,{r1,r2}^ + stmfd r0,{r1-r3}^ + stmfd r0,{r1-r3,r5}^ + stmfd r0!,{r1} + stmfd r0!,{r1,r2} + stmfd r0!,{r1-r3} + stmfd r0!,{r1-r3,r5} + + stmia r0,{r1} + stmia r0,{r1,r2} + stmia r0,{r1-r3} + stmia r0,{r1-r3,r5} + stmia r0,{r1}^ + stmia r0,{r1,r2}^ + stmia r0,{r1-r3}^ + stmia r0,{r1-r3,r5}^ + stmia r0!,{r1} + stmia r0!,{r1,r2} + stmia r0!,{r1-r3} + stmia r0!,{r1-r3,r5} + + stmib r0,{r1} + stmib r0,{r1,r2} + stmib r0,{r1-r3} + stmib r0,{r1-r3,r5} + stmib r0,{r1}^ + stmib r0,{r1,r2}^ + stmib r0,{r1-r3}^ + stmib r0,{r1-r3,r5}^ + stmib r0!,{r1} + stmib r0!,{r1,r2} + stmib r0!,{r1-r3} + stmib r0!,{r1-r3,r5} + + label_str: + str r0,[r1] + str r0,[r1],r2 + str r0,[r1],-r2 + str r0,[r1],-r2,lsl 3 + str r0,[r1],r2,lsr 3 + str r0,[r1],r2,asr 3 + str r0,[r1],r2,ror 3 + str r0,[r1],-r2,lsl 3 + str r0,[r1],-r2,lsr 3 + str r0,[r1],-r2,asr 3 + str r0,[r1],-r2,ror 3 + str r0,[r1],r2,rrx + str r0,[r1],-r2,rrx + str r0,[r1],2 + str r0,[r1,2] + str r0,[r1,2]! + str r0,[r1,r2] + str r0,[r1,-r2] + str r0,[r1,r2]! + str r0,[r1,-r2]! + str r0,[r1,r2,lsl 3] + str r0,[r1,r2,lsr 3] + str r0,[r1,r2,asr 3] + str r0,[r1,r2,ror 3] + str r0,[r1,-r2,lsl 3] + str r0,[r1,-r2,lsr 3] + str r0,[r1,-r2,asr 3] + str r0,[r1,-r2,ror 3] + str r0,[r1,r2,lsl 3]! + str r0,[r1,r2,lsr 3]! + str r0,[r1,r2,asr 3]! + str r0,[r1,r2,ror 3]! + str r0,[r1,-r2,lsl 3]! + str r0,[r1,-r2,lsr 3]! + str r0,[r1,-r2,asr 3]! + str r0,[r1,-r2,ror 3]! + str r0,[r1,r2,rrx] + str r0,[r1,-r2,rrx] + str r0,[r1,r2,rrx]! + str r0,[r1,-r2,rrx]! + str r0,[label_str] + str r0,[expression.word] + str r0,[expression.word]! + + label_strb: + strb r0,[r1] + strb r0,[r1],r2 + strb r0,[r1],-r2 + strb r0,[r1],-r2,lsl 3 + strb r0,[r1],r2,lsr 3 + strb r0,[r1],r2,asr 3 + strb r0,[r1],r2,ror 3 + strb r0,[r1],-r2,lsl 3 + strb r0,[r1],-r2,lsr 3 + strb r0,[r1],-r2,asr 3 + strb r0,[r1],-r2,ror 3 + strb r0,[r1],r2,rrx + strb r0,[r1],-r2,rrx + strb r0,[r1],2 + strb r0,[r1,2] + strb r0,[r1,2]! + strb r0,[r1,r2] + strb r0,[r1,-r2] + strb r0,[r1,r2]! + strb r0,[r1,-r2]! + strb r0,[r1,r2,lsl 3] + strb r0,[r1,r2,lsr 3] + strb r0,[r1,r2,asr 3] + strb r0,[r1,r2,ror 3] + strb r0,[r1,-r2,lsl 3] + strb r0,[r1,-r2,lsr 3] + strb r0,[r1,-r2,asr 3] + strb r0,[r1,-r2,ror 3] + strb r0,[r1,r2,lsl 3]! + strb r0,[r1,r2,lsr 3]! + strb r0,[r1,r2,asr 3]! + strb r0,[r1,r2,ror 3]! + strb r0,[r1,-r2,lsl 3]! + strb r0,[r1,-r2,lsr 3]! + strb r0,[r1,-r2,asr 3]! + strb r0,[r1,-r2,ror 3]! + strb r0,[r1,r2,rrx] + strb r0,[r1,-r2,rrx] + strb r0,[r1,r2,rrx]! + strb r0,[r1,-r2,rrx]! + strb r0,[label_strb] + strb r0,[expression.byte] + strb r0,[expression.byte]! + + strbt r0,[r1] + strbt r0,[r1],r2 + strbt r0,[r1],-r2 + strbt r0,[r1],r2,lsl 3 + strbt r0,[r1],r2,lsr 3 + strbt r0,[r1],r2,asr 3 + strbt r0,[r1],r2,ror 3 + strbt r0,[r1],-r2,lsl 3 + strbt r0,[r1],-r2,lsr 3 + strbt r0,[r1],-r2,asr 3 + strbt r0,[r1],-r2,ror 3 + strbt r0,[r1],r2,rrx + strbt r0,[r1],-r2,rrx + strbt r0,[r1],2 + + strt r0,[r1] + strt r0,[r1],r2 + strt r0,[r1],-r2 + strt r0,[r1],r2,lsl 3 + strt r0,[r1],r2,lsr 3 + strt r0,[r1],r2,asr 3 + strt r0,[r1],r2,ror 3 + strt r0,[r1],-r2,lsl 3 + strt r0,[r1],-r2,lsr 3 + strt r0,[r1],-r2,asr 3 + strt r0,[r1],-r2,ror 3 + strt r0,[r1],r2,rrx + strt r0,[r1],-r2,rrx + strt r0,[r1],2 + + sub r0,1 + sub r0,1,2 + sub r0,r1 + sub r0,r1,rrx + sub r0,r1,lsl 2 + sub r0,r1,lsr 2 + sub r0,r1,asr 2 + sub r0,r1,ror 2 + sub r0,r1,lsl r2 + sub r0,r1,lsr r2 + sub r0,r1,asr r2 + sub r0,r1,ror r2 + sub r0,r1,2 + sub r0,r1,2,4 + sub r0,r1,r2 + sub r0,r1,r2,rrx + sub r0,r1,r2,lsl 3 + sub r0,r1,r2,lsr 3 + sub r0,r1,r2,asr 3 + sub r0,r1,r2,ror 3 + sub r0,r1,r2,lsl r3 + sub r0,r1,r2,lsr r3 + sub r0,r1,r2,asr r3 + sub r0,r1,r2,ror r3 + + subw r0,1 + subw r0,r1,2 + + svc 1 + + swi 1 + + teq r0,1 + teq r0,1,2 + teq r0,r1 + teq r0,r1,rrx + teq r0,r1,lsl 2 + teq r0,r1,lsr 2 + teq r0,r1,asr 2 + teq r0,r1,ror 2 + teq r0,r1,lsl r2 + teq r0,r1,lsr r2 + teq r0,r1,asr r2 + teq r0,r1,ror r2 + + tst r0,1 + tst r0,1,2 + tst r0,r1 + tst r0,r1,rrx + tst r0,r1,lsl 2 + tst r0,r1,lsr 2 + tst r0,r1,asr 2 + tst r0,r1,ror 2 + tst r0,r1,lsl r2 + tst r0,r1,lsr r2 + tst r0,r1,asr r2 + tst r0,r1,ror r2 + +processor CPU32_V2 + + cdp p9,1,c2,c3,c4 + cdp p9,1,c2,c3,c4,5 + + label_ldc: + ldc p9,c1,[r2] + ldc p9,c1,[r2],4 + ldc p9,c1,[r2],{4} + ldc p9,c1,[r2,4] + ldc p9,c1,[r2,4]! + ldc p9,c1,[label_ldc] + ldc p9,c1,[expression.word] + ldc p9,c1,[expression.word]! + + label_ldcl: + ldcl p9,c1,[r2] + ldcl p9,c1,[r2],4 + ldcl p9,c1,[r2],{4} + ldcl p9,c1,[r2,4] + ldcl p9,c1,[r2,4]! + ldcl p9,c1,[label_ldcl] + ldcl p9,c1,[expression.word] + ldcl p9,c1,[expression.word]! + + mcr p9,1,r2,c3,c4 + mcr p9,1,r2,c3,c4,5 + + mla r0,r1,r2,r3 + + mrc p9,1,r2,c3,c4 + mrc p9,1,r15,c3,c4,5 + + mul r0,r1 + mul r0,r1,r2 + + label_stc: + stc p9,c1,[r2] + stc p9,c1,[r2],4 + stc p9,c1,[r2],{4} + stc p9,c1,[r2,4] + stc p9,c1,[r2,4]! + stc p9,c1,[label_stc] + stc p9,c1,[expression.word] + stc p9,c1,[expression.word]! + + label_stcl: + stcl p9,c1,[r2] + stcl p9,c1,[r2],4 + stcl p9,c1,[r2],{4} + stcl p9,c1,[r2,4] + stcl p9,c1,[r2,4]! + stcl p9,c1,[label_stcl] + stcl p9,c1,[expression.word] + stcl p9,c1,[expression.word]! + +processor CPU32_A + + swp r0,r1,[r2] + swpb r0,r1,[r2] + +processor CPU32_V3 + + mrs r0,apsr + mrs r0,cpsr + mrs r0,spsr + + msr cpsr,r1 + msr cpsr_fsxc,r1 + msr cpsr,1 + msr cpsr_fsxc,1 + +processor CPU32_M + + smlal r0,r1,r2,r3 + + smull r0,r1,r2,r3 + + umlal r0,r1,r2,r3 + + umull r0,r1,r2,r3 + +processor CPU32_V4 + + label_ldrh: + ldrh r0,[r1] + ldrh r0,[r1],r2 + ldrh r0,[r1],-r2 + ldrh r0,[r1],2 + ldrh r0,[r1,2] + ldrh r0,[r1,2]! + ldrh r0,[r1,r2] + ldrh r0,[r1,-r2] + ldrh r0,[r1,r2]! + ldrh r0,[r1,-r2]! + ldrh r0,[label_ldrh] + ldrh r0,[expression.hword] + ldrh r0,[expression.hword]! + + label_ldrsb: + ldrsb r0,[r1] + ldrsb r0,[r1],r2 + ldrsb r0,[r1],-r2 + ldrsb r0,[r1],2 + ldrsb r0,[r1,2] + ldrsb r0,[r1,2]! + ldrsb r0,[r1,r2] + ldrsb r0,[r1,-r2] + ldrsb r0,[r1,r2]! + ldrsb r0,[r1,-r2]! + ldrsb r0,[label_ldrsb] + ldrsb r0,[expression.byte] + ldrsb r0,[expression.byte]! + + label_ldrsh: + ldrsh r0,[r1] + ldrsh r0,[r1],r2 + ldrsh r0,[r1],-r2 + ldrsh r0,[r1],2 + ldrsh r0,[r1,2] + ldrsh r0,[r1,2]! + ldrsh r0,[r1,r2] + ldrsh r0,[r1,-r2] + ldrsh r0,[r1,r2]! + ldrsh r0,[r1,-r2]! + ldrsh r0,[label_ldrsh] + ldrsh r0,[expression.hword] + ldrsh r0,[expression.hword]! + + label_strh: + strh r0,[r1] + strh r0,[r1],r2 + strh r0,[r1],-r2 + strh r0,[r1],2 + strh r0,[r1,2] + strh r0,[r1,2]! + strh r0,[r1,r2] + strh r0,[r1,-r2] + strh r0,[r1,r2]! + strh r0,[r1,-r2]! + strh r0,[label_strh] + strh r0,[expression.hword] + strh r0,[expression.hword]! + +processor CPU32_V4T + + bx r0 + +processor CPU32_V5 + + label_blx: + blx label_blx + blx r0 + + bkpt 0 + + cdp2 p9,1,c2,c3,c4 + cdp2 p9,1,c2,c3,c4,5 + + clz r0,r1 + + label_ldc2: + ldc2 p9,c1,[r2] + ldc2 p9,c1,[r2],4 + ldc2 p9,c1,[r2],{4} + ldc2 p9,c1,[r2,4] + ldc2 p9,c1,[r2,4]! + ldc2 p9,c1,[label_ldc2] + ldc2 p9,c1,[expression.word] + ldc2 p9,c1,[expression.word]! + + label_ldc2l: + ldc2l p9,c1,[r2] + ldc2l p9,c1,[r2],4 + ldc2l p9,c1,[r2],{4} + ldc2l p9,c1,[r2,4] + ldc2l p9,c1,[r2,4]! + ldc2l p9,c1,[label_ldc2l] + ldc2l p9,c1,[expression.word] + ldc2l p9,c1,[expression.word]! + + mcr2 p9,1,r2,c3,c4 + mcr2 p9,1,r2,c3,c4,5 + + mrc2 p9,1,r2,c3,c4 + mrc2 p9,1,r15,c3,c4,5 + + label_stc2: + stc2 p9,c1,[r2] + stc2 p9,c1,[r2],4 + stc2 p9,c1,[r2],{4} + stc2 p9,c1,[r2,4] + stc2 p9,c1,[r2,4]! + stc2 p9,c1,[label_stc2] + stc2 p9,c1,[expression.word] + stc2 p9,c1,[expression.word]! + + label_stc2l: + stc2l p9,c1,[r2] + stc2l p9,c1,[r2],4 + stc2l p9,c1,[r2],{4} + stc2l p9,c1,[r2,4] + stc2l p9,c1,[r2,4]! + stc2l p9,c1,[label_stc2l] + stc2l p9,c1,[expression.word] + stc2l p9,c1,[expression.word]! + +processor CPU32_E + + qadd r0,r1 + qadd r0,r1,r2 + + qdadd r0,r1 + qdadd r0,r1,r2 + + qdsub r0,r1 + qdsub r0,r1,r2 + + qsub r0,r1 + qsub r0,r1,r2 + + smlabb r0,r1,r2,r3 + + smlabt r0,r1,r2,r3 + + smlalbb r0,r1,r2,r3 + + smlalbt r0,r1,r2,r3 + + smlaltb r0,r1,r2,r3 + + smlaltt r0,r1,r2,r3 + + smlatb r0,r1,r2,r3 + + smlatt r0,r1,r2,r3 + + smlawb r0,r1,r2,r3 + + smlawt r0,r1,r2,r3 + + smulbb r0,r1 + smulbb r0,r1,r2 + + smulbt r0,r1 + smulbt r0,r1,r2 + + smultb r0,r1 + smultb r0,r1,r2 + + smultt r0,r1 + smultt r0,r1,r2 + + smulwb r0,r1 + smulwb r0,r1,r2 + + smulwt r0,r1 + smulwt r0,r1,r2 + +processor CPU32_P + + label_ldrd: + ldrd r0,[r2] + ldrd r0,[r2],r3 + ldrd r0,[r2],-r3 + ldrd r0,[r2],3 + ldrd r0,[r2,3] + ldrd r0,[r2,3]! + ldrd r0,[r2,r3] + ldrd r0,[r2,-r3] + ldrd r0,[r2,r3]! + ldrd r0,[r2,-r3]! + ldrd r0,[label_ldrd] + ldrd r0,[expression.dword] + ldrd r0,[expression.dword]! + ldrd r0,r1,[r2] + ldrd r0,r1,[r2],r3 + ldrd r0,r1,[r2],-r3 + ldrd r0,r1,[r2],3 + ldrd r0,r1,[r2,3] + ldrd r0,r1,[r2,3]! + ldrd r0,r1,[r2,r3] + ldrd r0,r1,[r2,-r3] + ldrd r0,r1,[r2,r3]! + ldrd r0,r1,[r2,-r3]! + ldrd r0,r1,[label_ldrd] + ldrd r0,r1,[expression.dword] + ldrd r0,r1,[expression.dword]! + + mcrr p9,1,r2,r3,c4 + + mrrc p9,1,r2,r3,c4 + + label_pld: + pld [r0] + pld [r0,1] + pld [r0,r1] + pld [r0,-r1] + pld [r0,r1,lsl 2] + pld [r0,r1,lsr 2] + pld [r0,r1,asr 2] + pld [r0,r1,ror 2] + pld [r0,-r1,lsl 2] + pld [r0,-r1,lsr 2] + pld [r0,-r1,asr 2] + pld [r0,-r1,ror 2] + pld [r0,r1,rrx] + pld [r0,-r1,rrx] + pld [label_pld] + pld [expression.byte] + + label_strd: + strd r0,[r2] + strd r0,[r2],r3 + strd r0,[r2],-r3 + strd r0,[r2],3 + strd r0,[r2,3] + strd r0,[r2,3]! + strd r0,[r2,r3] + strd r0,[r2,-r3] + strd r0,[r2,r3]! + strd r0,[r2,-r3]! + strd r0,[label_strd] + strd r0,[expression.dword] + strd r0,[expression.dword]! + strd r0,r1,[r2] + strd r0,r1,[r2],r3 + strd r0,r1,[r2],-r3 + strd r0,r1,[r2],3 + strd r0,r1,[r2,3] + strd r0,r1,[r2,3]! + strd r0,r1,[r2,r3] + strd r0,r1,[r2,-r3] + strd r0,r1,[r2,r3]! + strd r0,r1,[r2,-r3]! + strd r0,r1,[label_strd] + strd r0,r1,[expression.dword] + strd r0,r1,[expression.dword]! + +processor CPU32_J + + bxj r0 + +processor CPU32_V6 + + cps 0 + + cpsid iflags_a + cpsid iflags_a,1 + + cpsie iflags_a + cpsie iflags_a,1 + + ldrex r0,[r1] + ldrex r0,[r1,0] + + mcrr2 p9,1,r2,r3,c4 + + mrrc2 p9,1,r2,r3,c4 + + pkhbt r0,r1 + pkhbt r0,r1,lsl 3 + pkhbt r0,r1,r2 + pkhbt r0,r1,r2,lsl 3 + + pkhtb r0,r1 + pkhtb r0,r1,asr 3 + pkhtb r0,r1,r2 + pkhtb r0,r1,r2,asr 3 + + qadd16 r0,r1 + qadd16 r0,r1,r2 + + qadd8 r0,r1 + qadd8 r0,r1,r2 + + qaddsubx r0,r1 + qaddsubx r0,r1,r2 + + qasx r0,r1 + qasx r0,r1,r2 + + qsax r0,r1 + qsax r0,r1,r2 + + qsub16 r0,r1 + qsub16 r0,r1,r2 + + qsub8 r0,r1 + qsub8 r0,r1,r2 + + qsubaddx r0,r1 + qsubaddx r0,r1,r2 + + rev r0,r1 + + rev16 r0,r1 + + revsh r0,r1 + + rfe r0 + rfe r0! + + rfeda r0 + rfeda r0! + + rfedb r0 + rfedb r0! + + rfeea r0 + rfeea r0! + + rfeed r0 + rfeed r0! + + rfefa r0 + rfefa r0! + + rfefd r0 + rfefd r0! + + rfeia r0 + rfeia r0! + + rfeib r0 + rfeib r0! + + sadd16 r0,r1 + sadd16 r0,r1,r2 + + sadd8 r0,r1 + sadd8 r0,r1,r2 + + saddsubx r0,r1 + saddsubx r0,r1,r2 + + sasx r0,r1 + sasx r0,r1,r2 + + sel r0,r1 + sel r0,r1,r2 + + setend le + + ssax r0,r1 + ssax r0,r1,r2 + + ssub16 r0,r1 + ssub16 r0,r1,r2 + + ssub8 r0,r1 + ssub8 r0,r1,r2 + + ssubaddx r0,r1 + ssubaddx r0,r1,r2 + + shadd16 r0,r1 + shadd16 r0,r1,r2 + + shadd8 r0,r1 + shadd8 r0,r1,r2 + + shaddsubx r0,r1 + shaddsubx r0,r1,r2 + + shasx r0,r1 + shasx r0,r1,r2 + + shsax r0,r1 + shsax r0,r1,r2 + + shsub16 r0,r1 + shsub16 r0,r1,r2 + + shsub8 r0,r1 + shsub8 r0,r1,r2 + + shsubaddx r0,r1 + shsubaddx r0,r1,r2 + + smlad r0,r1,r2,r3 + + smladx r0,r1,r2,r3 + + smlald r0,r1,r2,r3 + + smlaldx r0,r1,r2,r3 + + smlsd r0,r1,r2,r3 + + smlsdx r0,r1,r2,r3 + + smlsld r0,r1,r2,r3 + + smlsldx r0,r1,r2,r3 + + smmla r0,r1,r2,r3 + + smmlar r0,r1,r2,r3 + + smmls r0,r1,r2,r3 + + smmlsr r0,r1,r2,r3 + + smmul r0,r1 + smmul r0,r1,r2 + + smmulr r0,r1 + smmulr r0,r1,r2 + + smuad r0,r1 + smuad r0,r1,r2 + + smuadx r0,r1 + smuadx r0,r1,r2 + + smusd r0,r1 + smusd r0,r1,r2 + + smusdx r0,r1 + smusdx r0,r1,r2 + + srs 0 + srs 0 ! + srs sp,0 + srs sp!,0 + + srsda 0 + srsda 0 ! + srsda sp,0 + srsda sp!,0 + + srsdb 0 + srsdb 0 ! + srsdb sp,0 + srsdb sp!,0 + + srsea 0 + srsea 0 ! + srsea sp,0 + srsea sp!,0 + + srsed 0 + srsed 0 ! + srsed sp,0 + srsed sp!,0 + + srsfa 0 + srsfa 0 ! + srsfa sp,0 + srsfa sp!,0 + + srsfd 0 + srsfd 0 ! + srsfd sp,0 + srsfd sp!,0 + + srsia 0 + srsia 0 ! + srsia sp,0 + srsia sp!,0 + + srsib 0 + srsib 0 ! + srsib sp,0 + srsib sp!,0 + + ssat r0,1,r2 + ssat r0,1,r2,lsl 3 + ssat r0,1,r2,asr 3 + + ssat16 r0,1,r2 + + strex r0,r1,[r1] + strex r0,r1,[r1,0] + + sxtab r0,r1,r2 + sxtab r0,r1,r2,ror 8 + + sxtab16 r0,r1,r2 + sxtab16 r0,r1,r2,ror 8 + + sxtah r0,r1,r2 + sxtah r0,r1,r2,ror 8 + + sxtb r0,r1 + sxtb r0,r1,ror 8 + + sxtb16 r0,r1 + sxtb16 r0,r1,ror 8 + + sxth r0,r1 + sxth r0,r1,ror 8 + + uadd16 r0,r1 + uadd16 r0,r1,r2 + + uadd8 r0,r1 + uadd8 r0,r1,r2 + + uaddsubx r0,r1 + uaddsubx r0,r1,r2 + + uasx r0,r1 + uasx r0,r1,r2 + + usax r0,r1 + usax r0,r1,r2 + + usub16 r0,r1 + usub16 r0,r1,r2 + + usub8 r0,r1 + usub8 r0,r1,r2 + + usubaddx r0,r1 + usubaddx r0,r1,r2 + + uhadd16 r0,r1 + uhadd16 r0,r1,r2 + + uhadd8 r0,r1 + uhadd8 r0,r1,r2 + + uhaddsubx r0,r1 + uhaddsubx r0,r1,r2 + + uhasx r0,r1 + uhasx r0,r1,r2 + + uhsax r0,r1 + uhsax r0,r1,r2 + + uhsub16 r0,r1 + uhsub16 r0,r1,r2 + + uhsub8 r0,r1 + uhsub8 r0,r1,r2 + + uhsubaddx r0,r1 + uhsubaddx r0,r1,r2 + + umaal r0,r1,r2,r3 + + uqadd16 r0,r1 + uqadd16 r0,r1,r2 + + uqadd8 r0,r1 + uqadd8 r0,r1,r2 + + uqaddsubx r0,r1 + uqaddsubx r0,r1,r2 + + uqasx r0,r1 + uqasx r0,r1,r2 + + uqsax r0,r1 + uqsax r0,r1,r2 + + uqsub16 r0,r1 + uqsub16 r0,r1,r2 + + uqsub8 r0,r1 + uqsub8 r0,r1,r2 + + uqsubaddx r0,r1 + uqsubaddx r0,r1,r2 + + usad8 r0,r1,r2 + + usada8 r0,r1,r2,r3 + + usat r0,1,r2 + usat r0,1,r2,lsl 3 + usat r0,1,r2,asr 3 + + usat16 r0,1,r2 + + uxtab r0,r1,r2 + uxtab r0,r1,r2,ror 8 + + uxtab16 r0,r1,r2 + uxtab16 r0,r1,r2,ror 8 + + uxtah r0,r1,r2 + uxtah r0,r1,r2,ror 8 + + uxtb r0,r1 + uxtb r0,r1,ror 8 + + uxtb16 r0,r1 + uxtb16 r0,r1,ror 8 + + uxth r0,r1 + uxth r0,r1,ror 8 + +processor CPU32_K + + clrex + + ldrexb r0,[r1] + ldrexb r0,[r1,0] + + ldrexd r0,[r1] + ldrexd r0,r1,[r2] + + ldrexh r0,[r1] + ldrexh r0,[r1,0] + + strexb r0,r1,[r2] + strexb r0,r1,[r2,0] + + strexd r0,r2,[r4] + strexd r0,r2,r3,[r4] + + strexh r0,r1,[r2] + strexh r0,r1,[r2,0] + + sev + + wfe + + wfi + + yield + +processor CPU32_Z + + smc 0 + + smi 0 + +processor CPU32_T2 + + bfc r0,1,2 + + bfi r0,r1,2,3 + + mls r0,r1,r2,r3 + + rbit r0,r1 + + ldrht r0,[r1] + ldrht r0,[r1],r2 + ldrht r0,[r1],-r2 + ldrht r0,[r1],2 + + ldrsbt r0,[r1] + ldrsbt r0,[r1],-r2 + ldrsbt r0,[r1],r2 + ldrsbt r0,[r1],2 + + ldrsht r0,[r1] + ldrsht r0,[r1],r2 + ldrsht r0,[r1],-r2 + ldrsht r0,[r1],2 + + movt r0,1 + + movw r0,1 + + sbfx r0,r1,2,3 + + strht r0,[r1] + strht r0,[r1],r2 + strht r0,[r1],-r2 + strht r0,[r1],2 + + ubfx r0,r1,2,3 + +processor CPU32_V7 + + dbg 0 + + dmb + dmb sy + + dsb + dsb sy + + isb + isb sy + + label_pli: + pli [r0] + pli [r0,1] + pli [r0,r1] + pli [r0,-r1] + pli [r0,r1,lsl 2] + pli [r0,r1,lsr 2] + pli [r0,r1,asr 2] + pli [r0,r1,ror 2] + pli [r0,-r1,lsl 2] + pli [r0,-r1,lsr 2] + pli [r0,-r1,asr 2] + pli [r0,-r1,ror 2] + pli [r0,r1,rrx] + pli [r0,-r1,rrx] + pli [label_pli] + pli [expression.byte] + +processor CPU32_MP + + label_pldw: + pldw [r0] + pldw [r0,1] + pldw [r0,r1] + pldw [r0,-r1] + pldw [r0,r1,lsl 2] + pldw [r0,r1,lsr 2] + pldw [r0,r1,asr 2] + pldw [r0,r1,ror 2] + pldw [r0,-r1,lsl 2] + pldw [r0,-r1,lsr 2] + pldw [r0,-r1,asr 2] + pldw [r0,-r1,ror 2] + pldw [r0,r1,rrx] + pldw [r0,-r1,rrx] + pldw [label_pldw] + pldw [expression.byte] + +processor CPU32_VE + + eret + + hvc 0 + + msr lr_fiq,r0 + + mrs r0,lr_fiq + + sdiv r0,r1 + sdiv r0,r1,r2 + + udiv r0,r1 + udiv r0,r1,r2 + +processor CPU32_V8 + + hlt 0 + + lda r0,[r1] + ldab r0,[r1] + ldah r0,[r1] + + ldaex r0,[r1] + ldaexb r0,[r1] + ldaexh r0,[r1] + ldaexd r0,[r2] + ldaexd r0,r1,[r2] + + sevl + + stl r0,[r1] + stlb r0,[r1] + stlh r0,[r1] + + stlex r2,r0,[r3] + stlexb r2,r0,[r3] + stlexh r2,r0,[r3] + stlexd r2,r0,[r3] + stlexd r2,r0,r1,[r3] + +processor CPU32_CRC + + crc32b r0,r1,r2 + crc32h r0,r1,r2 + crc32w r0,r1,r2 + + crc32cb r0,r1,r2 + crc32ch r0,r1,r2 + crc32cw r0,r1,r2 + +processor 0 ;In ARM mode, UND is always encodable, it ignores the processor directive + + und + und 0 diff --git a/armdoc/InstructionFormatsARM64.asm b/armdoc/InstructionFormatsARM64.asm new file mode 100644 index 0000000..d312ed0 --- /dev/null +++ b/armdoc/InstructionFormatsARM64.asm @@ -0,0 +1,3831 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions show the condition or flag +;writeback ("s") syntaxes. Only the branch (b.cc) +;instruction can be conditional. The condition code +;should be added at the end of the main opcode. For +;example: "b.hi". + +;This file can be assembled by fasmarm. + +label expression.byte byte at x2+1 +label expression.hword hword at x2+2 +label expression.word word at x2+4 +label expression.dword dword at x2+8 +label expression.qword qword at x2+16 +label expression.dqword dqword at x2+32 + + ;************************************************** + ;ARM64 mode, all instructions are 32-bits in length + ;************************************************** + + code64 + +processor CPU64_V8 + + adc w0,w1,w2 + adc x0,x1,x2 + + adcs w0,w1,w2 + adcs x0,x1,x2 + + add sp,sp,0x123 + add sp,x2,0x123 + add w1,w2,0x123 + add w4,w8,0x123,lsl 12 + add wsp,w2,0x123 + add wsp,wsp,0x123 + add w1,w2,wzr + add w1,w2,w3 + add w1,w2,w3,asr 1 + add w1,w2,w3,lsl 1 + add w1,w2,w3,lsr 1 + add w1,w2,w3,sxtb + add w1,w2,w3,sxtb 1 + add w1,w2,w3,sxth + add w1,w2,w3,sxth 1 + add w1,w2,w3,sxtw + add w1,w2,w3,sxtw 1 + add w1,w2,w3,uxtb + add w1,w2,w3,uxtb 1 + add w1,w2,w3,uxth + add w1,w2,w3,uxth 1 + add w1,w2,w3,uxtw + add w1,w2,w3,uxtw 1 + add w1,wsp,w2,uxtw 2 + add w1,wsp,w3,uxtw + add w1,wsp,w3,uxtw 1 + add wsp,w2,w3,uxtw + add wsp,wsp,w3,uxtw + add wzr,w2,w3 + add wzr,w2,wzr + add wzr,wzr,w3 + add wzr,wzr,wzr + add x1,x2,x3 + add x1,x2,0x123 + add x1,x2,0xFFF + add x1,x2,0xFFF,lsl 12 + add x1,sp,0x123 + add x1,sp,x3,uxtx + add x1,sp,x3,uxtx 4 + add x1,x2,w3,sxtb + add x1,x2,w3,sxtb 2 + add x1,x2,w3,sxth + add x1,x2,w3,sxth 2 + add x1,x2,w3,sxtw + add x1,x2,w3,sxtw 2 + add x1,x2,w3,uxtb + add x1,x2,w3,uxtb 2 + add x1,x2,w3,uxth + add x1,x2,w3,uxth 2 + add x1,x2,w3,uxtw + add x1,x2,w3,uxtw 2 + add x1,x2,x3,asr 1 + add x1,x2,x3,asr 63 + add x1,x2,x3,lsl 1 + add x1,x2,x3,lsr 1 + add x1,x2,x3,sxtx + add x1,x2,x3,sxtx 3 + add x1,x2,x3,uxtx + add x1,x2,x3,uxtx 2 + add w1,wsp,w3 + add w1,w3,wsp + add x1,sp,x3 + add x1,x3,sp + + adds w1,w2,w3 + adds w1,w2,wzr + adds w1,wsp,0x123 + adds w1,wsp,w3,uxtw + adds w1,wsp,w2,uxtw 2 + adds w1,wzr,w3 + adds w1,wzr,wzr + adds w8,w16,0x123,lsl 12 + adds x8,x16,0x123,lsl 12 + adds x1,x2,x3,asr 63 + adds w1,wsp,w3 + adds w1,w3,wsp + adds x1,sp,x3 + adds x1,x3,sp + + label_adr: + adr x1,label_adr + + adrp x1,$ + + and w1,w2,0x0001FE00 + and w1,w2,w3 + and w1,w2,w3,asr 4 + and w1,w2,w3,lsl 4 + and w1,w2,w3,lsr 4 + and w1,w2,w3,ror 4 + and wzr,w2,w3,ror 4 + and x1,x2,0x0003FC0000000000 + and x1,x2,x3 + and x1,x2,x3,lsl 4 + and x1,x2,x3,ror 4 + and xzr,x2,x3,ror 4 + + ands w1,w2,0xFFFFFFF1 + ands w1,w2,w3 + ands w1,w2,w3,lsl 4 + ands w1,w2,w3,ror 4 + ands x1,x2,0x5555555555555555 + ands x1,x2,x3 + ands x1,x2,x3,lsl 4 + ands x1,x2,x3,ror 4 + + asr w1,w2,1 + asr w1,w2,w3 + asr x1,x2,1 + asr x1,x2,x3 + + asrv w1,w2,w3 + asrv x1,x2,x3 + + at s12e0r,x1 + at s12e0w,x1 + at s12e1r,x1 + at s12e1w,x1 + at s1e0r,x1 + at s1e0w,x1 + at s1e1r,x1 + at s1e1w,x1 + at s1e2r,x1 + at s1e2w,x1 + at s1e3r,x1 + at s1e3w,x1 + + label_b: + b label_b + b.al label_b + b.eq label_b + b.eq label_b + b.ge label_b + b.gt label_b + b.hi label_b + b.hs label_b + b.le label_b + b.lo label_b + b.ls label_b + b.lt label_b + b.mi label_b + b.ne label_b + b.pl label_b + b.vc label_b + b.vs label_b + + bfi w1,w2,3,27 + bfi x1,x2,3,59 + + bfm w1,w2,3,31 + bfm x1,x2,3,45 + + bfxil w1,w2,3,29 + bfxil x1,x2,3,29 + + bic w1,w2,w3 + bic w1,w2,w3,asr 4 + bic w1,w2,w3,lsl 4 + bic w1,w2,w3,lsr 4 + bic w1,w2,w3,ror 4 + bic x1,x2,x3 + bic x1,x2,x3,lsl 4 + bic x1,x2,x3,ror 4 + + bics w1,w2,w3 + bics w1,w2,w3,lsl 4 + bics w1,w2,w3,ror 4 + bics x1,x2,x3 + bics x1,x2,x3,lsl 4 + bics x1,x2,x3,ror 4 + + label_bl: + bl label_bl + + blr x1 + + br x1 + + brk 0xFFFF + + label_cbnz: + cbnz w1,label_cbnz + cbnz x1,label_cbnz + + label_cbz: + cbz w1,label_cbz + cbz x1,label_cbz + + ccmn w1,2,0x0,ls + ccmn w1,w2,0x0,hs + ccmn x1,31,0x0,vs + ccmn x1,x2,0x1,ge + + ccmp w1,2,0x0,ls + ccmp w1,w2,0x0,hs + ccmp x1,31,0x0,vs + ccmp x1,x2,0x1,ge + + cinc w1,w2,hs + + cinv w1,w2,hs + + clrex 0x5 + + cls w1,w2 + cls x1,x2 + + clz w1,w2 + clz x1,x2 + + cmn sp,x3,uxtx + cmn sp,x3,uxtx 1 + cmn w2,w3 + cmn w2,w3,asr 1 + cmn w2,w3,asr 31 + cmn w2,w3,lsl 1 + cmn w2,w3,lsr 1 + cmn wsp,w3,uxtw + cmn wsp,w3,uxtw 1 + cmn x1,0x2 + cmn x2,x3 + cmn x2,x3,asr 1 + cmn x2,x3,asr 63 + cmn x2,x3,lsl 1 + cmn x2,x3,lsr 1 + + cmp sp,x3,uxtx + cmp sp,x3,uxtx 1 + cmp w2,w3 + cmp w2,w3,asr 1 + cmp w2,w3,asr 31 + cmp w2,w3,lsl 1 + cmp w2,w3,lsr 1 + cmp wsp,w3,uxtw + cmp wsp,w3,uxtw 1 + cmp x1,0x2 + cmp x2,x3 + cmp x2,x3,asr 1 + cmp x2,x3,asr 63 + cmp x2,x3,lsl 1 + cmp x2,x3,lsr 1 + + cneg w1,w2,hs + cneg xzr,xzr,hs + + csel w1,w2,w3,ne + csel x1,x2,x3,vs + + cset w1,ne + cset x1,vs + + csetm w1,ne + csetm x1,vs + + csinc w1,w2,w3,ne + csinc x1,x2,x3,vs + + csinv w1,w2,w3,ne + csinv x1,x2,x3,vs + + csneg w1,w2,w3,ne + csneg x1,x2,x3,vs + + dc cisw,x1 + dc civac,x1 + dc csw,x1 + dc cvac,x1 + dc cvau,x1 + dc isw,x1 + dc ivac,x1 + dc zva,x1 + + dcps1 0x0 + + dcps1 0xFFFF + + dcps2 0xFFFF + + dcps3 0xFFFF + + dmb ish + dmb ishld + dmb ishst + dmb ld + dmb nsh + dmb nshld + dmb nshst + dmb osh + dmb oshld + dmb oshst + dmb st + dmb sy + + drps + + dsb ish + dsb ishld + dsb ishst + dsb ld + dsb nsh + dsb nshld + dsb nshst + dsb osh + dsb oshld + dsb oshst + dsb st + dsb sy + + eon w1,w2,w3 + eon w1,w2,w3,asr 4 + eon w1,w2,w3,lsl 4 + eon w1,w2,w3,lsr 4 + eon w1,w2,w3,ror 4 + eon wzr,w2,w3,ror 4 + eon x1,x2,x3 + eon x1,x2,x3,lsl 4 + eon x1,x2,x3,ror 4 + eon xzr,x2,x3,ror 4 + + eor sp,x2,0xAAAAAAAAAAAAAAAA + eor w1,w2,0xFFFFFFF1 + eor w1,w2,w3 + eor w1,w2,w3,asr 4 + eor w1,w2,w3,lsl 4 + eor w1,w2,w3,lsr 4 + eor w1,w2,w3,ror 4 + eor wzr,w2,w3,ror 4 + eor x1,x2,0xFFFFFFFFFFFFFFF1 + eor x1,x2,x3 + eor x1,x2,x3,lsl 4 + eor x1,x2,x3,ror 4 + eor xzr,x2,x3,ror 4 + + eret + + extr w1,w2,w3,3 + extr x1,x2,x3,35 + + hint 4 + + hlt 0xFFFF + + hvc 0xFFFF + + ic iallu + ic ialluis + ic ivau,x1 + ic ivau,xzr + + isb sy + + ldar w1,[x2] + ldar w1,[x2,0] + ldar x3,[x8] + ldar x3,[x8,0] + + ldarb w1,[x2] + ldarb w1,[x2,0] + + ldarh w1,[x2] + ldarh w1,[x2,0] + + ldaxp w1,w8,[x2] + ldaxp w1,w8,[x2,0] + ldaxp x3,x2,[x8] + ldaxp x3,x2,[x8,0] + + ldaxr w1,[x2] + ldaxr w1,[x2,0] + ldaxr x3,[x8] + ldaxr x3,[x8,0] + + ldaxrb w1,[x2] + ldaxrb w1,[x2,0] + + ldaxrh w1,[x2] + ldaxrh w1,[x2,0] + + ldnp w0,w1,[x2] + ldnp w0,w1,[x2,+0x8] + ldnp w0,w1,[expression.dword] + ldnp x0,x1,[x2] + ldnp x0,x1,[x2,+0x8] + ldnp x0,x1,[expression.qword] + + ldp w0,w1,[x2] + ldp w0,w1,[x2,+0x8] + ldp w0,w1,[expression.dword] + ldp w0,w1,[x2,+0x8]! + ldp w0,w1,[expression.dword]! + ldp w0,w1,[x2],+0x8 + ldp x0,x1,[x2] + ldp x0,x1,[x2,+0x8] + ldp x0,x1,[expression.qword] + ldp x0,x1,[x2,+0x8]! + ldp x0,x1,[expression.qword]! + ldp x0,x1,[x2],+0x8 + + ldpsw x0,x1,[x2] + ldpsw x0,x1,[x2,+0x8] + ldpsw x0,x1,[expression.dword] + ldpsw x0,x1,[x2,+0x8]! + ldpsw x0,x1,[expression.dword]! + ldpsw x0,x1,[x2],+0x8 + + label_ldr: + ldr w0,[x2,+0x8] + ldr w0,[expression.word] + ldr w0,[x2,+0x8]! + ldr w0,[expression.word]! + ldr w0,[x2],+0x8 + ldr w0,[x2,w3,sxtw] + ldr w0,[x2,w3,sxtw 2] + ldr w0,[x2,w3,uxtw] + ldr w0,[x2,w3,uxtw 2] + ldr w0,[x2,x3] + ldr w0,[x2,x3,lsl 2] + ldr w0,[x2,x3,sxtx] + ldr w0,[x2,x3,sxtx 2] + ldr w0,label_ldr + ldr w0,[label_ldr] + ldr x0,[x2,+0x8] + ldr x0,[expression.dword] + ldr x0,[x2,+0x8]! + ldr x0,[expression.dword]! + ldr x0,[x2],+0x8 + ldr x0,[x2,w3,sxtw] + ldr x0,[x2,w3,sxtw 3] + ldr x0,[x2,w3,uxtw] + ldr x0,[x2,w3,uxtw 3] + ldr x0,[x2,x3] + ldr x0,[x2,x3,lsl 3] + ldr x0,[x2,x3,sxtx] + ldr x0,[x2,x3,sxtx 3] + ldr x0,label_ldr + ldr x0,[label_ldr] + + ldrb w0,[x2] + ldrb w0,[x2,+0x8] + ldrb w0,[expression.byte] + ldrb w0,[x2,+0x8]! + ldrb w0,[expression.byte]! + ldrb w0,[x2],+0x8 + ldrb w0,[x2,w3,sxtw] + ldrb w0,[x2,w3,sxtw 0] + ldrb w0,[x2,w3,uxtw] + ldrb w0,[x2,w3,uxtw 0] + ldrb w0,[x2,x3] + ldrb w0,[x2,x3,lsl 0] + ldrb w0,[x2,x3,sxtx] + ldrb w0,[x2,x3,sxtx 0] + + ldrh w0,[x2] + ldrh w0,[x2,+0x8] + ldrh w0,[expression.hword] + ldrh w0,[x2,+0x8]! + ldrh w0,[expression.hword]! + ldrh w0,[x2],+0x8 + ldrh w0,[x2,w3,sxtw] + ldrh w0,[x2,w3,sxtw 1] + ldrh w0,[x2,w3,uxtw] + ldrh w0,[x2,w3,uxtw 1] + ldrh w0,[x2,x3] + ldrh w0,[x2,x3,lsl 1] + ldrh w0,[x2,x3,sxtx] + ldrh w0,[x2,x3,sxtx 1] + + ldrsb w0,[x2] + ldrsb w0,[x2,+0x8] + ldrsb w0,[expression.byte] + ldrsb w0,[x2,+0x8]! + ldrsb w0,[expression.byte]! + ldrsb w0,[x2],+0x8 + ldrsb w0,[x2,w3,sxtw] + ldrsb w0,[x2,w3,sxtw 0] + ldrsb w0,[x2,w3,uxtw] + ldrsb w0,[x2,w3,uxtw 0] + ldrsb w0,[x2,x3] + ldrsb w0,[x2,x3,lsl 0] + ldrsb w0,[x2,x3,sxtx] + ldrsb w0,[x2,x3,sxtx 0] + + ldrsh w0,[x2] + ldrsh w0,[x2,+0x8] + ldrsh w0,[expression.hword] + ldrsh w0,[x2,+0x8]! + ldrsh w0,[expression.hword]! + ldrsh w0,[x2],+0x8 + ldrsh w0,[x2,w3,sxtw] + ldrsh w0,[x2,w3,sxtw 1] + ldrsh w0,[x2,w3,uxtw] + ldrsh w0,[x2,w3,uxtw 1] + ldrsh w0,[x2,x3] + ldrsh w0,[x2,x3,lsl 1] + ldrsh w0,[x2,x3,sxtx] + ldrsh w0,[x2,x3,sxtx 1] + + label_ldrsw: + ldrsw x0,[x2] + ldrsw x0,[x2,+0x8] + ldrsw x0,[expression.word] + ldrsw x0,[x2,+0x8]! + ldrsw x0,[expression.word]! + ldrsw x0,[x2],+0x8 + ldrsw x0,[x2,w3,sxtw] + ldrsw x0,[x2,w3,sxtw 2] + ldrsw x0,[x2,w3,uxtw] + ldrsw x0,[x2,w3,uxtw 2] + ldrsw x0,[x2,x3] + ldrsw x0,[x2,x3,lsl 2] + ldrsw x0,[x2,x3,sxtx] + ldrsw x0,[x2,x3,sxtx 2] + ldrsw x1,label_ldrsw + ldrsw x1,[label_ldrsw] + + ldtr w0,[x2] + ldtr w0,[x2,+0x8] + ldtr w0,[expression.word] + ldtr x0,[x2] + ldtr x0,[x2,+0x8] + ldtr x0,[expression.dword] + + ldtrb w0,[x2] + ldtrb w0,[x2,+0x8] + ldtrb w0,[expression.byte] + + ldtrh w0,[x2] + ldtrh w0,[x2,+0x8] + ldtrh w0,[expression.hword] + + ldtrsb w0,[x2] + ldtrsb w0,[x2,+0x8] + ldtrsb w0,[expression.byte] + + ldtrsh w0,[x2] + ldtrsh w0,[x2,+0x8] + ldtrsh w0,[expression.hword] + + ldtrsw x0,[x2] + ldtrsw x0,[x2,+0x8] + ldtrsw x0,[expression.word] + + ldur w0,[x2] + ldur w0,[x2,+0x8] + ldur w0,[expression.word] + ldur x0,[x2] + ldur x0,[x2,+0x8] + ldur x0,[expression.dword] + + ldurb w0,[x2] + ldurb w0,[x2,+0x8] + ldurb w0,[expression.byte] + + ldurh w0,[x2] + ldurh w0,[x2,+0x8] + ldurh w0,[expression.hword] + + ldursb w0,[x2] + ldursb w0,[x2,+0x8] + ldursb w0,[expression.byte] + + ldursh w0,[x2] + ldursh w0,[x2,+0x8] + ldursh w0,[expression.hword] + + ldursw x0,[x2] + ldursw x0,[x2,+0x8] + ldursw x0,[expression.word] + + ldxp w1,w8,[x2] + ldxp w1,w8,[x2,0] + ldxp x3,x2,[x8] + ldxp x3,x2,[x8,0] + + ldxr w1,[x2] + ldxr w1,[x2,0] + ldxr x3,[x8] + ldxr x3,[x8,0] + + ldxrb w1,[x2] + ldxrb w1,[x2,0] + + ldxrh w1,[x2] + ldxrh w1,[x2,0] + + lsl w1,w2,1 + lsl w1,w2,w3 + lsl x1,x2,1 + lsl x1,x2,x3 + + lslv w1,w2,w3 + lslv x1,x2,x3 + + lsr w1,w2,1 + lsr w1,w2,w3 + lsr x1,x2,1 + lsr x1,x2,x3 + + lsrv w1,w2,w3 + lsrv x1,x2,x3 + + madd w1,w2,w3,w4 + madd x1,x2,x3,x4 + + mneg w1,w2,w3 + mneg x1,x2,x3 + + mov sp,sp + mov sp,x1 + mov w0,w1 + mov w1,0x00FFFFF0 + mov w1,0x000FFFFF + mov w1,0x100FFFFF + mov wsp,0x0000FFFF + mov wsp,w1 + mov wsp,wsp + mov wzr,w1 + mov wzr,wzr + mov x0,x1 + mov x1,0x000FFFFFFFFFFFF0 + mov x1,0x0000FFFFFFFFFFFF + mov x1,0x1000FFFFFFFFFFFF + mov x1,sp + mov xzr,x1 + mov xzr,xzr + + movk x0,0,lsl 0 + movk x0,0,lsl 16 + movk x0,0,lsl 32 + movk x0,0,lsl 48 + + movn x0,0,lsl 0 + movn x0,0,lsl 16 + movn x0,0,lsl 32 + movn x0,0,lsl 48 + + movz x0,0,lsl 0 + movz x0,0,lsl 16 + movz x0,0,lsl 32 + movz x0,0,lsl 48 + + movk w1,0xFFFF + movk w1,0xFFFF,lsl 16 + movk x1,0xFFFF,lsl 32 + movk x1,0xFFFF,lsl 48 + + movn w1,0xFFFF + movn w1,0xFFFF,lsl 16 + + movz w1,0xffff + movz w1,0xffff,lsl 0 + movz w1,0xffff,lsl 16 + movz x1,0xffff,lsl 32 + movz x1,0xffff,lsl 48 + + mrs x1,vttbr_el2 + mrs x2,s3_2_c3_c4_5 + mrs x8,spsel + + msr actlr_el1,x1 + msr s3_2_c3_c4_5,x1 + + msub w1,w2,w3,w4 + msub x1,x2,x3,x4 + + mul w1,w2,w3 + mul x2,x3,x4 + + mvn w1,w2 + mvn w1,w2,asr 4 + mvn w1,w2,lsl 4 + mvn w1,w2,lsr 4 + mvn w1,w2,ror 4 + mvn x1,x2 + mvn x1,x2,asr 4 + mvn x1,x2,lsl 4 + mvn x1,x2,lsr 4 + mvn x1,x2,ror 4 + + neg w1,w2 + neg w1,w2,asr 14 + neg w1,w2,lsl 4 + neg w1,w2,lsr 4 + neg x1,x2 + neg x1,x2,asr 14 + neg x1,x2,lsl 4 + neg x1,x2,lsr 4 + + negs w1,w2 + negs x1,x2 + + ngc w1,w2 + ngc x1,x2 + + ngcs w1,w2 + ngcs x1,x2 + + nop + + orn w1,w2,w3 + orn w1,w2,w3,asr 4 + orn w1,w2,w3,lsl 4 + orn w1,w2,w3,lsr 4 + orn w1,w2,w3,ror 4 + orn x1,x2,x3 + orn x1,x2,x3,asr 4 + orn x1,x2,x3,lsl 4 + orn x1,x2,x3,lsr 4 + orn x1,x2,x3,ror 4 + + orr w1,w2,0xFFFFFFF1 + orr w1,w2,w3 + orr w1,w2,w3,asr 4 + orr w1,w2,w3,lsl 4 + orr w1,w2,w3,lsr 4 + orr w1,w2,w3,ror 4 + orr x1,x2,0xAAAAAAAAAAAAAAAA + orr x1,x2,x3 + orr x1,x2,x3,lsl 4 + orr x1,x2,x3,ror 4 + + label_prfm: + prfm pldl2strm,[x2,+0x8] + prfm pldl2strm,[expression.dword] + prfm pldl2strm,[x2,w3,sxtw] + prfm pldl2strm,[x2,w3,sxtw 3] + prfm pldl2strm,[x2,w3,uxtw] + prfm pldl2strm,[x2,w3,uxtw 3] + prfm pldl2strm,[x2,x3] + prfm pldl2strm,[x2,x3,lsl 3] + prfm pldl2strm,[x2,x3,sxtx] + prfm pldl2strm,[x2,x3,sxtx 3] + prfm pldl2strm,label_prfm + prfm pldl2strm,[label_prfm] + prfm 0x00,[x2,+0x8] + prfm 0x01,[expression.dword] + prfm 0x02,[x2,w3,sxtw] + prfm 0x03,[x2,w3,sxtw 3] + prfm 0x04,[x2,w3,uxtw] + prfm 0x05,[x2,w3,uxtw 3] + prfm 0x06,[x2,x3] + prfm 0x07,[x2,x3,lsl 3] + prfm 0x08,[x2,x3,sxtx] + prfm 0x09,[x2,x3,sxtx 3] + prfm 0x0a,label_prfm + prfm 0x0b,[label_prfm] + + rbit w1,w2 + rbit x1,x2 + + ret + ret x1 + + rev w1,w2 + rev x1,x2 + + rev16 w1,w2 + rev16 x1,x2 + + rev32 x1,x2 + + rev64 x1,x2 + + ror w1,w2,1 + ror w1,w2,w3 + ror x1,x2,1 + ror x1,x2,x3 + + rorv w1,w2,w3 + rorv x1,x2,x3 + + sbc w0,w1,w2 + sbc x0,x1,x2 + + sbcs w0,w1,w2 + sbcs x0,x1,x2 + + sbfiz w1,w2,3,28 + sbfiz x1,x2,3,60 + + sbfm w1,w2,3,30 + sbfm x1,x2,3,45 + + sbfx w1,w2,3,4 + sbfx x1,x2,3,29 + + sdiv w1,w2,w3 + sdiv x1,x2,x3 + + sev + + sevl + + smaddl x1,w2,w3,x4 + + smc 0xFFFF + + smnegl x1,w2,w3 + + smsubl x1,w2,w3,x4 + + smulh x1,x2,x3 + + smull x1,w2,w3 + + stlr w1,[x2] + stlr w1,[x2,0] + stlr x3,[x8] + stlr x3,[x8,0] + + stlrb w1,[x2] + stlrb w1,[x2,0] + + stlrh w1,[x2] + stlrh w1,[x2,0] + + stlxp w1,w2,w3,[x4] + stlxp w1,w2,w3,[x4,0] + stlxp w1,x2,x3,[x4] + stlxp w1,x2,x3,[x4,0] + + stlxr w1,w2,[x3] + stlxr w1,w2,[x3,0] + stlxr w1,x2,[x3] + stlxr w1,x2,[x3,0] + + stlxrb w1,w2,[x3] + stlxrb w1,w2,[x3,0] + + stlxrh w1,w2,[x3] + stlxrh w1,w2,[x3,0] + + stnp w0,w1,[x2] + stnp w0,w1,[x2,+0x8] + stnp w0,w1,[expression.dword] + stnp x0,x1,[x2] + stnp x0,x1,[x2,+0x8] + stnp x0,x1,[expression.qword] + + stp w0,w1,[x2] + stp w0,w1,[x2,+0x8] + stp w0,w1,[expression.dword] + stp w0,w1,[x2,+0x8]! + stp w0,w1,[expression.dword]! + stp w0,w1,[x2],+0x8 + stp x0,x1,[x2] + stp x0,x1,[x2,+0x8] + stp x0,x1,[expression.qword] + stp x0,x1,[x2,+0x8]! + stp x0,x1,[expression.qword]! + stp x0,x1,[x2],+0x8 + + str w0,[x2,+0x8] + str w0,[expression.word] + str w0,[x2,+0x8]! + str w0,[expression.word]! + str w0,[x2],+0x8 + str w0,[x2,w3,sxtw] + str w0,[x2,w3,sxtw 2] + str w0,[x2,w3,uxtw] + str w0,[x2,w3,uxtw 2] + str w0,[x2,x3] + str w0,[x2,x3,lsl 2] + str w0,[x2,x3,sxtx] + str w0,[x2,x3,sxtx 2] + str x0,[x2,+0x8] + str x0,[expression.dword] + str x0,[x2,+0x8]! + str x0,[expression.dword]! + str x0,[x2],+0x8 + str x0,[x2,w3,sxtw] + str x0,[x2,w3,sxtw 3] + str x0,[x2,w3,uxtw] + str x0,[x2,w3,uxtw 3] + str x0,[x2,x3] + str x0,[x2,x3,lsl 3] + str x0,[x2,x3,sxtx] + str x0,[x2,x3,sxtx 3] + + strb w0,[x2] + strb w0,[x2,+0x8] + strb w0,[expression.byte] + strb w0,[x2,+0x8]! + strb w0,[expression.byte]! + strb w0,[x2],+0x8 + strb w0,[x2,w3,sxtw] + strb w0,[x2,w3,sxtw 0] + strb w0,[x2,w3,uxtw] + strb w0,[x2,w3,uxtw 0] + strb w0,[x2,x3] + strb w0,[x2,x3,lsl 0] + strb w0,[x2,x3,sxtx] + strb w0,[x2,x3,sxtx 0] + + strh w0,[x2] + strh w0,[x2,+0x8] + strh w0,[expression.hword] + strh w0,[x2,+0x8]! + strh w0,[expression.hword]! + strh w0,[x2],+0x8 + strh w0,[x2,w3,sxtw] + strh w0,[x2,w3,sxtw 1] + strh w0,[x2,w3,uxtw] + strh w0,[x2,w3,uxtw 1] + strh w0,[x2,x3] + strh w0,[x2,x3,lsl 1] + strh w0,[x2,x3,sxtx] + strh w0,[x2,x3,sxtx 1] + + sttr w0,[x2] + sttr w0,[x2,+0x8] + sttr w0,[expression.word] + sttr x0,[x2] + sttr x0,[x2,+0x8] + sttr x0,[expression.dword] + + sttrb w0,[x2] + sttrb w0,[x2,+0x8] + sttrb w0,[expression.byte] + + sttrh w0,[x2] + sttrh w0,[x2,+0x8] + sttrh w0,[expression.hword] + + stur w0,[x2] + stur w0,[x2,+0x8] + stur w0,[expression.word] + stur x0,[x2] + stur x0,[x2,+0x8] + stur x0,[expression.dword] + + sturb w0,[x2] + sturb w0,[x2,+0x8] + sturb w0,[expression.byte] + + sturh w0,[x2] + sturh w0,[x2,+0x8] + sturh w0,[expression.hword] + + stxp w1,w2,w3,[x4] + stxp w1,w2,w3,[x4,0] + stxp w1,x2,x3,[x4] + stxp w1,x2,x3,[x4,0] + + stxr w1,w2,[x3] + stxr w1,w2,[x3,0] + stxr w1,x2,[x3] + stxr w1,x2,[x3,0] + + stxrb w1,w2,[x3] + stxrb w1,w2,[x3,0] + + stxrh w1,w2,[x3] + stxrh w1,w2,[x3,0] + + sub sp,sp,0x123 + sub sp,x2,0x123 + sub w1,w2,0x123 + sub w4,w8,0x123,lsl 12 + sub wsp,w2,0x123 + sub wsp,wsp,0x123 + sub w1,w2,wzr + sub w1,w2,w3 + sub w1,w2,w3,asr 1 + sub w1,w2,w3,lsl 1 + sub w1,w2,w3,lsr 1 + sub w1,w2,w3,sxtb + sub w1,w2,w3,sxtb 1 + sub w1,w2,w3,sxth + sub w1,w2,w3,sxth 1 + sub w1,w2,w3,sxtw + sub w1,w2,w3,sxtw 1 + sub w1,w2,w3,uxtb + sub w1,w2,w3,uxtb 1 + sub w1,w2,w3,uxth + sub w1,w2,w3,uxth 1 + sub w1,w2,w3,uxtw + sub w1,w2,w3,uxtw 1 + sub w1,wsp,w2,uxtw 2 + sub w1,wsp,w3,uxtw + sub w1,wsp,w3,uxtw 1 + sub wsp,w2,w3,uxtw + sub wsp,wsp,w3,uxtw + sub wzr,w2,w3 + sub wzr,w2,wzr + sub wzr,wzr,w3 + sub wzr,wzr,wzr + sub x1,x2,x3 + sub x1,x2,0x123 + sub x1,x2,0xFFF + sub x1,x2,0xFFF,lsl 12 + sub x1,sp,0x123 + sub x1,sp,x3,uxtx + sub x1,sp,x3,uxtx 4 + sub x1,x2,w3,sxtb + sub x1,x2,w3,sxtb 2 + sub x1,x2,w3,sxth + sub x1,x2,w3,sxth 2 + sub x1,x2,w3,sxtw + sub x1,x2,w3,sxtw 2 + sub x1,x2,w3,uxtb + sub x1,x2,w3,uxtb 2 + sub x1,x2,w3,uxth + sub x1,x2,w3,uxth 2 + sub x1,x2,w3,uxtw + sub x1,x2,w3,uxtw 2 + sub x1,x2,x3,asr 1 + sub x1,x2,x3,asr 63 + sub x1,x2,x3,lsl 1 + sub x1,x2,x3,lsr 1 + sub x1,x2,x3,sxtx + sub x1,x2,x3,sxtx 3 + sub x1,x2,x3,uxtx + sub x1,x2,x3,uxtx 2 + + subs w1,w2,w3 + subs w1,w2,wzr + subs w1,wsp,0x123 + subs w1,wsp,w3,uxtw + subs w1,wsp,w2,uxtw 2 + subs w1,wzr,w3 + subs w1,wzr,wzr + subs w8,w16,0x123,lsl 12 + subs x8,x16,0x123,lsl 12 + subs x1,x2,x3,asr 63 + + svc 0xFFFF + + sxtb w1,w2 + sxtb x1,w2 + + sxth w1,w2 + sxth x1,w2 + + sxtw x1,w2 + + sys 1,c2,c3,4 + sys 1,c2,c3,4,x5 + + sysl x1,2,c3,c4,5 + + label_tbnz: + tbnz w1,2,label_tbnz + tbnz x1,63,label_tbnz + + label_tbz: + tbz w1,2,label_tbz + tbz x1,63,label_tbz + + tlbi alle1 + tlbi aside1,x1 + + tst w1,0x0000000E + tst w1,w2 + tst w2,w3,asr 4 + tst w2,w3,lsl 4 + tst w2,w3,lsr 4 + tst w2,w3,ror 4 + tst x1,0x00000000000FFE00 + tst x1,x2 + tst x2,x3,ror 4 + + ubfiz w1,w2,3,28 + ubfiz x1,x2,3,60 + + ubfm w1,w2,3,31 + ubfm x1,x2,3,31 + + ubfx w1,w2,3,4 + ubfx x1,x2,3,29 + + udiv w1,w2,w3 + udiv x1,x2,x3 + + umaddl x1,w2,w3,x4 + + umnegl x1,w2,w3 + + umsubl x1,w2,w3,x4 + + umull x1,w2,w3 + + umulh x1,x2,x3 + + uxtb w1,w2 + + uxth w1,w2 + + wfe + + wfi + + yield + +processor CPU64_FP + + fabd d1,d2,d3 + fabd s1,s2,s3 + fabd v1.2d,v2.2d,v3.2d + fabd v1.2s,v2.2s,v3.2s + fabd v1.4s,v2.4s,v3.4s + + fabs d1,d2 + fabs s1,s2 + fabs v1.2d,v2.2d + fabs v1.2s,v2.2s + fabs v1.4s,v2.4s + + facge d1,d2,d3 + facge s1,s2,s3 + facge v1.2d,v2.2d,v3.2d + facge v1.2s,v2.2s,v3.2s + facge v1.4s,v2.4s,v3.4s + + facgt d1,d2,d3 + facgt s1,s2,s3 + facgt v1.2d,v2.2d,v3.2d + facgt v1.2s,v2.2s,v3.2s + facgt v1.4s,v2.4s,v3.4s + + fadd d1,d2,d3 + fadd s1,s2,s3 + fadd v1.2d,v2.2d,v3.2d + fadd v1.2s,v2.2s,v3.2s + fadd v1.4s,v2.4s,v3.4s + + faddp d1,v2.2d + faddp s1,v2.2s + faddp v1.2d,v2.2d,v3.2d + faddp v1.2s,v2.2s,v3.2s + faddp v1.4s,v2.4s,v3.4s + + fccmp d1,d2,0x1,ge + fccmp s1,s2,0x0,hs + + fccmpe d1,d2,0x1,ge + fccmpe s1,s2,0x0,hs + + fcmeq d1,d2,0 + fcmeq d1,d2,d3 + fcmeq s1,s2,0 + fcmeq s1,s2,s3 + fcmeq v1.2d,v2.2d,0 + fcmeq v1.2d,v2.2d,v3.2d + fcmeq v1.2s,v2.2s,0 + fcmeq v1.2s,v2.2s,v3.2s + fcmeq v1.4s,v2.4s,0 + fcmeq v1.4s,v2.4s,v3.4s + + fcmge d1,d2,0 + fcmge d1,d2,d3 + fcmge s1,s2,0 + fcmge s1,s2,s3 + fcmge v1.2d,v2.2d,0 + fcmge v1.2d,v2.2d,v3.2d + fcmge v1.2s,v2.2s,0 + fcmge v1.2s,v2.2s,v3.2s + fcmge v1.4s,v2.4s,0 + fcmge v1.4s,v2.4s,v3.4s + + fcmgt d1,d2,0 + fcmgt d1,d2,d3 + fcmgt s1,s2,0 + fcmgt s1,s2,s3 + fcmgt v1.2d,v2.2d,0 + fcmgt v1.2d,v2.2d,v3.2d + fcmgt v1.2s,v2.2s,0 + fcmgt v1.2s,v2.2s,v3.2s + fcmgt v1.4s,v2.4s,0 + fcmgt v1.4s,v2.4s,v3.4s + + fcmle d1,d2,0 + fcmle s1,s2,0 + fcmle v1.2d,v2.2d,0 + fcmle v1.2s,v2.2s,0 + fcmle v1.4s,v2.4s,0 + + fcmlt d1,d2,0 + fcmlt s1,s2,0 + fcmlt v1.2d,v2.2d,0 + fcmlt v1.2s,v2.2s,0 + fcmlt v1.4s,v2.4s,0 + + fcmp d1,0.0 + fcmp d1,d2 + fcmp s1,0.0 + fcmp s1,s2 + + fcmpe d1,0.0 + fcmpe d1,d2 + fcmpe s1,0.0 + fcmpe s1,s2 + + fcsel d1,d2,d3,vs + fcsel s1,s2,s3,ls + + fcvt d1,h2 + fcvt d1,s2 + fcvt h1,d2 + fcvt h1,s2 + fcvt s1,d2 + fcvt s1,h2 + + fcvtas d1,d2 + fcvtas s1,s2 + fcvtas v1.2d,v2.2d + fcvtas v1.2s,v2.2s + fcvtas v1.4s,v2.4s + fcvtas w1,d2 + fcvtas w1,s2 + fcvtas x1,d2 + fcvtas x1,s2 + + fcvtau d1,d2 + fcvtau s1,s2 + fcvtau v1.2d,v2.2d + fcvtau v1.2s,v2.2s + fcvtau v1.4s,v2.4s + fcvtau w1,d2 + fcvtau w1,s2 + fcvtau x1,d2 + fcvtau x1,s2 + + fcvtl v1.2d,v2.2s + fcvtl v1.4s,v2.4h + + fcvtl2 v1.2d,v2.4s + fcvtl2 v1.4s,v2.8h + + fcvtms d1,d2 + fcvtms s1,s2 + fcvtms v1.2d,v2.2d + fcvtms v1.2s,v2.2s + fcvtms v1.4s,v2.4s + fcvtms w1,d2 + fcvtms w1,s2 + fcvtms x1,d2 + fcvtms x1,s2 + + fcvtmu d1,d2 + fcvtmu s1,s2 + fcvtmu v1.2d,v2.2d + fcvtmu v1.2s,v2.2s + fcvtmu v1.4s,v2.4s + fcvtmu w1,d2 + fcvtmu w1,s2 + fcvtmu x1,d2 + fcvtmu x1,s2 + + fcvtn v1.2s,v2.2d + fcvtn v1.4h,v2.4s + + fcvtn2 v1.4s,v2.2d + fcvtn2 v1.8h,v2.4s + + fcvtns d1,d2 + fcvtns s1,s2 + fcvtns v1.2d,v2.2d + fcvtns v1.2s,v2.2s + fcvtns v1.4s,v2.4s + fcvtns w1,d2 + fcvtns w1,s2 + fcvtns x1,d2 + fcvtns x1,s2 + + fcvtnu d1,d2 + fcvtnu s1,s2 + fcvtnu v1.2d,v2.2d + fcvtnu v1.2s,v2.2s + fcvtnu v1.4s,v2.4s + fcvtnu w1,d2 + fcvtnu w1,s2 + fcvtnu x1,d2 + fcvtnu x1,s2 + + fcvtps d1,d2 + fcvtps s1,s2 + fcvtps v1.2d,v2.2d + fcvtps v1.2s,v2.2s + fcvtps v1.4s,v2.4s + fcvtps w1,d2 + fcvtps w1,s2 + fcvtps x1,d2 + fcvtps x1,s2 + + fcvtpu d1,d2 + fcvtpu s1,s2 + fcvtpu v1.2d,v2.2d + fcvtpu v1.2s,v2.2s + fcvtpu v1.4s,v2.4s + fcvtpu w1,d2 + fcvtpu w1,s2 + fcvtpu x1,d2 + fcvtpu x1,s2 + + fcvtxn s1,d2 + fcvtxn v1.2s,v2.2d + + fcvtxn2 v1.4s,v2.2d + + fcvtzs d1,d2 + fcvtzs d1,d2,5 + fcvtzs s1,s2 + fcvtzs s1,s2,5 + fcvtzs v1.2d,v2.2d + fcvtzs v1.2d,v2.2d,5 + fcvtzs v1.2s,v2.2s + fcvtzs v1.2s,v2.2s,5 + fcvtzs v1.4s,v2.4s + fcvtzs v1.4s,v2.4s,5 + fcvtzs w1,d2 + fcvtzs w1,d2,5 + fcvtzs w1,s2 + fcvtzs w1,s2,5 + fcvtzs x1,d2 + fcvtzs x1,d2,5 + fcvtzs x1,s2 + fcvtzs x1,s2,5 + + fcvtzu d1,d2 + fcvtzu d1,d2,5 + fcvtzu s1,s2 + fcvtzu s1,s2,5 + fcvtzu v1.2d,v2.2d + fcvtzu v1.2d,v2.2d,5 + fcvtzu v1.2s,v2.2s + fcvtzu v1.2s,v2.2s,5 + fcvtzu v1.4s,v2.4s + fcvtzu v1.4s,v2.4s,5 + fcvtzu w1,d2 + fcvtzu w1,d2,5 + fcvtzu w1,s2 + fcvtzu w1,s2,5 + fcvtzu x1,d2 + fcvtzu x1,d2,5 + fcvtzu x1,s2 + fcvtzu x1,s2,5 + + fdiv d1,d2,d3 + fdiv s1,s2,s3 + fdiv v1.2d,v2.2d,v3.2d + fdiv v1.2s,v2.2s,v3.2s + fdiv v1.4s,v2.4s,v3.4s + + fmadd d1,d2,d3,d4 + fmadd s1,s2,s3,s4 + + fmax d1,d2,d3 + fmax s1,s2,s3 + fmax v1.2d,v2.2d,v3.2d + fmax v1.2s,v2.2s,v3.2s + fmax v1.4s,v2.4s,v3.4s + + fmaxnm d1,d2,d3 + fmaxnm s1,s2,s3 + fmaxnm v1.2d,v2.2d,v3.2d + fmaxnm v1.2s,v2.2s,v3.2s + fmaxnm v1.4s,v2.4s,v3.4s + + fmaxnmp d1,v2.2d + fmaxnmp s1,v2.2s + fmaxnmp v1.2d,v2.2d,v3.2d + fmaxnmp v1.2s,v2.2s,v3.2s + fmaxnmp v1.4s,v2.4s,v3.4s + + fmaxnmv s1,v2.4s + + fmaxp d1,v2.2d + fmaxp s1,v2.2s + fmaxp v1.2d,v2.2d,v3.2d + fmaxp v1.2s,v2.2s,v3.2s + fmaxp v1.4s,v2.4s,v3.4s + + fmaxv s1,v2.4s + + fmin d1,d2,d3 + fmin s1,s2,s3 + fmin v1.2d,v2.2d,v3.2d + fmin v1.2s,v2.2s,v3.2s + fmin v1.4s,v2.4s,v3.4s + + fminnm d1,d2,d3 + fminnm s1,s2,s3 + fminnm v1.2d,v2.2d,v3.2d + fminnm v1.2s,v2.2s,v3.2s + fminnm v1.4s,v2.4s,v3.4s + + fminnmp d1,v2.2d + fminnmp s1,v2.2s + fminnmp v1.2d,v2.2d,v3.2d + fminnmp v1.2s,v2.2s,v3.2s + fminnmp v1.4s,v2.4s,v3.4s + + fminnmv s1,v2.4s + + fminp d1,v2.2d + fminp s1,v2.2s + fminp v1.2d,v2.2d,v3.2d + fminp v1.2s,v2.2s,v3.2s + fminp v1.4s,v2.4s,v3.4s + + fminv s1,v2.4s + + fmla d1,d2,v3.d[1] + fmla s1,s2,v3.s[3] + fmla v1.2d,v2.2d,v3.2d + fmla v1.2d,v2.2d,v3.d[0] + fmla v1.2s,v2.2s,v3.2s + fmla v1.2s,v2.2s,v3.s[2] + fmla v1.4s,v2.4s,v3.4s + fmla v1.4s,v2.4s,v3.s[1] + + fmls d1,d2,v3.d[1] + fmls s1,s2,v3.s[3] + fmls v1.2d,v2.2d,v3.2d + fmls v1.2d,v2.2d,v3.d[0] + fmls v1.2s,v2.2s,v3.2s + fmls v1.2s,v2.2s,v3.s[2] + fmls v1.4s,v2.4s,v3.4s + fmls v1.4s,v2.4s,v3.s[1] + + fmov d1,3.375 + fmov d1,d2 + fmov d1,x2 + fmov s1,4.25 + fmov s1,s2 + fmov s1,w2 + fmov v1.2d,7.75 + fmov v1.2s,5.5 + fmov v1.4s,6.75 + fmov v1.d[1],x2 + fmov w1,s2 + fmov x1,d2 + fmov x1,v2.d[1] + + fmsub d1,d2,d3,d4 + fmsub s1,s2,s3,s4 + + fmul d1,d2,d3 + fmul d1,d2,v3.d[1] + fmul s1,s2,s3 + fmul s1,s2,v3.s[3] + fmul v1.2d,v2.2d,v3.2d + fmul v1.2d,v2.2d,v3.d[0] + fmul v1.2s,v2.2s,v3.2s + fmul v1.2s,v2.2s,v3.s[2] + fmul v1.4s,v2.4s,v3.4s + fmul v1.4s,v2.4s,v3.s[1] + + fmulx d1,d2,d3 + fmulx d1,d2,v3.d[1] + fmulx s1,s2,s3 + fmulx s1,s2,v3.s[3] + fmulx v1.2d,v2.2d,v3.2d + fmulx v1.2d,v2.2d,v3.d[0] + fmulx v1.2s,v2.2s,v3.2s + fmulx v1.2s,v2.2s,v3.s[2] + fmulx v1.4s,v2.4s,v3.4s + fmulx v1.4s,v2.4s,v3.s[1] + + fneg d1,d2 + fneg s1,s2 + fneg v1.2d,v2.2d + fneg v1.2s,v2.2s + fneg v1.4s,v2.4s + + fnmadd d1,d2,d3,d4 + fnmadd s1,s2,s3,s4 + + fnmsub d1,d2,d3,d4 + fnmsub s1,s2,s3,s4 + + fnmul d1,d2,d3 + fnmul s1,s2,s3 + + frecpe d1,d2 + frecpe s1,s2 + frecpe v1.2d,v2.2d + frecpe v1.2s,v2.2s + frecpe v1.4s,v2.4s + + frecps d1,d2,d3 + frecps s1,s2,s3 + frecps v1.2d,v2.2d,v3.2d + frecps v1.2s,v2.2s,v3.2s + frecps v1.4s,v2.4s,v3.4s + + frecpx d1,d2 + frecpx s1,s2 + + frinta d1,d2 + frinta s1,s2 + frinta v1.2d,v2.2d + frinta v1.2s,v2.2s + frinta v1.4s,v2.4s + + frinti d1,d2 + frinti s1,s2 + frinti v1.2d,v2.2d + frinti v1.2s,v2.2s + frinti v1.4s,v2.4s + + frintm d1,d2 + frintm s1,s2 + frintm v1.2d,v2.2d + frintm v1.2s,v2.2s + frintm v1.4s,v2.4s + + frintn d1,d2 + frintn s1,s2 + frintn v1.2d,v2.2d + frintn v1.2s,v2.2s + frintn v1.4s,v2.4s + + frintp d1,d2 + frintp s1,s2 + frintp v1.2d,v2.2d + frintp v1.2s,v2.2s + frintp v1.4s,v2.4s + + frintx d1,d2 + frintx s1,s2 + frintx v1.2d,v2.2d + frintx v1.2s,v2.2s + frintx v1.4s,v2.4s + + frintz d1,d2 + frintz s1,s2 + frintz v1.2d,v2.2d + frintz v1.2s,v2.2s + frintz v1.4s,v2.4s + + frsqrte d1,d2 + frsqrte s1,s2 + frsqrte v1.2d,v2.2d + frsqrte v1.2s,v2.2s + frsqrte v1.4s,v2.4s + frsqrts d1,d2,d3 + frsqrts s1,s2,s3 + frsqrts v1.2d,v2.2d,v3.2d + frsqrts v1.2s,v2.2s,v3.2s + frsqrts v1.4s,v2.4s,v3.4s + + fsqrt d1,d2 + fsqrt s1,s2 + fsqrt v1.2d,v2.2d + fsqrt v1.2s,v2.2s + fsqrt v1.4s,v2.4s + + fsub d1,d2,d3 + fsub s1,s2,s3 + fsub v1.2d,v2.2d,v3.2d + fsub v1.2s,v2.2s,v3.2s + fsub v1.4s,v2.4s,v3.4s + + scvtf d1,d2 + scvtf d1,d2,5 + scvtf d2,w1 + scvtf d2,w1,5 + scvtf d2,x1 + scvtf d2,x1,5 + scvtf s1,s2 + scvtf s1,s2,5 + scvtf s2,w1 + scvtf s2,w1,5 + scvtf s2,x1 + scvtf s2,x1,5 + scvtf v1.2d,v2.2d + scvtf v1.2d,v2.2d,5 + scvtf v1.2s,v2.2s + scvtf v1.2s,v2.2s,5 + scvtf v1.4s,v2.4s + scvtf v1.4s,v2.4s,5 + + ucvtf d1,d2 + ucvtf d1,d2,5 + ucvtf d2,w1 + ucvtf d2,w1,5 + ucvtf d2,x1 + ucvtf d2,x1,5 + ucvtf s1,s2 + ucvtf s1,s2,5 + ucvtf s2,w1 + ucvtf s2,w1,5 + ucvtf s2,x1 + ucvtf s2,x1,5 + ucvtf v1.2d,v2.2d + ucvtf v1.2d,v2.2d,5 + ucvtf v1.2s,v2.2s + ucvtf v1.2s,v2.2s,5 + ucvtf v1.4s,v2.4s + ucvtf v1.4s,v2.4s,5 + + urecpe v1.2s,v2.2s + urecpe v1.4s,v2.4s + + ursqrte v1.2s,v2.2s + ursqrte v1.4s,v2.4s + +processor CPU64_SIMD + + abs d1,d2 + abs v1.16b,v2.16b + abs v1.2d,v2.2d + abs v1.2s,v2.2s + abs v1.4h,v2.4h + abs v1.4s,v2.4s + abs v1.8b,v2.8b + abs v1.8h,v2.8h + + add d1,d2,d3 + add v1.16b,v2.16b,v3.16b + add v1.2d,v2.2d,v3.2d + add v1.2s,v2.2s,v3.2s + add v1.4h,v2.4h,v3.4h + add v1.4s,v2.4s,v3.4s + add v1.8b,v2.8b,v3.8b + add v1.8h,v2.8h,v3.8h + + addhn v1.2s,v2.2d,v3.2d + addhn v1.4h,v2.4s,v3.4s + addhn v1.8b,v2.8h,v3.8h + + addhn2 v1.16b,v2.8h,v3.8h + addhn2 v1.4s,v2.2d,v3.2d + addhn2 v1.8h,v2.4s,v3.4s + + addp d1,v2.2d + addp v1.16b,v2.16b,v3.16b + addp v1.2d,v2.2d,v3.2d + addp v1.2s,v2.2s,v3.2s + addp v1.4h,v2.4h,v3.4h + addp v1.4s,v2.4s,v3.4s + addp v1.8b,v2.8b,v3.8b + addp v1.8h,v2.8h,v3.8h + + addv b1,v2.16b + addv b1,v2.8b + addv h1,v2.4h + addv h1,v2.8h + addv s1,v2.4s + + and v1.16b,v2.16b,v3.16b + and v1.8b,v2.8b,v3.8b + + bic v1.16b,v2.16b,v3.16b + bic v1.2s,0xFF + bic v1.2s,0xFF,lsl 0 + bic v1.2s,0xFF,lsl 8 + bic v1.2s,0xFF,lsl 16 + bic v1.2s,0xFF,lsl 24 + bic v1.4h,0xFE + bic v1.4h,0xFE,lsl 0 + bic v1.4h,0xFF,lsl 8 + bic v1.4s,0xFF + bic v1.4s,0xFF,lsl 0 + bic v1.4s,0xFF,lsl 8 + bic v1.4s,0xFF,lsl 16 + bic v1.4s,0xFF,lsl 24 + bic v1.8b,v2.8b,v3.8b + bic v1.8h,0xFF + bic v1.8h,0xFF,lsl 0 + bic v1.8h,0xFF,lsl 8 + + bif v1.16b,v2.16b,v3.16b + bif v1.8b,v2.8b,v3.8b + + bit v1.16b,v2.16b,v3.16b + bit v1.8b,v2.8b,v3.8b + + bsl v1.16b,v2.16b,v3.16b + bsl v1.8b,v2.8b,v3.8b + + cls v1.16b,v2.16b + cls v1.2s,v2.2s + cls v1.4h,v2.4h + cls v1.4s,v2.4s + cls v1.8b,v2.8b + cls v1.8h,v2.8h + + clz v1.16b,v2.16b + clz v1.2s,v2.2s + clz v1.4h,v2.4h + clz v1.4s,v2.4s + clz v1.8b,v2.8b + clz v1.8h,v2.8h + + cmeq d1,d2,0 + cmeq d1,d2,d3 + cmeq v1.16b,v2.16b,0 + cmeq v1.16b,v2.16b,v3.16b + cmeq v1.2d,v2.2d,0 + cmeq v1.2d,v2.2d,v3.2d + cmeq v1.2s,v2.2s,0 + cmeq v1.2s,v2.2s,v3.2s + cmeq v1.4h,v2.4h,0 + cmeq v1.4h,v2.4h,v3.4h + cmeq v1.4s,v2.4s,0 + cmeq v1.4s,v2.4s,v3.4s + cmeq v1.8b,v2.8b,0 + cmeq v1.8b,v2.8b,v3.8b + cmeq v1.8h,v2.8h,0 + cmeq v1.8h,v2.8h,v3.8h + + cmge d1,d2,0 + cmge d1,d2,d3 + cmge v1.16b,v2.16b,0 + cmge v1.16b,v2.16b,v3.16b + cmge v1.2d,v2.2d,0 + cmge v1.2d,v2.2d,v3.2d + cmge v1.2s,v2.2s,0 + cmge v1.2s,v2.2s,v3.2s + cmge v1.4h,v2.4h,0 + cmge v1.4h,v2.4h,v3.4h + cmge v1.4s,v2.4s,0 + cmge v1.4s,v2.4s,v3.4s + cmge v1.8b,v2.8b,0 + cmge v1.8b,v2.8b,v3.8b + cmge v1.8h,v2.8h,0 + cmge v1.8h,v2.8h,v3.8h + + cmgt d1,d2,0 + cmgt d1,d2,d3 + cmgt v1.16b,v2.16b,0 + cmgt v1.16b,v2.16b,v3.16b + cmgt v1.2d,v2.2d,0 + cmgt v1.2d,v2.2d,v3.2d + cmgt v1.2s,v2.2s,0 + cmgt v1.2s,v2.2s,v3.2s + cmgt v1.4h,v2.4h,0 + cmgt v1.4h,v2.4h,v3.4h + cmgt v1.4s,v2.4s,0 + cmgt v1.4s,v2.4s,v3.4s + cmgt v1.8b,v2.8b,0 + cmgt v1.8b,v2.8b,v3.8b + cmgt v1.8h,v2.8h,0 + cmgt v1.8h,v2.8h,v3.8h + + cmhi d1,d2,d3 + cmhi v1.16b,v2.16b,v3.16b + cmhi v1.2d,v2.2d,v3.2d + cmhi v1.2s,v2.2s,v3.2s + cmhi v1.4h,v2.4h,v3.4h + cmhi v1.4s,v2.4s,v3.4s + cmhi v1.8b,v2.8b,v3.8b + cmhi v1.8h,v2.8h,v3.8h + + cmhs d1,d2,d3 + cmhs v1.16b,v2.16b,v3.16b + cmhs v1.2d,v2.2d,v3.2d + cmhs v1.2s,v2.2s,v3.2s + cmhs v1.4h,v2.4h,v3.4h + cmhs v1.4s,v2.4s,v3.4s + cmhs v1.8b,v2.8b,v3.8b + cmhs v1.8h,v2.8h,v3.8h + + cmle d1,d2,0 + cmle v1.16b,v2.16b,0 + cmle v1.2d,v2.2d,0 + cmle v1.2s,v2.2s,0 + cmle v1.4h,v2.4h,0 + cmle v1.4s,v2.4s,0 + cmle v1.8b,v2.8b,0 + cmle v1.8h,v2.8h,0 + + cmlt d1,d2,0 + cmlt v1.16b,v2.16b,0 + cmlt v1.2d,v2.2d,0 + cmlt v1.2s,v2.2s,0 + cmlt v1.4h,v2.4h,0 + cmlt v1.4s,v2.4s,0 + cmlt v1.8b,v2.8b,0 + cmlt v1.8h,v2.8h,0 + + cmtst d1,d2,d3 + cmtst v1.16b,v2.16b,v3.16b + cmtst v1.2d,v2.2d,v3.2d + cmtst v1.2s,v2.2s,v3.2s + cmtst v1.4h,v2.4h,v3.4h + cmtst v1.4s,v2.4s,v3.4s + cmtst v1.8b,v2.8b,v3.8b + cmtst v1.8h,v2.8h,v3.8h + + cnt v1.16b,v2.16b + cnt v1.8b,v2.8b + + dup v1.16b,v2.b[15] + dup v1.16b,w2 + dup v1.2d,v2.d[1] + dup v1.2d,x2 + dup v1.2s,v2.s[1] + dup v1.2s,w2 + dup v1.4h,v2.h[1] + dup v1.4h,w2 + dup v1.4s,v2.s[3] + dup v1.4s,w2 + dup v1.8b,v2.b[1] + dup v1.8b,w2 + dup v1.8h,v2.h[7] + dup v1.8h,w2 + + eor v1.16b,v2.16b,v3.16b + eor v1.8b,v2.8b,v3.8b + + ext v1.16b,v2.16b,v3.16b,15 + ext v1.8b,v2.8b,v3.8b,7 + + ins v2.b[15],w1 + ins v2.h[7],w1 + ins v2.s[3],w1 + ins v2.d[1],x1 + + ins v1.b[15],v2.b[1] + ins v1.b[1],v2.b[15] + ins v1.h[7],v2.h[1] + ins v1.h[1],v2.h[7] + ins v1.s[3],v2.s[1] + ins v1.s[1],v2.s[3] + ins v1.d[1],v2.d[0] + ins v1.d[0],v2.d[1] + + ld1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp] + ld1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp],64 + ld1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp],x6 + ld1 {v1.16b,v2.16b,v3.16b},[x4] + ld1 {v1.16b,v2.16b,v3.16b},[x4],48 + ld1 {v1.16b,v2.16b,v3.16b},[x4],x5 + ld1 {v1.16b,v2.16b},[x3] + ld1 {v1.16b,v2.16b},[x3],32 + ld1 {v1.16b,v2.16b},[x3],x4 + ld1 {v1.16b},[x2] + ld1 {v1.16b},[x2],16 + ld1 {v1.16b},[x2],x3 + ld1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp] + ld1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp],32 + ld1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp],x6 + ld1 {v1.1d,v2.1d,v3.1d},[x4] + ld1 {v1.1d,v2.1d,v3.1d},[x4],24 + ld1 {v1.1d,v2.1d,v3.1d},[x4],x5 + ld1 {v1.1d,v2.1d},[x3] + ld1 {v1.1d,v2.1d},[x3],16 + ld1 {v1.1d,v2.1d},[x3],x4 + ld1 {v1.1d},[x2] + ld1 {v1.1d},[x2],8 + ld1 {v1.1d},[x2],x3 + ld1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp] + ld1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp],64 + ld1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp],x6 + ld1 {v1.2d,v2.2d,v3.2d},[x4] + ld1 {v1.2d,v2.2d,v3.2d},[x4],48 + ld1 {v1.2d,v2.2d,v3.2d},[x4],x5 + ld1 {v1.2d,v2.2d},[x3] + ld1 {v1.2d,v2.2d},[x3],32 + ld1 {v1.2d,v2.2d},[x3],x4 + ld1 {v1.2d},[x2] + ld1 {v1.2d},[x2],16 + ld1 {v1.2d},[x2],x3 + ld1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp] + ld1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp],32 + ld1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp],x6 + ld1 {v1.2s,v2.2s,v3.2s},[x4] + ld1 {v1.2s,v2.2s,v3.2s},[x4],24 + ld1 {v1.2s,v2.2s,v3.2s},[x4],x5 + ld1 {v1.2s,v2.2s},[x3] + ld1 {v1.2s,v2.2s},[x3],16 + ld1 {v1.2s,v2.2s},[x3],x4 + ld1 {v1.2s},[x2] + ld1 {v1.2s},[x2],8 + ld1 {v1.2s},[x2],x3 + ld1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp] + ld1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp],32 + ld1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp],x6 + ld1 {v1.4h,v2.4h,v3.4h},[x4] + ld1 {v1.4h,v2.4h,v3.4h},[x4],24 + ld1 {v1.4h,v2.4h,v3.4h},[x4],x5 + ld1 {v1.4h,v2.4h},[x3] + ld1 {v1.4h,v2.4h},[x3],16 + ld1 {v1.4h,v2.4h},[x3],x4 + ld1 {v1.4h},[x2] + ld1 {v1.4h},[x2],8 + ld1 {v1.4h},[x2],x3 + ld1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp] + ld1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp],64 + ld1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp],x6 + ld1 {v1.4s,v2.4s,v3.4s},[x4] + ld1 {v1.4s,v2.4s,v3.4s},[x4],48 + ld1 {v1.4s,v2.4s,v3.4s},[x4],x5 + ld1 {v1.4s,v2.4s},[x3] + ld1 {v1.4s,v2.4s},[x3],32 + ld1 {v1.4s,v2.4s},[x3],x4 + ld1 {v1.4s},[x2] + ld1 {v1.4s},[x2],16 + ld1 {v1.4s},[x2],x3 + ld1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp] + ld1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp],32 + ld1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp],x6 + ld1 {v1.8b,v2.8b,v3.8b},[x4] + ld1 {v1.8b,v2.8b,v3.8b},[x4],24 + ld1 {v1.8b,v2.8b,v3.8b},[x4],x5 + ld1 {v1.8b,v2.8b},[x3] + ld1 {v1.8b,v2.8b},[x3],16 + ld1 {v1.8b,v2.8b},[x3],x4 + ld1 {v1.8b},[x2] + ld1 {v1.8b},[x2],8 + ld1 {v1.8b},[x2],x3 + ld1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp] + ld1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp],64 + ld1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp],x6 + ld1 {v1.8h,v2.8h,v3.8h},[x4] + ld1 {v1.8h,v2.8h,v3.8h},[x4],48 + ld1 {v1.8h,v2.8h,v3.8h},[x4],x5 + ld1 {v1.8h,v2.8h},[x3] + ld1 {v1.8h,v2.8h},[x3],32 + ld1 {v1.8h,v2.8h},[x3],x4 + ld1 {v1.8h},[x2] + ld1 {v1.8h},[x2],16 + ld1 {v1.8h},[x2],x3 + ld1 {v1.b}[2],[x3] + ld1 {v1.b}[2],[x3],1 + ld1 {v1.b}[2],[x3],x4 + ld1 {v1.d}[1],[x3] + ld1 {v1.d}[1],[x3],8 + ld1 {v1.d}[1],[x3],x4 + ld1 {v1.h}[2],[x3] + ld1 {v1.h}[2],[x3],2 + ld1 {v1.h}[2],[x3],x4 + ld1 {v1.s}[2],[x3] + ld1 {v1.s}[2],[x3],4 + ld1 {v1.s}[2],[x3],x4 + + ld1r {v1.16b},[x2] + ld1r {v1.16b},[x2],1 + ld1r {v1.16b},[x2],x3 + ld1r {v1.1d},[x2] + ld1r {v1.1d},[x2],8 + ld1r {v1.1d},[x2],x3 + ld1r {v1.2d},[x2] + ld1r {v1.2d},[x2],8 + ld1r {v1.2d},[x2],x3 + ld1r {v1.2s},[x2] + ld1r {v1.2s},[x2],4 + ld1r {v1.2s},[x2],x3 + ld1r {v1.4h},[x2] + ld1r {v1.4h},[x2],2 + ld1r {v1.4h},[x2],x3 + ld1r {v1.4s},[x2] + ld1r {v1.4s},[x2],4 + ld1r {v1.4s},[x2],x3 + ld1r {v1.8b},[x2] + ld1r {v1.8b},[x2],1 + ld1r {v1.8b},[x2],x3 + ld1r {v1.8h},[x2] + ld1r {v1.8h},[x2],2 + ld1r {v1.8h},[x2],x3 + + ld2 {v1.16b,v2.16b},[x3] + ld2 {v1.16b,v2.16b},[x3],32 + ld2 {v1.16b,v2.16b},[x3],x4 + ld2 {v1.2d,v2.2d},[x3] + ld2 {v1.2d,v2.2d},[x3],32 + ld2 {v1.2d,v2.2d},[x3],x4 + ld2 {v1.2s,v2.2s},[x3] + ld2 {v1.2s,v2.2s},[x3],16 + ld2 {v1.2s,v2.2s},[x3],x4 + ld2 {v1.4h,v2.4h},[x3] + ld2 {v1.4h,v2.4h},[x3],16 + ld2 {v1.4h,v2.4h},[x3],x4 + ld2 {v1.4s,v2.4s},[x3] + ld2 {v1.4s,v2.4s},[x3],32 + ld2 {v1.4s,v2.4s},[x3],x4 + ld2 {v1.8b,v2.8b},[x3] + ld2 {v1.8b,v2.8b},[x3],16 + ld2 {v1.8b,v2.8b},[x3],x4 + ld2 {v1.8h,v2.8h},[x3] + ld2 {v1.8h,v2.8h},[x3],32 + ld2 {v1.8h,v2.8h},[x3],x4 + ld2 {v1.b,v2.b}[15],[x3] + ld2 {v1.b,v2.b}[2],[x3],2 + ld2 {v1.b,v2.b}[2],[x3],x4 + ld2 {v1.d,v2.d}[1],[x3] + ld2 {v1.d,v2.d}[1],[x3],16 + ld2 {v1.d,v2.d}[1],[x3],x4 + ld2 {v1.h,v2.h}[2],[x3] + ld2 {v1.h,v2.h}[2],[x3],4 + ld2 {v1.h,v2.h}[2],[x3],x4 + ld2 {v1.s,v2.s}[2],[x3] + ld2 {v1.s,v2.s}[2],[x3],8 + ld2 {v1.s,v2.s}[2],[x3],x4 + + ld2r {v1.16b,v2.16b},[x2] + ld2r {v1.16b,v2.16b},[x2],2 + ld2r {v1.16b,v2.16b},[x2],x3 + ld2r {v1.1d,v2.1d},[x2] + ld2r {v1.1d,v2.1d},[x2],16 + ld2r {v1.1d,v2.1d},[x2],x3 + ld2r {v1.2d,v2.2d},[x2] + ld2r {v1.2d,v2.2d},[x2],16 + ld2r {v1.2d,v2.2d},[x2],x3 + ld2r {v1.2s,v2.2s},[x2] + ld2r {v1.2s,v2.2s},[x2],8 + ld2r {v1.2s,v2.2s},[x2],x3 + ld2r {v1.4h,v2.4h},[x2] + ld2r {v1.4h,v2.4h},[x2],4 + ld2r {v1.4h,v2.4h},[x2],x3 + ld2r {v1.4s,v2.4s},[x2] + ld2r {v1.4s,v2.4s},[x2],8 + ld2r {v1.4s,v2.4s},[x2],x3 + ld2r {v1.8b,v2.8b},[x2] + ld2r {v1.8b,v2.8b},[x2],2 + ld2r {v1.8b,v2.8b},[x2],x3 + ld2r {v1.8h,v2.8h},[x2] + ld2r {v1.8h,v2.8h},[x2],4 + ld2r {v1.8h,v2.8h},[x2],x3 + + ld3 {v1.16b,v2.16b,v3.16b},[x3] + ld3 {v1.16b,v2.16b,v3.16b},[x3],48 + ld3 {v1.16b,v2.16b,v3.16b},[x3],x4 + ld3 {v1.2d,v2.2d,v3.2d},[x3] + ld3 {v1.2d,v2.2d,v3.2d},[x3],48 + ld3 {v1.2d,v2.2d,v3.2d},[x3],x4 + ld3 {v1.2s,v2.2s,v3.2s},[x3] + ld3 {v1.2s,v2.2s,v3.2s},[x3],24 + ld3 {v1.2s,v2.2s,v3.2s},[x3],x4 + ld3 {v1.4h,v2.4h,v3.4h},[x3] + ld3 {v1.4h,v2.4h,v3.4h},[x3],24 + ld3 {v1.4h,v2.4h,v3.4h},[x3],x4 + ld3 {v1.4s,v2.4s,v3.4s},[x3] + ld3 {v1.4s,v2.4s,v3.4s},[x3],48 + ld3 {v1.4s,v2.4s,v3.4s},[x3],x4 + ld3 {v1.8b,v2.8b,v3.8b},[x3] + ld3 {v1.8b,v2.8b,v3.8b},[x3],24 + ld3 {v1.8b,v2.8b,v3.8b},[x3],x4 + ld3 {v1.8h,v2.8h,v3.8h},[x3] + ld3 {v1.8h,v2.8h,v3.8h},[x3],48 + ld3 {v1.8h,v2.8h,v3.8h},[x3],x4 + ld3 {v1.b,v2.b,v3.b}[15],[x3] + ld3 {v1.b,v2.b,v3.b}[2],[x3],3 + ld3 {v1.b,v2.b,v3.b}[2],[x3],x4 + ld3 {v1.d,v2.d,v3.d}[1],[x3] + ld3 {v1.d,v2.d,v3.d}[1],[x3],24 + ld3 {v1.d,v2.d,v3.d}[1],[x3],x4 + ld3 {v1.h,v2.h,v3.h}[2],[x3] + ld3 {v1.h,v2.h,v3.h}[2],[x3],6 + ld3 {v1.h,v2.h,v3.h}[2],[x3],x4 + ld3 {v1.s,v2.s,v3.s}[2],[x3] + ld3 {v1.s,v2.s,v3.s}[2],[x3],12 + ld3 {v1.s,v2.s,v3.s}[2],[x3],x4 + + ld3r {v1.16b,v2.16b,v3.16b},[x2] + ld3r {v1.16b,v2.16b,v3.16b},[x2],3 + ld3r {v1.16b,v2.16b,v3.16b},[x2],x3 + ld3r {v1.1d,v2.1d,v3.1d},[x2] + ld3r {v1.1d,v2.1d,v3.1d},[x2],24 + ld3r {v1.1d,v2.1d,v3.1d},[x2],x3 + ld3r {v1.2d,v2.2d,v3.2d},[x2] + ld3r {v1.2d,v2.2d,v3.2d},[x2],24 + ld3r {v1.2d,v2.2d,v3.2d},[x2],x3 + ld3r {v1.2s,v2.2s,v3.2s},[x2] + ld3r {v1.2s,v2.2s,v3.2s},[x2],12 + ld3r {v1.2s,v2.2s,v3.2s},[x2],x3 + ld3r {v1.4h,v2.4h,v3.4h},[x2] + ld3r {v1.4h,v2.4h,v3.4h},[x2],6 + ld3r {v1.4h,v2.4h,v3.4h},[x2],x3 + ld3r {v1.4s,v2.4s,v3.4s},[x2] + ld3r {v1.4s,v2.4s,v3.4s},[x2],12 + ld3r {v1.4s,v2.4s,v3.4s},[x2],x3 + ld3r {v1.8b,v2.8b,v3.8b},[x2] + ld3r {v1.8b,v2.8b,v3.8b},[x2],3 + ld3r {v1.8b,v2.8b,v3.8b},[x2],x3 + ld3r {v1.8h,v2.8h,v3.8h},[x2] + ld3r {v1.8h,v2.8h,v3.8h},[x2],6 + ld3r {v1.8h,v2.8h,v3.8h},[x2],x3 + + ld4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3] + ld4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3],64 + ld4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3],x4 + ld4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3] + ld4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3],64 + ld4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3],x4 + ld4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3] + ld4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3],32 + ld4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3],x4 + ld4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3] + ld4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3],32 + ld4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3],x4 + ld4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3] + ld4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3],64 + ld4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3],x4 + ld4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3] + ld4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3],32 + ld4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3],x4 + ld4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3] + ld4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3],64 + ld4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3],x4 + ld4 {v1.b,v2.b,v3.b,v4.b}[15],[x3] + ld4 {v1.b,v2.b,v3.b,v4.b}[2],[x3],4 + ld4 {v1.b,v2.b,v3.b,v4.b}[2],[x3],x4 + ld4 {v1.d,v2.d,v3.d,v4.d}[1],[x3] + ld4 {v1.d,v2.d,v3.d,v4.d}[1],[x3],32 + ld4 {v1.d,v2.d,v3.d,v4.d}[1],[x3],x4 + ld4 {v1.h,v2.h,v3.h,v4.h}[2],[x3] + ld4 {v1.h,v2.h,v3.h,v4.h}[2],[x3],8 + ld4 {v1.h,v2.h,v3.h,v4.h}[2],[x3],x4 + ld4 {v1.s,v2.s,v3.s,v4.s}[2],[x3] + ld4 {v1.s,v2.s,v3.s,v4.s}[2],[x3],16 + ld4 {v1.s,v2.s,v3.s,v4.s}[2],[x3],x4 + + ld4r {v1.16b,v2.16b,v3.16b,v4.16b},[x2] + ld4r {v1.16b,v2.16b,v3.16b,v4.16b},[x2],4 + ld4r {v1.16b,v2.16b,v3.16b,v4.16b},[x2],x3 + ld4r {v1.1d,v2.1d,v3.1d,v4.1d},[x2] + ld4r {v1.1d,v2.1d,v3.1d,v4.1d},[x2],32 + ld4r {v1.1d,v2.1d,v3.1d,v4.1d},[x2],x3 + ld4r {v1.2d,v2.2d,v3.2d,v4.2d},[x2] + ld4r {v1.2d,v2.2d,v3.2d,v4.2d},[x2],32 + ld4r {v1.2d,v2.2d,v3.2d,v4.2d},[x2],x3 + ld4r {v1.2s,v2.2s,v3.2s,v4.2s},[x2] + ld4r {v1.2s,v2.2s,v3.2s,v4.2s},[x2],16 + ld4r {v1.2s,v2.2s,v3.2s,v4.2s},[x2],x3 + ld4r {v1.4h,v2.4h,v3.4h,v4.4h},[x2] + ld4r {v1.4h,v2.4h,v3.4h,v4.4h},[x2],8 + ld4r {v1.4h,v2.4h,v3.4h,v4.4h},[x2],x3 + ld4r {v1.4s,v2.4s,v3.4s,v4.4s},[x2] + ld4r {v1.4s,v2.4s,v3.4s,v4.4s},[x2],16 + ld4r {v1.4s,v2.4s,v3.4s,v4.4s},[x2],x3 + ld4r {v1.8b,v2.8b,v3.8b,v4.8b},[x2] + ld4r {v1.8b,v2.8b,v3.8b,v4.8b},[x2],4 + ld4r {v1.8b,v2.8b,v3.8b,v4.8b},[x2],x3 + ld4r {v1.8h,v2.8h,v3.8h,v4.8h},[x2] + ld4r {v1.8h,v2.8h,v3.8h,v4.8h},[x2],8 + ld4r {v1.8h,v2.8h,v3.8h,v4.8h},[x2],x3 + + ldnp d0,d1,[x2] + ldnp d0,d1,[x2,+0x8] + ldnp d0,d1,[expression.qword] + ldnp q0,q1,[x2] + ldnp q0,q1,[x2,+0x20] + ldnp q0,q1,[expression.dqword] + ldnp s0,s1,[x2] + ldnp s0,s1,[x2,+0x8] + ldnp s0,s1,[expression.dword] + + ldp d0,d1,[x2] + ldp d0,d1,[x2,+0x8] + ldp d0,d1,[expression.qword] + ldp d0,d1,[x2,+0x8]! + ldp d0,d1,[expression.qword]! + ldp d0,d1,[x2],+0x8 + ldp q0,q1,[x2] + ldp q0,q1,[x2,+0x10] + ldp q0,q1,[expression.dqword] + ldp q0,q1,[x2,+0x10]! + ldp q0,q1,[expression.dqword]! + ldp q0,q1,[x2],+0x10 + ldp s0,s1,[x2] + ldp s0,s1,[x2,+0x8] + ldp s0,s1,[expression.dword] + ldp s0,s1,[x2,+0x8]! + ldp s0,s1,[expression.dword]! + ldp s0,s1,[x2],+0x8 + + ldr b0,[x2] + ldr b0,[x2,+0x8] + ldr b0,[expression.byte] + ldr b0,[x2,+0x8]! + ldr b0,[expression.byte]! + ldr b0,[x2],+0x8 + ldr b0,[x2,w3,sxtw] + ldr b0,[x2,w3,sxtw 0] + ldr b0,[x2,w3,uxtw] + ldr b0,[x2,w3,uxtw 0] + ldr b0,[x2,x3] + ldr b0,[x2,x3,lsl 0] + ldr b0,[x2,x3,sxtx] + ldr b0,[x2,x3,sxtx 0] + ldr h0,[x2] + ldr h0,[x2,+0x8] + ldr h0,[expression.hword] + ldr h0,[x2,+0x8]! + ldr h0,[expression.hword]! + ldr h0,[x2],+0x8 + ldr h0,[x2,w3,sxtw] + ldr h0,[x2,w3,sxtw 1] + ldr h0,[x2,w3,uxtw] + ldr h0,[x2,w3,uxtw 1] + ldr h0,[x2,x3] + ldr h0,[x2,x3,lsl 1] + ldr h0,[x2,x3,sxtx] + ldr h0,[x2,x3,sxtx 1] + ldr s0,[x2,+0x8] + ldr s0,[expression.word] + ldr s0,[x2,+0x8]! + ldr s0,[expression.word]! + ldr s0,[x2],+0x8 + ldr s0,[x2,w3,sxtw] + ldr s0,[x2,w3,sxtw 2] + ldr s0,[x2,w3,uxtw] + ldr s0,[x2,w3,uxtw 2] + ldr s0,[x2,x3] + ldr s0,[x2,x3,lsl 2] + ldr s0,[x2,x3,sxtx] + ldr s0,[x2,x3,sxtx 2] + ldr s0,label_ldr + ldr s0,[label_ldr] + ldr d0,[x2,+0x8] + ldr d0,[expression.dword] + ldr d0,[x2,+0x8]! + ldr d0,[expression.dword]! + ldr d0,[x2],+0x8 + ldr d0,[x2,w3,sxtw] + ldr d0,[x2,w3,sxtw 3] + ldr d0,[x2,w3,uxtw] + ldr d0,[x2,w3,uxtw 3] + ldr d0,[x2,x3] + ldr d0,[x2,x3,lsl 3] + ldr d0,[x2,x3,sxtx] + ldr d0,[x2,x3,sxtx 3] + ldr d0,label_ldr + ldr d0,[label_ldr] + ldr q0,[x2,+0x8] + ldr q0,[expression.qword] + ldr q0,[x2,+0x8]! + ldr q0,[expression.qword]! + ldr q0,[x2],+0x8 + ldr q0,[x2,w3,sxtw] + ldr q0,[x2,w3,sxtw 4] + ldr q0,[x2,w3,uxtw] + ldr q0,[x2,w3,uxtw 4] + ldr q0,[x2,x3] + ldr q0,[x2,x3,lsl 4] + ldr q0,[x2,x3,sxtx] + ldr q0,[x2,x3,sxtx 4] + ldr q0,label_ldr + ldr q0,[label_ldr] + + ldur b0,[x2] + ldur b0,[x2,+0x8] + ldur b0,[expression.byte] + ldur h0,[x2] + ldur h0,[x2,+0x8] + ldur h0,[expression.hword] + ldur s0,[x2] + ldur s0,[x2,+0x8] + ldur s0,[expression.word] + ldur d0,[x2] + ldur d0,[x2,+0x8] + ldur d0,[expression.dword] + ldur q0,[x2] + ldur q0,[x2,+0x8] + ldur q0,[expression.qword] + + mla v1.16b,v2.16b,v3.16b + mla v1.2s,v2.2s,v3.2s + mla v1.2s,v2.2s,v3.s[0] + mla v1.4h,v2.4h,v3.4h + mla v1.4h,v2.4h,v3.h[0] + mla v1.4s,v2.4s,v3.4s + mla v1.4s,v2.4s,v3.s[3] + mla v1.8b,v2.8b,v3.8b + mla v1.8h,v2.8h,v3.8h + mla v1.8h,v2.8h,v3.h[7] + + mls v1.16b,v2.16b,v3.16b + mls v1.2s,v2.2s,v3.2s + mls v1.2s,v2.2s,v3.s[0] + mls v1.4h,v2.4h,v3.4h + mls v1.4h,v2.4h,v3.h[0] + mls v1.4s,v2.4s,v3.4s + mls v1.4s,v2.4s,v3.s[3] + mls v1.8b,v2.8b,v3.8b + mls v1.8h,v2.8h,v3.8h + mls v1.8h,v2.8h,v3.h[7] + + mov b1,v2.b[0] + mov h1,v2.h[7] + mov s1,v2.s[3] + mov d1,v2.d[1] + + mov v1.16b,v2.16b + mov v1.8b,v2.8b + mov v1.b[1],v2.b[15] + mov v1.d[0],v2.d[1] + mov v1.h[1],v2.h[7] + mov v1.s[1],v2.s[3] + mov v2.b[15],w1 + mov v2.d[1],x1 + mov v2.h[7],w1 + mov v2.s[3],w1 + mov w1,v2.s[0] + mov x1,v2.d[0] + + movi d1,0xFFFFFFFF00FF00FF + movi v1.16b,0xAA + movi v1.2d,0x00FF00FF00FF00FF + movi v1.2s,0xAA,lsl 0 + movi v1.2s,0xAA,lsl 8 + movi v1.2s,0xAA,lsl 16 + movi v1.2s,0xAA,lsl 24 + movi v1.2s,0xAA,msl 8 + movi v1.2s,0xAA,msl 16 + movi v1.4h,0xAA,lsl 0 + movi v1.4h,0xAA,lsl 8 + movi v1.4s,0xAA,lsl 0 + movi v1.4s,0xAA,lsl 8 + movi v1.4s,0xAA,lsl 16 + movi v1.4s,0xAA,lsl 24 + movi v1.4s,0xAA,msl 8 + movi v1.4s,0xAA,msl 16 + movi v1.8b,0xAA + movi v1.8h,0xAA,lsl 0 + movi v1.8h,0xAA,lsl 8 + + mul v1.16b,v2.16b,v3.16b + mul v1.2s,v2.2s,v3.2s + mul v1.2s,v2.2s,v3.s[0] + mul v1.4h,v2.4h,v3.4h + mul v1.4h,v2.4h,v3.h[0] + mul v1.4s,v2.4s,v3.4s + mul v1.4s,v2.4s,v3.s[3] + mul v1.8b,v2.8b,v3.8b + mul v1.8h,v2.8h,v3.8h + mul v1.8h,v2.8h,v3.h[7] + + mvn v1.16b,v2.16b + mvn v1.8b,v2.8b + + mvni v1.2s,0xAA + mvni v1.2s,0xAA,lsl 0 + mvni v1.2s,0xAA,lsl 8 + mvni v1.2s,0xAA,lsl 16 + mvni v1.2s,0xAA,lsl 24 + mvni v1.2s,0xAA,msl 8 + mvni v1.2s,0xAA,msl 16 + mvni v1.4h,0xAA + mvni v1.4h,0xAA,lsl 0 + mvni v1.4h,0xAA,lsl 8 + mvni v1.4s,0xAA + mvni v1.4s,0xAA,lsl 0 + mvni v1.4s,0xAA,lsl 8 + mvni v1.4s,0xAA,lsl 16 + mvni v1.4s,0xAA,lsl 24 + mvni v1.4s,0xAA,msl 8 + mvni v1.4s,0xAA,msl 16 + mvni v1.8h,0xAA + mvni v1.8h,0xAA,lsl 0 + mvni v1.8h,0xAA,lsl 8 + + neg d1,d2 + neg v1.16b,v2.16b + neg v1.2d,v2.2d + neg v1.2s,v2.2s + neg v1.4h,v2.4h + neg v1.4s,v2.4s + neg v1.8b,v2.8b + neg v1.8h,v2.8h + + not v1.8b,v2.8b + not v1.16b,v2.16b + + orn v1.16b,v2.16b,v3.16b + orn v1.8b,v2.8b,v3.8b + + orr v1.16b,v2.16b,v3.16b + orr v1.8b,v2.8b,v3.8b + orr v1.4h,0xFE + orr v1.4h,0xFE,lsl 0 + orr v3.8h,0xFB + orr v3.8h,0xFB,lsl 0 + orr v4.8h,0xF7,lsl 8 + orr v5.2s,0xEF + orr v5.2s,0xEF,lsl 0 + orr v6.2s,0xDF,lsl 16 + orr v7.4s,0xBF + orr v7.4s,0xBF,lsl 0 + orr v8.4s,0x80,lsl 24 + + pmul v1.16b,v2.16b,v3.16b + pmul v1.8b,v2.8b,v3.8b + + pmull v1.8h,v2.8b,v3.8b + + pmull2 v1.8h,v2.16b,v3.16b + + raddhn v1.2s,v2.2d,v3.2d + raddhn v1.4h,v2.4s,v3.4s + raddhn v1.8b,v2.8h,v3.8h + + raddhn2 v1.16b,v2.8h,v3.8h + raddhn2 v1.4s,v2.2d,v3.2d + raddhn2 v1.8h,v2.4s,v3.4s + + rbit v1.16b,v2.16b + rbit v1.8b,v2.8b + + rev16 v1.16b,v2.16b + rev16 v1.8b,v2.8b + + rev32 v1.16b,v2.16b + rev32 v1.4h,v2.4h + rev32 v1.8b,v2.8b + rev32 v1.8h,v2.8h + + rev64 v1.16b,v2.16b + rev64 v1.2s,v2.2s + rev64 v1.4h,v2.4h + rev64 v1.4s,v2.4s + rev64 v1.8b,v2.8b + rev64 v1.8h,v2.8h + + rshrn v1.2s,v2.2d,32 + rshrn v1.4h,v2.4s,16 + rshrn v1.8b,v2.8h,8 + + rshrn2 v1.16b,v2.8h,8 + rshrn2 v1.4s,v2.2d,32 + rshrn2 v1.8h,v2.4s,16 + + rsubhn v1.2s,v2.2d,v3.2d + rsubhn v1.4h,v2.4s,v3.4s + rsubhn v1.8b,v2.8h,v3.8h + + rsubhn2 v1.16b,v2.8h,v3.8h + rsubhn2 v1.4s,v2.2d,v3.2d + rsubhn2 v1.8h,v2.4s,v3.4s + + saba v1.16b,v2.16b,v3.16b + saba v1.2s,v2.2s,v3.2s + saba v1.4h,v2.4h,v3.4h + saba v1.4s,v2.4s,v3.4s + saba v1.8b,v2.8b,v3.8b + saba v1.8h,v2.8h,v3.8h + + sabal v1.2d,v2.2s,v3.2s + sabal v1.4s,v2.4h,v3.4h + sabal v1.8h,v2.8b,v3.8b + + sabal2 v1.2d,v2.4s,v3.4s + sabal2 v1.4s,v2.8h,v3.8h + sabal2 v1.8h,v2.16b,v3.16b + + sabd v1.16b,v2.16b,v3.16b + sabd v1.2s,v2.2s,v3.2s + sabd v1.4h,v2.4h,v3.4h + sabd v1.4s,v2.4s,v3.4s + sabd v1.8b,v2.8b,v3.8b + sabd v1.8h,v2.8h,v3.8h + + sabdl v1.2d,v2.2s,v3.2s + sabdl v1.4s,v2.4h,v3.4h + sabdl v1.8h,v2.8b,v3.8b + + sabdl2 v1.2d,v2.4s,v3.4s + sabdl2 v1.4s,v2.8h,v3.8h + sabdl2 v1.8h,v2.16b,v3.16b + + sadalp v1.1d,v2.2s + sadalp v1.2d,v2.4s + sadalp v1.2s,v2.4h + sadalp v1.4h,v2.8b + sadalp v1.4s,v2.8h + sadalp v1.8h,v2.16b + + saddl v1.2d,v2.2s,v3.2s + saddl v1.4s,v2.4h,v3.4h + saddl v1.8h,v2.8b,v3.8b + + saddl2 v1.2d,v2.4s,v3.4s + saddl2 v1.4s,v2.8h,v3.8h + saddl2 v1.8h,v2.16b,v3.16b + + saddlp v1.1d,v2.2s + saddlp v1.2d,v2.4s + saddlp v1.2s,v2.4h + saddlp v1.4h,v2.8b + saddlp v1.4s,v2.8h + saddlp v1.8h,v2.16b + + saddlv d1,v2.4s + saddlv h1,v2.16b + saddlv h1,v2.8b + saddlv s1,v2.4h + saddlv s1,v2.8h + + saddw v1.2d,v2.2d,v3.2s + saddw v1.4s,v2.4s,v3.4h + saddw v1.8h,v2.8h,v3.8b + + saddw2 v1.2d,v2.2d,v3.4s + saddw2 v1.4s,v2.4s,v3.8h + saddw2 v1.8h,v2.8h,v3.16b + + shadd v1.16b,v2.16b,v3.16b + shadd v1.2s,v2.2s,v3.2s + shadd v1.4h,v2.4h,v3.4h + shadd v1.4s,v2.4s,v3.4s + shadd v1.8b,v2.8b,v3.8b + shadd v1.8h,v2.8h,v3.8h + + shl d1,d2,1 + shl v1.16b,v2.16b,7 + shl v1.2d,v2.2d,63 + shl v1.2s,v2.2s,1 + shl v1.4h,v2.4h,1 + shl v1.4s,v2.4s,31 + shl v1.8b,v2.8b,1 + shl v1.8h,v2.8h,15 + + shll v1.2d,v2.2s,32 + shll v1.4s,v2.4h,16 + shll v1.8h,v2.8b,8 + + shll2 v1.2d,v2.4s,32 + shll2 v1.4s,v2.8h,16 + shll2 v1.8h,v2.16b,8 + + shrn v1.2s,v2.2d,3 + shrn v1.4h,v2.4s,2 + shrn v1.8b,v2.8h,1 + + shrn2 v1.16b,v2.8h,1 + shrn2 v1.4s,v2.2d,3 + shrn2 v1.8h,v2.4s,2 + + shsub v1.16b,v2.16b,v3.16b + shsub v1.2s,v2.2s,v3.2s + shsub v1.4h,v2.4h,v3.4h + shsub v1.4s,v2.4s,v3.4s + shsub v1.8b,v2.8b,v3.8b + shsub v1.8h,v2.8h,v3.8h + + sli d1,d2,1 + sli v1.16b,v2.16b,7 + sli v1.2d,v2.2d,63 + sli v1.2s,v2.2s,1 + sli v1.4h,v2.4h,1 + sli v1.4s,v2.4s,31 + sli v1.8b,v2.8b,1 + sli v1.8h,v2.8h,15 + + smax v1.16b,v2.16b,v3.16b + smax v1.2s,v2.2s,v3.2s + smax v1.4h,v2.4h,v3.4h + smax v1.4s,v2.4s,v3.4s + smax v1.8b,v2.8b,v3.8b + smax v1.8h,v2.8h,v3.8h + + smaxp v1.16b,v2.16b,v3.16b + smaxp v1.2s,v2.2s,v3.2s + smaxp v1.4h,v2.4h,v3.4h + smaxp v1.4s,v2.4s,v3.4s + smaxp v1.8b,v2.8b,v3.8b + smaxp v1.8h,v2.8h,v3.8h + + smaxv b1,v2.16b + smaxv b1,v2.8b + smaxv h1,v2.4h + smaxv h1,v2.8h + smaxv s1,v2.4s + + smin v1.16b,v2.16b,v3.16b + smin v1.2s,v2.2s,v3.2s + smin v1.4h,v2.4h,v3.4h + smin v1.4s,v2.4s,v3.4s + smin v1.8b,v2.8b,v3.8b + smin v1.8h,v2.8h,v3.8h + + sminp v1.16b,v2.16b,v3.16b + sminp v1.2s,v2.2s,v3.2s + sminp v1.4h,v2.4h,v3.4h + sminp v1.4s,v2.4s,v3.4s + sminp v1.8b,v2.8b,v3.8b + sminp v1.8h,v2.8h,v3.8h + + sminv b1,v2.16b + sminv b1,v2.8b + sminv h1,v2.4h + sminv h1,v2.8h + sminv s1,v2.4s + + smlal v1.2d,v2.2s,v3.2s + smlal v1.2d,v2.2s,v31.s[3] + smlal v1.4s,v2.4h,v15.h[7] + smlal v1.4s,v2.4h,v3.4h + smlal v1.8h,v2.8b,v3.8b + + smlal2 v1.2d,v2.4s,v3.4s + smlal2 v1.2d,v2.4s,v31.s[3] + smlal2 v1.4s,v2.8h,v15.h[7] + smlal2 v1.4s,v2.8h,v3.8h + smlal2 v1.8h,v2.16b,v3.16b + + smlsl v1.2d,v2.2s,v3.2s + smlsl v1.2d,v2.2s,v31.s[3] + smlsl v1.4s,v2.4h,v15.h[7] + smlsl v1.4s,v2.4h,v3.4h + smlsl v1.8h,v2.8b,v3.8b + + smlsl2 v1.2d,v2.4s,v3.4s + smlsl2 v1.2d,v2.4s,v31.s[3] + smlsl2 v1.4s,v2.8h,v15.h[7] + smlsl2 v1.4s,v2.8h,v3.8h + smlsl2 v1.8h,v2.16b,v3.16b + + smov w1,v2.b[15] + smov w1,v2.h[7] + smov x1,v2.b[4] + smov x1,v2.h[2] + smov x1,v2.s[1] + + smull v1.2d,v2.2s,v3.2s + smull v1.2d,v2.2s,v3.s[0] + smull v1.2d,v2.2s,v31.s[3] + smull v1.4s,v2.4h,v15.h[7] + smull v1.4s,v2.4h,v3.4h + smull v1.4s,v2.4h,v3.h[0] + smull v1.8h,v2.8b,v3.8b + + smull2 v1.2d,v2.4s,v3.4s + smull2 v1.2d,v2.4s,v31.s[3] + smull2 v1.4s,v2.8h,v15.h[7] + smull2 v1.4s,v2.8h,v3.8h + smull2 v1.8h,v2.16b,v3.16b + + sqabs b1,b2 + sqabs d1,d2 + sqabs h1,h2 + sqabs s1,s2 + sqabs v1.16b,v2.16b + sqabs v1.2d,v2.2d + sqabs v1.2s,v2.2s + sqabs v1.4h,v2.4h + sqabs v1.4s,v2.4s + sqabs v1.8b,v2.8b + sqabs v1.8h,v2.8h + + sqadd b1,b2,b3 + sqadd d1,d2,d3 + sqadd h1,h2,h3 + sqadd s1,s2,s3 + sqadd v1.16b,v2.16b,v3.16b + sqadd v1.2d,v2.2d,v3.2d + sqadd v1.2s,v2.2s,v3.2s + sqadd v1.4h,v2.4h,v3.4h + sqadd v1.4s,v2.4s,v3.4s + sqadd v1.8b,v2.8b,v3.8b + sqadd v1.8h,v2.8h,v3.8h + + sqdmlal v1.2d,v2.2s,v3.2s + sqdmlal v1.2d,v2.2s,v31.s[3] + sqdmlal v1.4s,v2.4h,v15.h[7] + sqdmlal v1.4s,v2.4h,v3.4h + + sqdmlal2 v1.2d,v2.4s,v3.4s + sqdmlal2 v1.2d,v2.4s,v31.s[3] + sqdmlal2 v1.4s,v2.8h,v15.h[7] + sqdmlal2 v1.4s,v2.8h,v3.8h + + sqdmlsl v1.2d,v2.2s,v3.2s + sqdmlsl v1.2d,v2.2s,v31.s[3] + sqdmlsl v1.4s,v2.4h,v15.h[7] + sqdmlsl v1.4s,v2.4h,v3.4h + + sqdmlsl2 v1.2d,v2.4s,v3.4s + sqdmlsl2 v1.2d,v2.4s,v31.s[3] + sqdmlsl2 v1.4s,v2.8h,v15.h[7] + sqdmlsl2 v1.4s,v2.8h,v3.8h + + sqdmulh h1,h2,h3 + sqdmulh h1,h2,v3.h[7] + sqdmulh s1,s2,s3 + sqdmulh s1,s2,v3.s[3] + sqdmulh v1.2s,v2.2s,v3.2s + sqdmulh v1.2s,v2.2s,v3.s[0] + sqdmulh v1.4h,v2.4h,v3.4h + sqdmulh v1.4h,v2.4h,v3.h[0] + sqdmulh v1.4s,v2.4s,v3.4s + sqdmulh v1.4s,v2.4s,v3.s[3] + sqdmulh v1.8h,v2.8h,v3.8h + sqdmulh v1.8h,v2.8h,v3.h[7] + + sqdmull v1.2d,v2.2s,v3.2s + sqdmull v1.2d,v2.2s,v31.s[3] + sqdmull v1.4s,v2.4h,v15.h[7] + sqdmull v1.4s,v2.4h,v3.4h + + sqdmull2 v1.2d,v2.4s,v3.4s + sqdmull2 v1.2d,v2.4s,v31.s[3] + sqdmull2 v1.4s,v2.8h,v15.h[7] + sqdmull2 v1.4s,v2.8h,v3.8h + + sqneg b1,b2 + sqneg d1,d2 + sqneg h1,h2 + sqneg s1,s2 + sqneg v1.16b,v2.16b + sqneg v1.2d,v2.2d + sqneg v1.2s,v2.2s + sqneg v1.4h,v2.4h + sqneg v1.4s,v2.4s + sqneg v1.8b,v2.8b + sqneg v1.8h,v2.8h + + sqrdmulh h1,h2,h3 + sqrdmulh h1,h2,v3.h[7] + sqrdmulh s1,s2,s3 + sqrdmulh s1,s2,v3.s[3] + sqrdmulh v1.2s,v2.2s,v3.2s + sqrdmulh v1.2s,v2.2s,v3.s[0] + sqrdmulh v1.4h,v2.4h,v3.4h + sqrdmulh v1.4h,v2.4h,v3.h[0] + sqrdmulh v1.4s,v2.4s,v3.4s + sqrdmulh v1.4s,v2.4s,v3.s[3] + sqrdmulh v1.8h,v2.8h,v3.8h + sqrdmulh v1.8h,v2.8h,v3.h[7] + + sqrshl b1,b2,b3 + sqrshl d1,d2,d3 + sqrshl h1,h2,h3 + sqrshl s1,s2,s3 + sqrshl v1.16b,v2.16b,v3.16b + sqrshl v1.2d,v2.2d,v3.2d + sqrshl v1.2s,v2.2s,v3.2s + sqrshl v1.4h,v2.4h,v3.4h + sqrshl v1.4s,v2.4s,v3.4s + sqrshl v1.8b,v2.8b,v3.8b + sqrshl v1.8h,v2.8h,v3.8h + + sqrshrn b8,h8,1 + sqrshrn h4,s4,2 + sqrshrn s2,d2,3 + sqrshrn v1.2s,v2.2d,3 + sqrshrn v1.4h,v2.4s,2 + sqrshrn v1.8b,v2.8h,1 + + sqrshrn2 v1.16b,v2.8h,1 + sqrshrn2 v1.4s,v2.2d,3 + sqrshrn2 v1.8h,v2.4s,2 + + sqrshrun b8,h8,1 + sqrshrun h4,s4,2 + sqrshrun s2,d2,3 + sqrshrun v1.8b,v2.8h,1 + sqrshrun v1.4h,v2.4s,2 + sqrshrun v1.2s,v2.2d,3 + + sqrshrun2 v1.16b,v2.8h,1 + sqrshrun2 v1.8h,v2.4s,2 + sqrshrun2 v1.4s,v2.2d,3 + + sqshl b1,b2,1 + sqshl b1,b2,b3 + sqshl d1,d2,1 + sqshl d1,d2,d3 + sqshl h1,h2,1 + sqshl h1,h2,h3 + sqshl s1,s2,1 + sqshl s1,s2,s3 + sqshl v1.16b,v2.16b,7 + sqshl v1.16b,v2.16b,v3.16b + sqshl v1.2d,v2.2d,63 + sqshl v1.2d,v2.2d,v3.2d + sqshl v1.2s,v2.2s,1 + sqshl v1.2s,v2.2s,v3.2s + sqshl v1.4h,v2.4h,1 + sqshl v1.4h,v2.4h,v3.4h + sqshl v1.4s,v2.4s,31 + sqshl v1.4s,v2.4s,v3.4s + sqshl v1.8b,v2.8b,1 + sqshl v1.8b,v2.8b,v3.8b + sqshl v1.8h,v2.8h,15 + sqshl v1.8h,v2.8h,v3.8h + + sqshlu b1,b2,1 + sqshlu d1,d2,1 + sqshlu h1,h2,1 + sqshlu s1,s2,1 + sqshlu v1.16b,v2.16b,7 + sqshlu v1.2d,v2.2d,63 + sqshlu v1.2s,v2.2s,1 + sqshlu v1.4h,v2.4h,1 + sqshlu v1.4s,v2.4s,31 + sqshlu v1.8b,v2.8b,1 + sqshlu v1.8h,v2.8h,15 + + sqshrn b8,h8,1 + sqshrn h4,s4,2 + sqshrn s2,d2,3 + sqshrn v1.2s,v2.2d,3 + sqshrn v1.4h,v2.4s,2 + sqshrn v1.8b,v2.8h,1 + + sqshrn2 v1.16b,v2.8h,1 + sqshrn2 v1.4s,v2.2d,3 + sqshrn2 v1.8h,v2.4s,2 + + sqshrun b8,h8,1 + sqshrun h4,s4,2 + sqshrun s2,d2,3 + sqshrun v1.8b,v2.8h,1 + sqshrun v1.4h,v2.4s,2 + sqshrun v1.2s,v2.2d,3 + + sqshrun2 v1.16b,v2.8h,1 + sqshrun2 v1.8h,v2.4s,2 + sqshrun2 v1.4s,v2.2d,3 + + sqsub b1,b2,b3 + sqsub d1,d2,d3 + sqsub h1,h2,h3 + sqsub s1,s2,s3 + sqsub v1.16b,v2.16b,v3.16b + sqsub v1.2d,v2.2d,v3.2d + sqsub v1.2s,v2.2s,v3.2s + sqsub v1.4h,v2.4h,v3.4h + sqsub v1.4s,v2.4s,v3.4s + sqsub v1.8b,v2.8b,v3.8b + sqsub v1.8h,v2.8h,v3.8h + + sqxtn b8,h8 + sqxtn h4,s4 + sqxtn s2,d2 + sqxtn v1.2s,v2.2d + sqxtn v1.4h,v2.4s + sqxtn v1.8b,v2.8h + + sqxtn2 v1.16b,v2.8h + sqxtn2 v1.4s,v2.2d + sqxtn2 v1.8h,v2.4s + + sqxtun b8,h8 + sqxtun h4,s4 + sqxtun s2,d2 + sqxtun v1.2s,v2.2d + sqxtun v1.4h,v2.4s + sqxtun v1.8b,v2.8h + + sqxtun2 v1.16b,v2.8h + sqxtun2 v1.4s,v2.2d + sqxtun2 v1.8h,v2.4s + + srhadd v1.16b,v2.16b,v3.16b + srhadd v1.2s,v2.2s,v3.2s + srhadd v1.4h,v2.4h,v3.4h + srhadd v1.4s,v2.4s,v3.4s + srhadd v1.8b,v2.8b,v3.8b + srhadd v1.8h,v2.8h,v3.8h + + sri d1,d2,1 + sri v1.16b,v2.16b,8 + sri v1.2d,v2.2d,64 + sri v1.2s,v2.2s,1 + sri v1.4h,v2.4h,1 + sri v1.4s,v2.4s,32 + sri v1.8b,v2.8b,1 + sri v1.8h,v2.8h,16 + + srshl d1,d2,d3 + srshl v1.16b,v2.16b,v3.16b + srshl v1.2d,v2.2d,v3.2d + srshl v1.2s,v2.2s,v3.2s + srshl v1.4h,v2.4h,v3.4h + srshl v1.4s,v2.4s,v3.4s + srshl v1.8b,v2.8b,v3.8b + srshl v1.8h,v2.8h,v3.8h + + srshr d1,d2,1 + srshr v1.16b,v2.16b,8 + srshr v1.2d,v2.2d,64 + srshr v1.2s,v2.2s,1 + srshr v1.4h,v2.4h,1 + srshr v1.4s,v2.4s,32 + srshr v1.8b,v2.8b,1 + srshr v1.8h,v2.8h,16 + + srsra d1,d2,1 + srsra v1.16b,v2.16b,8 + srsra v1.2d,v2.2d,64 + srsra v1.2s,v2.2s,1 + srsra v1.4h,v2.4h,1 + srsra v1.4s,v2.4s,32 + srsra v1.8b,v2.8b,1 + srsra v1.8h,v2.8h,16 + + sshl d1,d2,d3 + sshl v1.16b,v2.16b,v3.16b + sshl v1.2d,v2.2d,v3.2d + sshl v1.2s,v2.2s,v3.2s + sshl v1.4h,v2.4h,v3.4h + sshl v1.4s,v2.4s,v3.4s + sshl v1.8b,v2.8b,v3.8b + sshl v1.8h,v2.8h,v3.8h + + sshll v1.2d,v2.2s,3 + sshll v1.4s,v2.4h,2 + sshll v1.8h,v2.8b,1 + + sshll2 v1.2d,v2.4s,31 + sshll2 v1.4s,v2.8h,15 + sshll2 v1.8h,v2.16b,7 + + sshr d1,d2,1 + sshr v1.16b,v2.16b,8 + sshr v1.2d,v2.2d,64 + sshr v1.2s,v2.2s,1 + sshr v1.4h,v2.4h,1 + sshr v1.4s,v2.4s,32 + sshr v1.8b,v2.8b,1 + sshr v1.8h,v2.8h,16 + + ssra d1,d2,1 + ssra v1.16b,v2.16b,8 + ssra v1.2d,v2.2d,64 + ssra v1.2s,v2.2s,1 + ssra v1.4h,v2.4h,1 + ssra v1.4s,v2.4s,32 + ssra v1.8b,v2.8b,1 + ssra v1.8h,v2.8h,16 + + ssubl v1.2d,v2.2s,v3.2s + ssubl v1.4s,v2.4h,v3.4h + ssubl v1.8h,v2.8b,v3.8b + + ssubl2 v1.2d,v2.4s,v3.4s + ssubl2 v1.4s,v2.8h,v3.8h + ssubl2 v1.8h,v2.16b,v3.16b + + ssubw v1.2d,v2.2d,v3.2s + ssubw v1.4s,v2.4s,v3.4h + ssubw v1.8h,v2.8h,v3.8b + + ssubw2 v1.2d,v2.2d,v3.4s + ssubw2 v1.4s,v2.4s,v3.8h + ssubw2 v1.8h,v2.8h,v3.16b + + st1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp] + st1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp],64 + st1 {v1.16b,v2.16b,v3.16b,v4.16b},[sp],x6 + st1 {v1.16b,v2.16b,v3.16b},[x4] + st1 {v1.16b,v2.16b,v3.16b},[x4],48 + st1 {v1.16b,v2.16b,v3.16b},[x4],x5 + st1 {v1.16b,v2.16b},[x3] + st1 {v1.16b,v2.16b},[x3],32 + st1 {v1.16b,v2.16b},[x3],x4 + st1 {v1.16b},[x2] + st1 {v1.16b},[x2],16 + st1 {v1.16b},[x2],x3 + st1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp] + st1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp],32 + st1 {v1.1d,v2.1d,v3.1d,v4.1d},[sp],x6 + st1 {v1.1d,v2.1d,v3.1d},[x4] + st1 {v1.1d,v2.1d,v3.1d},[x4],24 + st1 {v1.1d,v2.1d,v3.1d},[x4],x5 + st1 {v1.1d,v2.1d},[x3] + st1 {v1.1d,v2.1d},[x3],16 + st1 {v1.1d,v2.1d},[x3],x4 + st1 {v1.1d},[x2] + st1 {v1.1d},[x2],8 + st1 {v1.1d},[x2],x3 + st1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp] + st1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp],64 + st1 {v1.2d,v2.2d,v3.2d,v4.2d},[sp],x6 + st1 {v1.2d,v2.2d,v3.2d},[x4] + st1 {v1.2d,v2.2d,v3.2d},[x4],48 + st1 {v1.2d,v2.2d,v3.2d},[x4],x5 + st1 {v1.2d,v2.2d},[x3] + st1 {v1.2d,v2.2d},[x3],32 + st1 {v1.2d,v2.2d},[x3],x4 + st1 {v1.2d},[x2] + st1 {v1.2d},[x2],16 + st1 {v1.2d},[x2],x3 + st1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp] + st1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp],32 + st1 {v1.2s,v2.2s,v3.2s,v4.2s},[sp],x6 + st1 {v1.2s,v2.2s,v3.2s},[x4] + st1 {v1.2s,v2.2s,v3.2s},[x4],24 + st1 {v1.2s,v2.2s,v3.2s},[x4],x5 + st1 {v1.2s,v2.2s},[x3] + st1 {v1.2s,v2.2s},[x3],16 + st1 {v1.2s,v2.2s},[x3],x4 + st1 {v1.2s},[x2] + st1 {v1.2s},[x2],8 + st1 {v1.2s},[x2],x3 + st1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp] + st1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp],32 + st1 {v1.4h,v2.4h,v3.4h,v4.4h},[sp],x6 + st1 {v1.4h,v2.4h,v3.4h},[x4] + st1 {v1.4h,v2.4h,v3.4h},[x4],24 + st1 {v1.4h,v2.4h,v3.4h},[x4],x5 + st1 {v1.4h,v2.4h},[x3] + st1 {v1.4h,v2.4h},[x3],16 + st1 {v1.4h,v2.4h},[x3],x4 + st1 {v1.4h},[x2] + st1 {v1.4h},[x2],8 + st1 {v1.4h},[x2],x3 + st1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp] + st1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp],64 + st1 {v1.4s,v2.4s,v3.4s,v4.4s},[sp],x6 + st1 {v1.4s,v2.4s,v3.4s},[x4] + st1 {v1.4s,v2.4s,v3.4s},[x4],48 + st1 {v1.4s,v2.4s,v3.4s},[x4],x5 + st1 {v1.4s,v2.4s},[x3] + st1 {v1.4s,v2.4s},[x3],32 + st1 {v1.4s,v2.4s},[x3],x4 + st1 {v1.4s},[x2] + st1 {v1.4s},[x2],16 + st1 {v1.4s},[x2],x3 + st1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp] + st1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp],32 + st1 {v1.8b,v2.8b,v3.8b,v4.8b},[sp],x6 + st1 {v1.8b,v2.8b,v3.8b},[x4] + st1 {v1.8b,v2.8b,v3.8b},[x4],24 + st1 {v1.8b,v2.8b,v3.8b},[x4],x5 + st1 {v1.8b,v2.8b},[x3] + st1 {v1.8b,v2.8b},[x3],16 + st1 {v1.8b,v2.8b},[x3],x4 + st1 {v1.8b},[x2] + st1 {v1.8b},[x2],8 + st1 {v1.8b},[x2],x3 + st1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp] + st1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp],64 + st1 {v1.8h,v2.8h,v3.8h,v4.8h},[sp],x6 + st1 {v1.8h,v2.8h,v3.8h},[x4] + st1 {v1.8h,v2.8h,v3.8h},[x4],48 + st1 {v1.8h,v2.8h,v3.8h},[x4],x5 + st1 {v1.8h,v2.8h},[x3] + st1 {v1.8h,v2.8h},[x3],32 + st1 {v1.8h,v2.8h},[x3],x4 + st1 {v1.8h},[x2] + st1 {v1.8h},[x2],16 + st1 {v1.8h},[x2],x3 + st1 {v1.b}[2],[x3] + st1 {v1.b}[2],[x3],1 + st1 {v1.b}[2],[x3],x4 + st1 {v1.d}[1],[x3] + st1 {v1.d}[1],[x3],8 + st1 {v1.d}[1],[x3],x4 + st1 {v1.h}[2],[x3] + st1 {v1.h}[2],[x3],2 + st1 {v1.h}[2],[x3],x4 + st1 {v1.s}[2],[x3] + st1 {v1.s}[2],[x3],4 + st1 {v1.s}[2],[x3],x4 + + st2 {v1.16b,v2.16b},[x3] + st2 {v1.16b,v2.16b},[x3],32 + st2 {v1.16b,v2.16b},[x3],x4 + st2 {v1.2d,v2.2d},[x3] + st2 {v1.2d,v2.2d},[x3],32 + st2 {v1.2d,v2.2d},[x3],x4 + st2 {v1.2s,v2.2s},[x3] + st2 {v1.2s,v2.2s},[x3],16 + st2 {v1.2s,v2.2s},[x3],x4 + st2 {v1.4h,v2.4h},[x3] + st2 {v1.4h,v2.4h},[x3],16 + st2 {v1.4h,v2.4h},[x3],x4 + st2 {v1.4s,v2.4s},[x3] + st2 {v1.4s,v2.4s},[x3],32 + st2 {v1.4s,v2.4s},[x3],x4 + st2 {v1.8b,v2.8b},[x3] + st2 {v1.8b,v2.8b},[x3],16 + st2 {v1.8b,v2.8b},[x3],x4 + st2 {v1.8h,v2.8h},[x3] + st2 {v1.8h,v2.8h},[x3],32 + st2 {v1.8h,v2.8h},[x3],x4 + st2 {v1.b,v2.b}[15],[x3] + st2 {v1.b,v2.b}[2],[x3],2 + st2 {v1.b,v2.b}[2],[x3],x4 + st2 {v1.d,v2.d}[1],[x3] + st2 {v1.d,v2.d}[1],[x3],16 + st2 {v1.d,v2.d}[1],[x3],x4 + st2 {v1.h,v2.h}[2],[x3] + st2 {v1.h,v2.h}[2],[x3],4 + st2 {v1.h,v2.h}[2],[x3],x4 + st2 {v1.s,v2.s}[2],[x3] + st2 {v1.s,v2.s}[2],[x3],8 + st2 {v1.s,v2.s}[2],[x3],x4 + + st3 {v1.16b,v2.16b,v3.16b},[x3] + st3 {v1.16b,v2.16b,v3.16b},[x3],48 + st3 {v1.16b,v2.16b,v3.16b},[x3],x4 + st3 {v1.2d,v2.2d,v3.2d},[x3] + st3 {v1.2d,v2.2d,v3.2d},[x3],48 + st3 {v1.2d,v2.2d,v3.2d},[x3],x4 + st3 {v1.2s,v2.2s,v3.2s},[x3] + st3 {v1.2s,v2.2s,v3.2s},[x3],24 + st3 {v1.2s,v2.2s,v3.2s},[x3],x4 + st3 {v1.4h,v2.4h,v3.4h},[x3] + st3 {v1.4h,v2.4h,v3.4h},[x3],24 + st3 {v1.4h,v2.4h,v3.4h},[x3],x4 + st3 {v1.4s,v2.4s,v3.4s},[x3] + st3 {v1.4s,v2.4s,v3.4s},[x3],48 + st3 {v1.4s,v2.4s,v3.4s},[x3],x4 + st3 {v1.8b,v2.8b,v3.8b},[x3] + st3 {v1.8b,v2.8b,v3.8b},[x3],24 + st3 {v1.8b,v2.8b,v3.8b},[x3],x4 + st3 {v1.8h,v2.8h,v3.8h},[x3] + st3 {v1.8h,v2.8h,v3.8h},[x3],48 + st3 {v1.8h,v2.8h,v3.8h},[x3],x4 + st3 {v1.b,v2.b,v3.b}[15],[x3] + st3 {v1.b,v2.b,v3.b}[2],[x3],3 + st3 {v1.b,v2.b,v3.b}[2],[x3],x4 + st3 {v1.d,v2.d,v3.d}[1],[x3] + st3 {v1.d,v2.d,v3.d}[1],[x3],24 + st3 {v1.d,v2.d,v3.d}[1],[x3],x4 + st3 {v1.h,v2.h,v3.h}[2],[x3] + st3 {v1.h,v2.h,v3.h}[2],[x3],6 + st3 {v1.h,v2.h,v3.h}[2],[x3],x4 + st3 {v1.s,v2.s,v3.s}[2],[x3] + st3 {v1.s,v2.s,v3.s}[2],[x3],12 + st3 {v1.s,v2.s,v3.s}[2],[x3],x4 + + st4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3] + st4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3],64 + st4 {v1.16b,v2.16b,v3.16b,v4.16b},[x3],x4 + st4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3] + st4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3],64 + st4 {v1.2d,v2.2d,v3.2d,v4.2d},[x3],x4 + st4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3] + st4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3],32 + st4 {v1.2s,v2.2s,v3.2s,v4.2s},[x3],x4 + st4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3] + st4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3],32 + st4 {v1.4h,v2.4h,v3.4h,v4.4h},[x3],x4 + st4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3] + st4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3],64 + st4 {v1.4s,v2.4s,v3.4s,v4.4s},[x3],x4 + st4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3] + st4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3],32 + st4 {v1.8b,v2.8b,v3.8b,v4.8b},[x3],x4 + st4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3] + st4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3],64 + st4 {v1.8h,v2.8h,v3.8h,v4.8h},[x3],x4 + st4 {v1.b,v2.b,v3.b,v4.b}[15],[x3] + st4 {v1.b,v2.b,v3.b,v4.b}[2],[x3],4 + st4 {v1.b,v2.b,v3.b,v4.b}[2],[x3],x4 + st4 {v1.d,v2.d,v3.d,v4.d}[1],[x3] + st4 {v1.d,v2.d,v3.d,v4.d}[1],[x3],32 + st4 {v1.d,v2.d,v3.d,v4.d}[1],[x3],x4 + st4 {v1.h,v2.h,v3.h,v4.h}[2],[x3] + st4 {v1.h,v2.h,v3.h,v4.h}[2],[x3],8 + st4 {v1.h,v2.h,v3.h,v4.h}[2],[x3],x4 + st4 {v1.s,v2.s,v3.s,v4.s}[2],[x3] + st4 {v1.s,v2.s,v3.s,v4.s}[2],[x3],16 + st4 {v1.s,v2.s,v3.s,v4.s}[2],[x3],x4 + + stnp d0,d1,[x2] + stnp d0,d1,[x2,+0x8] + stnp d0,d1,[expression.qword] + stnp q0,q1,[x2] + stnp q0,q1,[x2,+0x20] + stnp q0,q1,[expression.dqword] + stnp s0,s1,[x2] + stnp s0,s1,[x2,+0x8] + stnp s0,s1,[expression.dword] + + stp d0,d1,[x2] + stp d0,d1,[x2,+0x8] + stp d0,d1,[expression.qword] + stp d0,d1,[x2,+0x8]! + stp d0,d1,[expression.qword]! + stp d0,d1,[x2],+0x8 + stp q0,q1,[x2] + stp q0,q1,[x2,+0x10] + stp q0,q1,[expression.dqword] + stp q0,q1,[x2,+0x10]! + stp q0,q1,[expression.dqword]! + stp q0,q1,[x2],+0x10 + stp s0,s1,[x2] + stp s0,s1,[x2,+0x8] + stp s0,s1,[expression.dword] + stp s0,s1,[x2,+0x8]! + stp s0,s1,[expression.dword]! + stp s0,s1,[x2],+0x8 + + str b0,[x2] + str b0,[x2,+0x8] + str b0,[expression.byte] + str b0,[x2,+0x8]! + str b0,[expression.byte]! + str b0,[x2],+0x8 + str b0,[x2,w3,sxtw] + str b0,[x2,w3,sxtw 0] + str b0,[x2,w3,uxtw] + str b0,[x2,w3,uxtw 0] + str b0,[x2,x3] + str b0,[x2,x3,lsl 0] + str b0,[x2,x3,sxtx] + str b0,[x2,x3,sxtx 0] + str h0,[x2] + str h0,[x2,+0x8] + str h0,[expression.hword] + str h0,[x2,+0x8]! + str h0,[expression.hword]! + str h0,[x2],+0x8 + str h0,[x2,w3,sxtw] + str h0,[x2,w3,sxtw 1] + str h0,[x2,w3,uxtw] + str h0,[x2,w3,uxtw 1] + str h0,[x2,x3] + str h0,[x2,x3,lsl 1] + str h0,[x2,x3,sxtx] + str h0,[x2,x3,sxtx 1] + str s0,[x2,+0x8] + str s0,[expression.word] + str s0,[x2,+0x8]! + str s0,[expression.word]! + str s0,[x2],+0x8 + str s0,[x2,w3,sxtw] + str s0,[x2,w3,sxtw 2] + str s0,[x2,w3,uxtw] + str s0,[x2,w3,uxtw 2] + str s0,[x2,x3] + str s0,[x2,x3,lsl 2] + str s0,[x2,x3,sxtx] + str s0,[x2,x3,sxtx 2] + str d0,[x2,+0x8] + str d0,[expression.dword] + str d0,[x2,+0x8]! + str d0,[expression.dword]! + str d0,[x2],+0x8 + str d0,[x2,w3,sxtw] + str d0,[x2,w3,sxtw 3] + str d0,[x2,w3,uxtw] + str d0,[x2,w3,uxtw 3] + str d0,[x2,x3] + str d0,[x2,x3,lsl 3] + str d0,[x2,x3,sxtx] + str d0,[x2,x3,sxtx 3] + str q0,[x2,+0x8] + str q0,[expression.qword] + str q0,[x2,+0x8]! + str q0,[expression.qword]! + str q0,[x2],+0x8 + str q0,[x2,w3,sxtw] + str q0,[x2,w3,sxtw 4] + str q0,[x2,w3,uxtw] + str q0,[x2,w3,uxtw 4] + str q0,[x2,x3] + str q0,[x2,x3,lsl 4] + str q0,[x2,x3,sxtx] + str q0,[x2,x3,sxtx 4] + + stur b0,[x2] + stur b0,[x2,+0x8] + stur b0,[expression.byte] + stur h0,[x2] + stur h0,[x2,+0x8] + stur h0,[expression.hword] + stur s0,[x2] + stur s0,[x2,+0x8] + stur s0,[expression.word] + stur d0,[x2] + stur d0,[x2,+0x8] + stur d0,[expression.dword] + stur q0,[x2] + stur q0,[x2,+0x8] + stur q0,[expression.qword] + + sub d1,d2,d3 + sub v1.16b,v2.16b,v3.16b + sub v1.2d,v2.2d,v3.2d + sub v1.2s,v2.2s,v3.2s + sub v1.4h,v2.4h,v3.4h + sub v1.4s,v2.4s,v3.4s + sub v1.8b,v2.8b,v3.8b + sub v1.8h,v2.8h,v3.8h + + subhn v1.2s,v2.2d,v3.2d + subhn v1.4h,v2.4s,v3.4s + subhn v1.8b,v2.8h,v3.8h + + subhn2 v1.16b,v2.8h,v3.8h + subhn2 v1.4s,v2.2d,v3.2d + subhn2 v1.8h,v2.4s,v3.4s + + suqadd b1,b2 + suqadd d1,d2 + suqadd h1,h2 + suqadd s1,s2 + suqadd v1.16b,v2.16b + suqadd v1.2d,v2.2d + suqadd v1.2s,v2.2s + suqadd v1.4h,v2.4h + suqadd v1.4s,v2.4s + suqadd v1.8b,v2.8b + suqadd v1.8h,v2.8h + + sxtl v1.2d,v2.2s + sxtl v1.4s,v2.4h + sxtl v1.8h,v2.8b + + sxtl2 v1.2d,v2.4s + sxtl2 v1.4s,v2.8h + sxtl2 v1.8h,v2.16b + + tbl v1.8b,{v2.16b},v6.8b + tbl v1.8b,{v2.16b,v3.16b},v6.8b + tbl v1.8b,{v2.16b,v3.16b,v4.16b},v6.8b + tbl v1.8b,{v2.16b,v3.16b,v4.16b,v5.16b},v6.8b + + tbx v1.8b,{v2.16b},v6.8b + tbx v1.8b,{v2.16b,v3.16b},v6.8b + tbx v1.8b,{v2.16b,v3.16b,v4.16b},v6.8b + tbx v1.8b,{v2.16b,v3.16b,v4.16b,v5.16b},v6.8b + + trn1 v1.16b,v2.16b,v3.16b + trn1 v1.2d,v2.2d,v3.2d + trn1 v1.2s,v2.2s,v3.2s + trn1 v1.4h,v2.4h,v3.4h + trn1 v1.4s,v2.4s,v3.4s + trn1 v1.8b,v2.8b,v3.8b + trn1 v1.8h,v2.8h,v3.8h + + trn2 v1.16b,v2.16b,v3.16b + trn2 v1.2d,v2.2d,v3.2d + trn2 v1.2s,v2.2s,v3.2s + trn2 v1.4h,v2.4h,v3.4h + trn2 v1.4s,v2.4s,v3.4s + trn2 v1.8b,v2.8b,v3.8b + trn2 v1.8h,v2.8h,v3.8h + + uaba v1.16b,v2.16b,v3.16b + uaba v1.2s,v2.2s,v3.2s + uaba v1.4h,v2.4h,v3.4h + uaba v1.4s,v2.4s,v3.4s + uaba v1.8b,v2.8b,v3.8b + uaba v1.8h,v2.8h,v3.8h + + uabal v1.2d,v2.2s,v3.2s + uabal v1.4s,v2.4h,v3.4h + uabal v1.8h,v2.8b,v3.8b + + uabal2 v1.2d,v2.4s,v3.4s + uabal2 v1.4s,v2.8h,v3.8h + uabal2 v1.8h,v2.16b,v3.16b + + uabd v1.16b,v2.16b,v3.16b + uabd v1.2s,v2.2s,v3.2s + uabd v1.4h,v2.4h,v3.4h + uabd v1.4s,v2.4s,v3.4s + uabd v1.8b,v2.8b,v3.8b + uabd v1.8h,v2.8h,v3.8h + + uabdl v1.2d,v2.2s,v3.2s + uabdl v1.4s,v2.4h,v3.4h + uabdl v1.8h,v2.8b,v3.8b + + uabdl2 v1.2d,v2.4s,v3.4s + uabdl2 v1.4s,v2.8h,v3.8h + uabdl2 v1.8h,v2.16b,v3.16b + + uadalp v1.1d,v2.2s + uadalp v1.2d,v2.4s + uadalp v1.2s,v2.4h + uadalp v1.4h,v2.8b + uadalp v1.4s,v2.8h + uadalp v1.8h,v2.16b + + uaddl v1.2d,v2.2s,v3.2s + uaddl v1.4s,v2.4h,v3.4h + uaddl v1.8h,v2.8b,v3.8b + + uaddl2 v1.2d,v2.4s,v3.4s + uaddl2 v1.4s,v2.8h,v3.8h + uaddl2 v1.8h,v2.16b,v3.16b + + uaddlp v1.1d,v2.2s + uaddlp v1.2d,v2.4s + uaddlp v1.2s,v2.4h + uaddlp v1.4h,v2.8b + uaddlp v1.4s,v2.8h + uaddlp v1.8h,v2.16b + + uaddlv d1,v2.4s + uaddlv h1,v2.16b + uaddlv h1,v2.8b + uaddlv s1,v2.4h + uaddlv s1,v2.8h + + uaddw v1.2d,v2.2d,v3.2s + uaddw v1.4s,v2.4s,v3.4h + uaddw v1.8h,v2.8h,v3.8b + + uaddw2 v1.2d,v2.2d,v3.4s + uaddw2 v1.4s,v2.4s,v3.8h + uaddw2 v1.8h,v2.8h,v3.16b + + uhadd v1.16b,v2.16b,v3.16b + uhadd v1.2s,v2.2s,v3.2s + uhadd v1.4h,v2.4h,v3.4h + uhadd v1.4s,v2.4s,v3.4s + uhadd v1.8b,v2.8b,v3.8b + uhadd v1.8h,v2.8h,v3.8h + + uhsub v1.16b,v2.16b,v3.16b + uhsub v1.2s,v2.2s,v3.2s + uhsub v1.4h,v2.4h,v3.4h + uhsub v1.4s,v2.4s,v3.4s + uhsub v1.8b,v2.8b,v3.8b + uhsub v1.8h,v2.8h,v3.8h + + umax v1.16b,v2.16b,v3.16b + umax v1.2s,v2.2s,v3.2s + umax v1.4h,v2.4h,v3.4h + umax v1.4s,v2.4s,v3.4s + umax v1.8b,v2.8b,v3.8b + umax v1.8h,v2.8h,v3.8h + + umaxp v1.16b,v2.16b,v3.16b + umaxp v1.2s,v2.2s,v3.2s + umaxp v1.4h,v2.4h,v3.4h + umaxp v1.4s,v2.4s,v3.4s + umaxp v1.8b,v2.8b,v3.8b + umaxp v1.8h,v2.8h,v3.8h + + umaxv b1,v2.16b + umaxv b1,v2.8b + umaxv h1,v2.4h + umaxv h1,v2.8h + umaxv s1,v2.4s + + umin v1.16b,v2.16b,v3.16b + umin v1.2s,v2.2s,v3.2s + umin v1.4h,v2.4h,v3.4h + umin v1.4s,v2.4s,v3.4s + umin v1.8b,v2.8b,v3.8b + umin v1.8h,v2.8h,v3.8h + + uminp v1.16b,v2.16b,v3.16b + uminp v1.2s,v2.2s,v3.2s + uminp v1.4h,v2.4h,v3.4h + uminp v1.4s,v2.4s,v3.4s + uminp v1.8b,v2.8b,v3.8b + uminp v1.8h,v2.8h,v3.8h + + uminv b1,v2.16b + uminv b1,v2.8b + uminv h1,v2.4h + uminv h1,v2.8h + uminv s1,v2.4s + + umlal v1.2d,v2.2s,v3.2s + umlal v1.2d,v2.2s,v31.s[3] + umlal v1.4s,v2.4h,v15.h[7] + umlal v1.4s,v2.4h,v3.4h + umlal v1.8h,v2.8b,v3.8b + + umlal2 v1.2d,v2.4s,v3.4s + umlal2 v1.2d,v2.4s,v31.s[3] + umlal2 v1.4s,v2.8h,v15.h[7] + umlal2 v1.4s,v2.8h,v3.8h + umlal2 v1.8h,v2.16b,v3.16b + + umlsl v1.2d,v2.2s,v3.2s + umlsl v1.2d,v2.2s,v31.s[3] + umlsl v1.4s,v2.4h,v15.h[7] + umlsl v1.4s,v2.4h,v3.4h + umlsl v1.8h,v2.8b,v3.8b + + umlsl2 v1.2d,v2.4s,v3.4s + umlsl2 v1.2d,v2.4s,v31.s[3] + umlsl2 v1.4s,v2.8h,v15.h[7] + umlsl2 v1.4s,v2.8h,v3.8h + umlsl2 v1.8h,v2.16b,v3.16b + + umov w1,v2.b[15] + umov w1,v2.h[4] + umov w1,v2.s[2] + umov x1,v2.d[1] + + umull v1.2d,v2.2s,v3.2s + umull v1.2d,v2.2s,v3.s[0] + umull v1.2d,v2.2s,v3.s[2] + umull v1.4s,v2.4h,v3.4h + umull v1.4s,v2.4h,v3.h[0] + umull v1.4s,v2.4h,v3.h[4] + umull v1.8h,v2.8b,v3.8b + + umull2 v1.2d,v2.4s,v3.4s + umull2 v1.2d,v2.4s,v31.s[3] + umull2 v1.4s,v2.8h,v15.h[7] + umull2 v1.4s,v2.8h,v3.8h + umull2 v1.8h,v2.16b,v3.16b + + uqadd b1,b2,b3 + uqadd d1,d2,d3 + uqadd h1,h2,h3 + uqadd s1,s2,s3 + uqadd v1.16b,v2.16b,v3.16b + uqadd v1.2d,v2.2d,v3.2d + uqadd v1.2s,v2.2s,v3.2s + uqadd v1.4h,v2.4h,v3.4h + uqadd v1.4s,v2.4s,v3.4s + uqadd v1.8b,v2.8b,v3.8b + uqadd v1.8h,v2.8h,v3.8h + + uqrshl b1,b2,b3 + uqrshl d1,d2,d3 + uqrshl h1,h2,h3 + uqrshl s1,s2,s3 + uqrshl v1.16b,v2.16b,v3.16b + uqrshl v1.2d,v2.2d,v3.2d + uqrshl v1.2s,v2.2s,v3.2s + uqrshl v1.4h,v2.4h,v3.4h + uqrshl v1.4s,v2.4s,v3.4s + uqrshl v1.8b,v2.8b,v3.8b + uqrshl v1.8h,v2.8h,v3.8h + + uqrshrn b8,h8,1 + uqrshrn h4,s4,2 + uqrshrn s2,d2,3 + uqrshrn v1.2s,v2.2d,3 + uqrshrn v1.4h,v2.4s,2 + uqrshrn v1.8b,v2.8h,1 + + uqrshrn2 v1.16b,v2.8h,1 + uqrshrn2 v1.4s,v2.2d,3 + uqrshrn2 v1.8h,v2.4s,2 + + uqshl b1,b2,7 + uqshl b1,b2,b3 + uqshl d1,d2,63 + uqshl d1,d2,d3 + uqshl h1,h2,15 + uqshl h1,h2,h3 + uqshl s1,s2,31 + uqshl s1,s2,s3 + uqshl v1.16b,v2.16b,7 + uqshl v1.16b,v2.16b,v3.16b + uqshl v1.2d,v2.2d,63 + uqshl v1.2d,v2.2d,v3.2d + uqshl v1.2s,v2.2s,1 + uqshl v1.2s,v2.2s,v3.2s + uqshl v1.4h,v2.4h,1 + uqshl v1.4h,v2.4h,v3.4h + uqshl v1.4s,v2.4s,31 + uqshl v1.4s,v2.4s,v3.4s + uqshl v1.8b,v2.8b,1 + uqshl v1.8b,v2.8b,v3.8b + uqshl v1.8h,v2.8h,15 + uqshl v1.8h,v2.8h,v3.8h + + uqshrn b8,h8,1 + uqshrn h4,s4,2 + uqshrn s2,d2,3 + uqshrn v1.2s,v2.2d,3 + uqshrn v1.4h,v2.4s,2 + uqshrn v1.8b,v2.8h,1 + + uqshrn2 v1.16b,v2.8h,1 + uqshrn2 v1.4s,v2.2d,3 + uqshrn2 v1.8h,v2.4s,2 + + uqsub b1,b2,b3 + uqsub d1,d2,d3 + uqsub h1,h2,h3 + uqsub s1,s2,s3 + uqsub v1.16b,v2.16b,v3.16b + uqsub v1.2d,v2.2d,v3.2d + uqsub v1.2s,v2.2s,v3.2s + uqsub v1.4h,v2.4h,v3.4h + uqsub v1.4s,v2.4s,v3.4s + uqsub v1.8b,v2.8b,v3.8b + uqsub v1.8h,v2.8h,v3.8h + + uqxtn b8,h8 + uqxtn h4,s4 + uqxtn s2,d2 + uqxtn v1.2s,v2.2d + uqxtn v1.4h,v2.4s + uqxtn v1.8b,v2.8h + + uqxtn2 v1.16b,v2.8h + uqxtn2 v1.4s,v2.2d + uqxtn2 v1.8h,v2.4s + + urhadd v1.16b,v2.16b,v3.16b + urhadd v1.2s,v2.2s,v3.2s + urhadd v1.4h,v2.4h,v3.4h + urhadd v1.4s,v2.4s,v3.4s + urhadd v1.8b,v2.8b,v3.8b + urhadd v1.8h,v2.8h,v3.8h + + urshl d1,d2,d3 + urshl v1.16b,v2.16b,v3.16b + urshl v1.2d,v2.2d,v3.2d + urshl v1.2s,v2.2s,v3.2s + urshl v1.4h,v2.4h,v3.4h + urshl v1.4s,v2.4s,v3.4s + urshl v1.8b,v2.8b,v3.8b + urshl v1.8h,v2.8h,v3.8h + + urshr d1,d2,1 + urshr v1.16b,v2.16b,8 + urshr v1.2d,v2.2d,64 + urshr v1.2s,v2.2s,1 + urshr v1.4h,v2.4h,1 + urshr v1.4s,v2.4s,32 + urshr v1.8b,v2.8b,1 + urshr v1.8h,v2.8h,16 + + ursra d1,d2,1 + ursra v1.16b,v2.16b,8 + ursra v1.2d,v2.2d,64 + ursra v1.2s,v2.2s,1 + ursra v1.4h,v2.4h,1 + ursra v1.4s,v2.4s,32 + ursra v1.8b,v2.8b,1 + ursra v1.8h,v2.8h,16 + + ushl d1,d2,d3 + ushl v1.16b,v2.16b,v3.16b + ushl v1.2d,v2.2d,v3.2d + ushl v1.2s,v2.2s,v3.2s + ushl v1.4h,v2.4h,v3.4h + ushl v1.4s,v2.4s,v3.4s + ushl v1.8b,v2.8b,v3.8b + ushl v1.8h,v2.8h,v3.8h + + ushll v1.2d,v2.2s,3 + ushll v1.4s,v2.4h,2 + ushll v1.8h,v2.8b,1 + + ushll2 v1.2d,v2.4s,31 + ushll2 v1.4s,v2.8h,15 + ushll2 v1.8h,v2.16b,7 + + ushr d1,d2,1 + ushr v1.16b,v2.16b,8 + ushr v1.2d,v2.2d,64 + ushr v1.2s,v2.2s,1 + ushr v1.4h,v2.4h,1 + ushr v1.4s,v2.4s,32 + ushr v1.8b,v2.8b,1 + ushr v1.8h,v2.8h,16 + + usqadd b1,b2 + usqadd d1,d2 + usqadd h1,h2 + usqadd s1,s2 + usqadd v1.16b,v2.16b + usqadd v1.2d,v2.2d + usqadd v1.2s,v2.2s + usqadd v1.4h,v2.4h + usqadd v1.4s,v2.4s + usqadd v1.8b,v2.8b + usqadd v1.8h,v2.8h + + usra d1,d2,1 + usra v1.16b,v2.16b,8 + usra v1.2d,v2.2d,64 + usra v1.2s,v2.2s,1 + usra v1.4h,v2.4h,1 + usra v1.4s,v2.4s,32 + usra v1.8b,v2.8b,1 + usra v1.8h,v2.8h,16 + + usubl v1.2d,v2.2s,v3.2s + usubl v1.4s,v2.4h,v3.4h + usubl v1.8h,v2.8b,v3.8b + + usubl2 v1.2d,v2.4s,v3.4s + usubl2 v1.4s,v2.8h,v3.8h + usubl2 v1.8h,v2.16b,v3.16b + + usubw v1.2d,v2.2d,v3.2s + usubw v1.4s,v2.4s,v3.4h + usubw v1.8h,v2.8h,v3.8b + + usubw2 v1.2d,v2.2d,v3.4s + usubw2 v1.4s,v2.4s,v3.8h + usubw2 v1.8h,v2.8h,v3.16b + + uxtl v1.2d,v2.2s + uxtl v1.4s,v2.4h + uxtl v1.8h,v2.8b + + uxtl2 v1.2d,v2.4s + uxtl2 v1.4s,v2.8h + uxtl2 v1.8h,v2.16b + + uzp1 v1.16b,v2.16b,v3.16b + uzp1 v1.2d,v2.2d,v3.2d + uzp1 v1.2s,v2.2s,v3.2s + uzp1 v1.4h,v2.4h,v3.4h + uzp1 v1.4s,v2.4s,v3.4s + uzp1 v1.8b,v2.8b,v3.8b + uzp1 v1.8h,v2.8h,v3.8h + + uzp2 v1.16b,v2.16b,v3.16b + uzp2 v1.2d,v2.2d,v3.2d + uzp2 v1.2s,v2.2s,v3.2s + uzp2 v1.4h,v2.4h,v3.4h + uzp2 v1.4s,v2.4s,v3.4s + uzp2 v1.8b,v2.8b,v3.8b + uzp2 v1.8h,v2.8h,v3.8h + + xtn v1.8b,v2.8h + xtn v1.4h,v2.4s + xtn v1.2s,v2.2d + + xtn2 v1.16b,v2.8h + xtn2 v1.8h,v2.4s + xtn2 v1.4s,v2.2d + + zip1 v1.16b,v2.16b,v3.16b + zip1 v1.2d,v2.2d,v3.2d + zip1 v1.2s,v2.2s,v3.2s + zip1 v1.4h,v2.4h,v3.4h + zip1 v1.4s,v2.4s,v3.4s + zip1 v1.8b,v2.8b,v3.8b + zip1 v1.8h,v2.8h,v3.8h + + zip2 v1.16b,v2.16b,v3.16b + zip2 v1.2d,v2.2d,v3.2d + zip2 v1.2s,v2.2s,v3.2s + zip2 v1.4h,v2.4h,v3.4h + zip2 v1.4s,v2.4s,v3.4s + zip2 v1.8b,v2.8b,v3.8b + zip2 v1.8h,v2.8h,v3.8h + +processor CPU64_CRC + + crc32b w1,w2,w3 + + crc32cb w1,w2,w3 + + crc32ch w1,w2,w3 + + crc32cw w1,w2,w3 + + crc32cx w1,w2,x3 + + crc32h w1,w2,w3 + + crc32w w1,w2,w3 + + crc32x w1,w2,x3 + +processor CPU64_CRYPTO + + aesd v1.16b,v2.16b + + aese v1.16b,v2.16b + + aesimc v1.16b,v2.16b + + aesmc v1.16b,v2.16b + + pmull v1.1q,v2.1d,v3.1d + + pmull2 v1.1q,v2.2d,v3.2d + + sha1c q1,s2,v3.4s + + sha1h s1,s2 + + sha1m q1,s2,v3.4s + + sha1p q1,s2,v3.4s + + sha1su0 v1.4s,v2.4s,v3.4s + + sha1su1 v1.4s,v2.4s + + sha256h q1,q2,v3.4s + + sha256h2 q1,q2,v3.4s + + sha256su0 v1.4s,v2.4s + + sha256su1 v1.4s,v2.4s,v3.4s + diff --git a/armdoc/InstructionFormatsFPA.asm b/armdoc/InstructionFormatsFPA.asm new file mode 100644 index 0000000..e2df76c --- /dev/null +++ b/armdoc/InstructionFormatsFPA.asm @@ -0,0 +1,1271 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;To avoid unnecessary repetition only ARM mode is used +;here. There is no change needed for THUMB mode except +;to specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;All instructions can be conditional. The condition code +;should be added at the end of the main opcode and +;before any size/type specifiers. For example: "addhi" +;and "vaddhi.i16". The syntax also supports the pre-UAL +;style of putting the condition before any modifiers +;like "s" or "fd". For example: "ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;FPA, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_FPA_V1 + absd f0,1.0 + absd f0,f1 + + absdm f0,1.0 + absdm f0,f1 + + absdp f0,1.0 + absdp f0,f1 + + absdz f0,1.0 + absdz f0,f1 + + abse f0,1.0 + abse f0,f1 + + absem f0,1.0 + absem f0,f1 + + absep f0,1.0 + absep f0,f1 + + absez f0,1.0 + absez f0,f1 + + abss f0,1.0 + abss f0,f1 + + abssm f0,1.0 + abssm f0,f1 + + abssp f0,1.0 + abssp f0,f1 + + abssz f0,1.0 + abssz f0,f1 + + acsd f0,1.0 + acsd f0,f1 + + acsdm f0,1.0 + acsdm f0,f1 + + acsdp f0,1.0 + acsdp f0,f1 + + acsdz f0,1.0 + acsdz f0,f1 + + acse f0,1.0 + acse f0,f1 + + acsem f0,1.0 + acsem f0,f1 + + acsep f0,1.0 + acsep f0,f1 + + acsez f0,1.0 + acsez f0,f1 + + acss f0,1.0 + acss f0,f1 + + acssm f0,1.0 + acssm f0,f1 + + acssp f0,1.0 + acssp f0,f1 + + acssz f0,1.0 + acssz f0,f1 + + adfd f0,f1,2.0 + adfd f0,f1,f2 + + adfdm f0,f1,2.0 + adfdm f0,f1,f2 + + adfdp f0,f1,2.0 + adfdp f0,f1,f2 + + adfdz f0,f1,2.0 + adfdz f0,f1,f2 + + adfe f0,f1,2.0 + adfe f0,f1,f2 + + adfem f0,f1,2.0 + adfem f0,f1,f2 + + adfep f0,f1,2.0 + adfep f0,f1,f2 + + adfez f0,f1,2.0 + adfez f0,f1,f2 + + adfs f0,f1,2.0 + adfs f0,f1,f2 + + adfsm f0,f1,2.0 + adfsm f0,f1,f2 + + adfsp f0,f1,2.0 + adfsp f0,f1,f2 + + adfsz f0,f1,2.0 + adfsz f0,f1,f2 + + asnd f0,1.0 + asnd f0,f1 + + asndm f0,1.0 + asndm f0,f1 + + asndp f0,1.0 + asndp f0,f1 + + asndz f0,1.0 + asndz f0,f1 + + asne f0,1.0 + asne f0,f1 + + asnem f0,1.0 + asnem f0,f1 + + asnep f0,1.0 + asnep f0,f1 + + asnez f0,1.0 + asnez f0,f1 + + asns f0,1.0 + asns f0,f1 + + asnsm f0,1.0 + asnsm f0,f1 + + asnsp f0,1.0 + asnsp f0,f1 + + asnsz f0,1.0 + asnsz f0,f1 + + atnd f0,1.0 + atnd f0,f1 + + atndm f0,1.0 + atndm f0,f1 + + atndp f0,1.0 + atndp f0,f1 + + atndz f0,1.0 + atndz f0,f1 + + atne f0,1.0 + atne f0,f1 + + atnem f0,1.0 + atnem f0,f1 + + atnep f0,1.0 + atnep f0,f1 + + atnez f0,1.0 + atnez f0,f1 + + atns f0,1.0 + atns f0,f1 + + atnsm f0,1.0 + atnsm f0,f1 + + atnsp f0,1.0 + atnsp f0,f1 + + atnsz f0,1.0 + atnsz f0,f1 + + cmf f0,1.0 + cmf f0,f1 + + cmfe f0,1.0 + cmfe f0,f1 + + cnf f0,1.0 + cnf f0,f1 + + cnfe f0,1.0 + cnfe f0,f1 + + cosd f0,1.0 + cosd f0,f1 + + cosdm f0,1.0 + cosdm f0,f1 + + cosdp f0,1.0 + cosdp f0,f1 + + cosdz f0,1.0 + cosdz f0,f1 + + cose f0,1.0 + cose f0,f1 + + cosem f0,1.0 + cosem f0,f1 + + cosep f0,1.0 + cosep f0,f1 + + cosez f0,1.0 + cosez f0,f1 + + coss f0,1.0 + coss f0,f1 + + cossm f0,1.0 + cossm f0,f1 + + cossp f0,1.0 + cossp f0,f1 + + cossz f0,1.0 + cossz f0,f1 + + dvfd f0,f1,2.0 + dvfd f0,f1,f2 + + dvfdm f0,f1,2.0 + dvfdm f0,f1,f2 + + dvfdp f0,f1,2.0 + dvfdp f0,f1,f2 + + dvfdz f0,f1,2.0 + dvfdz f0,f1,f2 + + dvfe f0,f1,2.0 + dvfe f0,f1,f2 + + dvfem f0,f1,2.0 + dvfem f0,f1,f2 + + dvfep f0,f1,2.0 + dvfep f0,f1,f2 + + dvfez f0,f1,2.0 + dvfez f0,f1,f2 + + dvfs f0,f1,2.0 + dvfs f0,f1,f2 + + dvfsm f0,f1,2.0 + dvfsm f0,f1,f2 + + dvfsp f0,f1,2.0 + dvfsp f0,f1,f2 + + dvfsz f0,f1,2.0 + dvfsz f0,f1,f2 + + expd f0,1.0 + expd f0,f1 + + expdm f0,1.0 + expdm f0,f1 + + expdp f0,1.0 + expdp f0,f1 + + expdz f0,1.0 + expdz f0,f1 + + expe f0,1.0 + expe f0,f1 + + expem f0,1.0 + expem f0,f1 + + expep f0,1.0 + expep f0,f1 + + expez f0,1.0 + expez f0,f1 + + exps f0,1.0 + exps f0,f1 + + expsm f0,1.0 + expsm f0,f1 + + expsp f0,1.0 + expsp f0,f1 + + expsz f0,1.0 + expsz f0,f1 + + fdvd f0,f1,2.0 + fdvd f0,f1,f2 + + fdvdm f0,f1,2.0 + fdvdm f0,f1,f2 + + fdvdp f0,f1,2.0 + fdvdp f0,f1,f2 + + fdvdz f0,f1,2.0 + fdvdz f0,f1,f2 + + fdve f0,f1,2.0 + fdve f0,f1,f2 + + fdvem f0,f1,2.0 + fdvem f0,f1,f2 + + fdvep f0,f1,2.0 + fdvep f0,f1,f2 + + fdvez f0,f1,2.0 + fdvez f0,f1,f2 + + fdvs f0,f1,2.0 + fdvs f0,f1,f2 + + fdvsm f0,f1,2.0 + fdvsm f0,f1,f2 + + fdvsp f0,f1,2.0 + fdvsp f0,f1,f2 + + fdvsz f0,f1,2.0 + fdvsz f0,f1,f2 + + fix r0,f1 + + fixm r0,f1 + + fixp r0,f1 + + fixz r0,f1 + + fltd f0,r1 + + fltdm f0,r1 + + fltdp f0,r1 + + fltdz f0,r1 + + flte f0,r1 + + fltem f0,r1 + + fltep f0,r1 + + fltez f0,r1 + + flts f0,r1 + + fltsm f0,r1 + + fltsp f0,r1 + + fltsz f0,r1 + + fmld f0,f1,2.0 + fmld f0,f1,f2 + + fmldm f0,f1,2.0 + fmldm f0,f1,f2 + + fmldp f0,f1,2.0 + fmldp f0,f1,f2 + + fmldz f0,f1,2.0 + fmldz f0,f1,f2 + + fmle f0,f1,2.0 + fmle f0,f1,f2 + + fmlem f0,f1,2.0 + fmlem f0,f1,f2 + + fmlep f0,f1,2.0 + fmlep f0,f1,f2 + + fmlez f0,f1,2.0 + fmlez f0,f1,f2 + + fmls f0,f1,2.0 + fmls f0,f1,f2 + + fmlsm f0,f1,2.0 + fmlsm f0,f1,f2 + + fmlsp f0,f1,2.0 + fmlsp f0,f1,f2 + + fmlsz f0,f1,2.0 + fmlsz f0,f1,f2 + + frdd f0,f1,2.0 + frdd f0,f1,f2 + + frddm f0,f1,2.0 + frddm f0,f1,f2 + + frddp f0,f1,2.0 + frddp f0,f1,f2 + + frddz f0,f1,2.0 + frddz f0,f1,f2 + + frde f0,f1,2.0 + frde f0,f1,f2 + + frdem f0,f1,2.0 + frdem f0,f1,f2 + + frdep f0,f1,2.0 + frdep f0,f1,f2 + + frdez f0,f1,2.0 + frdez f0,f1,f2 + + frds f0,f1,2.0 + frds f0,f1,f2 + + frdsm f0,f1,2.0 + frdsm f0,f1,f2 + + frdsp f0,f1,2.0 + frdsp f0,f1,f2 + + frdsz f0,f1,2.0 + frdsz f0,f1,f2 + + label_ldfd: + ldfd f0,[r1] + ldfd f0,[r1],4 + ldfd f0,[r1],{2} + ldfd f0,[r1,4] + ldfd f0,[r1,4]! + ldfd f0,[label_ldfd] + ldfd f0,[expression.word] + ldfd f0,[expression.word]! + + label_ldfe: + ldfe f0,[r1] + ldfe f0,[r1],4 + ldfe f0,[r1],{2} + ldfe f0,[r1,4] + ldfe f0,[r1,4]! + ldfe f0,[label_ldfe] + ldfe f0,[expression.word] + ldfe f0,[expression.word]! + + label_ldfp: + ldfp f0,[r1] + ldfp f0,[r1],4 + ldfp f0,[r1],{2} + ldfp f0,[r1,4] + ldfp f0,[r1,4]! + ldfp f0,[label_ldfp] + ldfp f0,[expression.word] + ldfp f0,[expression.word]! + + label_ldfs: + ldfs f0,[r1] + ldfs f0,[r1],4 + ldfs f0,[r1],{2} + ldfs f0,[r1,4] + ldfs f0,[r1,4]! + ldfs f0,[label_ldfs] + ldfs f0,[expression.word] + ldfs f0,[expression.word]! + + lgnd f0,1.0 + lgnd f0,f1 + + lgndm f0,1.0 + lgndm f0,f1 + + lgndp f0,1.0 + lgndp f0,f1 + + lgndz f0,1.0 + lgndz f0,f1 + + lgne f0,1.0 + lgne f0,f1 + + lgnem f0,1.0 + lgnem f0,f1 + + lgnep f0,1.0 + lgnep f0,f1 + + lgnez f0,1.0 + lgnez f0,f1 + + lgns f0,1.0 + lgns f0,f1 + + lgnsm f0,1.0 + lgnsm f0,f1 + + lgnsp f0,1.0 + lgnsp f0,f1 + + lgnsz f0,1.0 + lgnsz f0,f1 + + logd f0,1.0 + logd f0,f1 + + logdm f0,1.0 + logdm f0,f1 + + logdp f0,1.0 + logdp f0,f1 + + logdz f0,1.0 + logdz f0,f1 + + loge f0,1.0 + loge f0,f1 + + logem f0,1.0 + logem f0,f1 + + logep f0,1.0 + logep f0,f1 + + logez f0,1.0 + logez f0,f1 + + logs f0,1.0 + logs f0,f1 + + logsm f0,1.0 + logsm f0,f1 + + logsp f0,1.0 + logsp f0,f1 + + logsz f0,1.0 + logsz f0,f1 + + mnfd f0,1.0 + mnfd f0,f1 + + mnfdm f0,1.0 + mnfdm f0,f1 + + mnfdp f0,1.0 + mnfdp f0,f1 + + mnfdz f0,1.0 + mnfdz f0,f1 + + mnfe f0,1.0 + mnfe f0,f1 + + mnfem f0,1.0 + mnfem f0,f1 + + mnfep f0,1.0 + mnfep f0,f1 + + mnfez f0,1.0 + mnfez f0,f1 + + mnfs f0,1.0 + mnfs f0,f1 + + mnfsm f0,1.0 + mnfsm f0,f1 + + mnfsp f0,1.0 + mnfsp f0,f1 + + mnfsz f0,1.0 + mnfsz f0,f1 + + mufd f0,f1,2.0 + mufd f0,f1,f2 + + mufdm f0,f1,2.0 + mufdm f0,f1,f2 + + mufdp f0,f1,2.0 + mufdp f0,f1,f2 + + mufdz f0,f1,2.0 + mufdz f0,f1,f2 + + mufe f0,f1,2.0 + mufe f0,f1,f2 + + mufem f0,f1,2.0 + mufem f0,f1,f2 + + mufep f0,f1,2.0 + mufep f0,f1,f2 + + mufez f0,f1,2.0 + mufez f0,f1,f2 + + mufs f0,f1,2.0 + mufs f0,f1,f2 + + mufsm f0,f1,2.0 + mufsm f0,f1,f2 + + mufsp f0,f1,2.0 + mufsp f0,f1,f2 + + mufsz f0,f1,2.0 + mufsz f0,f1,f2 + + mvfd f0,1.0 + mvfd f0,f1 + + mvfdm f0,1.0 + mvfdm f0,f1 + + mvfdp f0,1.0 + mvfdp f0,f1 + + mvfdz f0,1.0 + mvfdz f0,f1 + + mvfe f0,1.0 + mvfe f0,f1 + + mvfem f0,1.0 + mvfem f0,f1 + + mvfep f0,1.0 + mvfep f0,f1 + + mvfez f0,1.0 + mvfez f0,f1 + + mvfs f0,1.0 + mvfs f0,f1 + + mvfsm f0,1.0 + mvfsm f0,f1 + + mvfsp f0,1.0 + mvfsp f0,f1 + + mvfsz f0,1.0 + mvfsz f0,f1 + + nrmd f0,1.0 + nrmd f0,f1 + + nrmdm f0,1.0 + nrmdm f0,f1 + + nrmdp f0,1.0 + nrmdp f0,f1 + + nrmdz f0,1.0 + nrmdz f0,f1 + + nrme f0,1.0 + nrme f0,f1 + + nrmem f0,1.0 + nrmem f0,f1 + + nrmep f0,1.0 + nrmep f0,f1 + + nrmez f0,1.0 + nrmez f0,f1 + + nrms f0,1.0 + nrms f0,f1 + + nrmsm f0,1.0 + nrmsm f0,f1 + + nrmsp f0,1.0 + nrmsp f0,f1 + + nrmsz f0,1.0 + nrmsz f0,f1 + + pold f0,f1,2.0 + pold f0,f1,f2 + + poldm f0,f1,2.0 + poldm f0,f1,f2 + + poldp f0,f1,2.0 + poldp f0,f1,f2 + + poldz f0,f1,2.0 + poldz f0,f1,f2 + + pole f0,f1,2.0 + pole f0,f1,f2 + + polem f0,f1,2.0 + polem f0,f1,f2 + + polep f0,f1,2.0 + polep f0,f1,f2 + + polez f0,f1,2.0 + polez f0,f1,f2 + + pols f0,f1,2.0 + pols f0,f1,f2 + + polsm f0,f1,2.0 + polsm f0,f1,f2 + + polsp f0,f1,2.0 + polsp f0,f1,f2 + + polsz f0,f1,2.0 + polsz f0,f1,f2 + + powd f0,f1,2.0 + powd f0,f1,f2 + + powdm f0,f1,2.0 + powdm f0,f1,f2 + + powdp f0,f1,2.0 + powdp f0,f1,f2 + + powdz f0,f1,2.0 + powdz f0,f1,f2 + + powe f0,f1,2.0 + powe f0,f1,f2 + + powem f0,f1,2.0 + powem f0,f1,f2 + + powep f0,f1,2.0 + powep f0,f1,f2 + + powez f0,f1,2.0 + powez f0,f1,f2 + + pows f0,f1,2.0 + pows f0,f1,f2 + + powsm f0,f1,2.0 + powsm f0,f1,f2 + + powsp f0,f1,2.0 + powsp f0,f1,f2 + + powsz f0,f1,2.0 + powsz f0,f1,f2 + + rdfd f0,f1,2.0 + rdfd f0,f1,f2 + + rdfdm f0,f1,2.0 + rdfdm f0,f1,f2 + + rdfdp f0,f1,2.0 + rdfdp f0,f1,f2 + + rdfdz f0,f1,2.0 + rdfdz f0,f1,f2 + + rdfe f0,f1,2.0 + rdfe f0,f1,f2 + + rdfem f0,f1,2.0 + rdfem f0,f1,f2 + + rdfep f0,f1,2.0 + rdfep f0,f1,f2 + + rdfez f0,f1,2.0 + rdfez f0,f1,f2 + + rdfs f0,f1,2.0 + rdfs f0,f1,f2 + + rdfsm f0,f1,2.0 + rdfsm f0,f1,f2 + + rdfsp f0,f1,2.0 + rdfsp f0,f1,f2 + + rdfsz f0,f1,2.0 + rdfsz f0,f1,f2 + + rfc r0 + + rfs r0 + + rmfd f0,f1,2.0 + rmfd f0,f1,f2 + + rmfdm f0,f1,2.0 + rmfdm f0,f1,f2 + + rmfdp f0,f1,2.0 + rmfdp f0,f1,f2 + + rmfdz f0,f1,2.0 + rmfdz f0,f1,f2 + + rmfe f0,f1,2.0 + rmfe f0,f1,f2 + + rmfem f0,f1,2.0 + rmfem f0,f1,f2 + + rmfep f0,f1,2.0 + rmfep f0,f1,f2 + + rmfez f0,f1,2.0 + rmfez f0,f1,f2 + + rmfs f0,f1,2.0 + rmfs f0,f1,f2 + + rmfsm f0,f1,2.0 + rmfsm f0,f1,f2 + + rmfsp f0,f1,2.0 + rmfsp f0,f1,f2 + + rmfsz f0,f1,2.0 + rmfsz f0,f1,f2 + + rndd f0,1.0 + rndd f0,f1 + + rnddm f0,1.0 + rnddm f0,f1 + + rnddp f0,1.0 + rnddp f0,f1 + + rnddz f0,1.0 + rnddz f0,f1 + + rnde f0,1.0 + rnde f0,f1 + + rndem f0,1.0 + rndem f0,f1 + + rndep f0,1.0 + rndep f0,f1 + + rndez f0,1.0 + rndez f0,f1 + + rnds f0,1.0 + rnds f0,f1 + + rndsm f0,1.0 + rndsm f0,f1 + + rndsp f0,1.0 + rndsp f0,f1 + + rndsz f0,1.0 + rndsz f0,f1 + + rpwd f0,f1,2.0 + rpwd f0,f1,f2 + + rpwdm f0,f1,2.0 + rpwdm f0,f1,f2 + + rpwdp f0,f1,2.0 + rpwdp f0,f1,f2 + + rpwdz f0,f1,2.0 + rpwdz f0,f1,f2 + + rpwe f0,f1,2.0 + rpwe f0,f1,f2 + + rpwem f0,f1,2.0 + rpwem f0,f1,f2 + + rpwep f0,f1,2.0 + rpwep f0,f1,f2 + + rpwez f0,f1,2.0 + rpwez f0,f1,f2 + + rpws f0,f1,2.0 + rpws f0,f1,f2 + + rpwsm f0,f1,2.0 + rpwsm f0,f1,f2 + + rpwsp f0,f1,2.0 + rpwsp f0,f1,f2 + + rpwsz f0,f1,2.0 + rpwsz f0,f1,f2 + + rsfd f0,f1,2.0 + rsfd f0,f1,f2 + + rsfdm f0,f1,2.0 + rsfdm f0,f1,f2 + + rsfdp f0,f1,2.0 + rsfdp f0,f1,f2 + + rsfdz f0,f1,2.0 + rsfdz f0,f1,f2 + + rsfe f0,f1,2.0 + rsfe f0,f1,f2 + + rsfem f0,f1,2.0 + rsfem f0,f1,f2 + + rsfep f0,f1,2.0 + rsfep f0,f1,f2 + + rsfez f0,f1,2.0 + rsfez f0,f1,f2 + + rsfs f0,f1,2.0 + rsfs f0,f1,f2 + + rsfsm f0,f1,2.0 + rsfsm f0,f1,f2 + + rsfsp f0,f1,2.0 + rsfsp f0,f1,f2 + + rsfsz f0,f1,2.0 + rsfsz f0,f1,f2 + + sind f0,1.0 + sind f0,f1 + + sindm f0,1.0 + sindm f0,f1 + + sindp f0,1.0 + sindp f0,f1 + + sindz f0,1.0 + sindz f0,f1 + + sine f0,1.0 + sine f0,f1 + + sinem f0,1.0 + sinem f0,f1 + + sinep f0,1.0 + sinep f0,f1 + + sinez f0,1.0 + sinez f0,f1 + + sins f0,1.0 + sins f0,f1 + + sinsm f0,1.0 + sinsm f0,f1 + + sinsp f0,1.0 + sinsp f0,f1 + + sinsz f0,1.0 + sinsz f0,f1 + + sqtd f0,1.0 + sqtd f0,f1 + + sqtdm f0,1.0 + sqtdm f0,f1 + + sqtdp f0,1.0 + sqtdp f0,f1 + + sqtdz f0,1.0 + sqtdz f0,f1 + + sqte f0,1.0 + sqte f0,f1 + + sqtem f0,1.0 + sqtem f0,f1 + + sqtep f0,1.0 + sqtep f0,f1 + + sqtez f0,1.0 + sqtez f0,f1 + + sqts f0,1.0 + sqts f0,f1 + + sqtsm f0,1.0 + sqtsm f0,f1 + + sqtsp f0,1.0 + sqtsp f0,f1 + + sqtsz f0,1.0 + sqtsz f0,f1 + + label_stfd: + stfd f0,[r1] + stfd f0,[r1],4 + stfd f0,[r1],{2} + stfd f0,[r1,4] + stfd f0,[r1,4]! + stfd f0,[label_stfd] + stfd f0,[expression.word] + stfd f0,[expression.word]! + + label_stfe: + stfe f0,[r1] + stfe f0,[r1],4 + stfe f0,[r1],{2} + stfe f0,[r1,4] + stfe f0,[r1,4]! + stfe f0,[label_stfe] + stfe f0,[expression.word] + stfe f0,[expression.word]! + + label_stfp: + stfp f0,[r1] + stfp f0,[r1],4 + stfp f0,[r1],{2} + stfp f0,[r1,4] + stfp f0,[r1,4]! + stfp f0,[label_stfp] + stfp f0,[expression.word] + stfp f0,[expression.word]! + + label_stfs: + stfs f0,[r1] + stfs f0,[r1],4 + stfs f0,[r1],{2} + stfs f0,[r1,4] + stfs f0,[r1,4]! + stfs f0,[label_stfs] + stfs f0,[expression.word] + stfs f0,[expression.word]! + + sufd f0,f1,2.0 + sufd f0,f1,f2 + + sufdm f0,f1,2.0 + sufdm f0,f1,f2 + + sufdp f0,f1,2.0 + sufdp f0,f1,f2 + + sufdz f0,f1,2.0 + sufdz f0,f1,f2 + + sufe f0,f1,2.0 + sufe f0,f1,f2 + + sufem f0,f1,2.0 + sufem f0,f1,f2 + + sufep f0,f1,2.0 + sufep f0,f1,f2 + + sufez f0,f1,2.0 + sufez f0,f1,f2 + + sufs f0,f1,2.0 + sufs f0,f1,f2 + + sufsm f0,f1,2.0 + sufsm f0,f1,f2 + + sufsp f0,f1,2.0 + sufsp f0,f1,f2 + + sufsz f0,f1,2.0 + sufsz f0,f1,f2 + + tand f0,1.0 + tand f0,f1 + + tandm f0,1.0 + tandm f0,f1 + + tandp f0,1.0 + tandp f0,f1 + + tandz f0,1.0 + tandz f0,f1 + + tane f0,1.0 + tane f0,f1 + + tanem f0,1.0 + tanem f0,f1 + + tanep f0,1.0 + tanep f0,f1 + + tanez f0,1.0 + tanez f0,f1 + + tans f0,1.0 + tans f0,f1 + + tansm f0,1.0 + tansm f0,f1 + + tansp f0,1.0 + tansp f0,f1 + + tansz f0,1.0 + tansz f0,f1 + + urdd f0,1.0 + urdd f0,f1 + + urddm f0,1.0 + urddm f0,f1 + + urddp f0,1.0 + urddp f0,f1 + + urddz f0,1.0 + urddz f0,f1 + + urde f0,1.0 + urde f0,f1 + + urdem f0,1.0 + urdem f0,f1 + + urdep f0,1.0 + urdep f0,f1 + + urdez f0,1.0 + urdez f0,f1 + + urds f0,1.0 + urds f0,f1 + + urdsm f0,1.0 + urdsm f0,f1 + + urdsp f0,1.0 + urdsp f0,f1 + + urdsz f0,1.0 + urdsz f0,f1 + + wfc r0 + + wfs r0 + +coprocessor COPRO_FPA_V2 + + label_lfm: + lfm f0,1,[r2] + lfm f0,1,[r2],4 + lfm f0,1,[r2],{4} + lfm f0,1,[r2,4] + lfm f0,1,[r2,4]! + lfm f0,1,[label_lfm] + lfm f0,1,[expression.word] + lfm f0,1,[expression.word]! + + lfmea f0,1,[r2] + lfmea f0,1,[r2]! + + lfmfd f0,1,[r2] + lfmfd f0,1,[r2]! + + label_sfm: + sfm f0,1,[r2] + sfm f0,1,[r2],4 + sfm f0,1,[r2],{4} + sfm f0,1,[r2,4] + sfm f0,1,[r2,4]! + sfm f0,1,[label_sfm] + sfm f0,1,[expression.word] + sfm f0,1,[expression.word]! + + sfmea f0,1,[r2] + sfmea f0,1,[r2]! + + sfmfd f0,1,[r2] + sfmfd f0,1,[r2]! diff --git a/armdoc/InstructionFormatsIWMMXT.asm b/armdoc/InstructionFormatsIWMMXT.asm new file mode 100644 index 0000000..b407b82 --- /dev/null +++ b/armdoc/InstructionFormatsIWMMXT.asm @@ -0,0 +1,630 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;To avoid unnecessary repetition only ARM mode is used +;here. There is no change needed for THUMB mode except +;to specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;Almost all instructions can be conditional. The +;condition code should be added at the end of the main +;opcode and before any size/type specifiers. For +;example: "addhi" and "vaddhi.i16". The syntax also +;supports the pre-UAL style of putting the condition +;before any modifiers like "s" or "fd". For example: +;"ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;IWMMXT, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_IWMMXT_V1 + + tandcb r15 + + tandch r15 + + tandcw r15 + + tbcstb wr0,r1 + + tbcsth wr0,r1 + + tbcstw wr0,r1 + + textrcb r15,4 + + textrch r15,2 + + textrcw r15,1 + + textrmsb r0,wr1,2 + + textrmsh r0,wr1,2 + + textrmsw r0,wr1,2 + + textrmub r0,wr1,2 + + textrmuh r0,wr1,2 + + textrmuw r0,wr1,2 + + tinsrb wr0,r1,2 + + tinsrh wr0,r1,2 + + tinsrw wr0,r1,2 + + tmcr wcgr0,r1 + + tmcrr wr0,r1,r2 + + tmia wr0,r1,r2 + + tmiabb wr0,r1,r2 + + tmiabt wr0,r1,r2 + + tmiaph wr0,r1,r2 + + tmiatb wr0,r1,r2 + + tmiatt wr0,r1,r2 + + tmovmskb r0,wr1 + + tmovmskh r0,wr1 + + tmovmskw r0,wr1 + + tmrc r0,wcgr1 + + tmrrc r0,r1,wr2 + + torcb r15 + + torch r15 + + torcw r15 + + waccb wr0,wr1 + + wacch wr0,wr1 + + waccw wr0,wr1 + + waddb wr0,wr1,wr2 + + waddbss wr0,wr1,wr2 + + waddbus wr0,wr1,wr2 + + waddh wr0,wr1,wr2 + + waddhss wr0,wr1,wr2 + + waddhus wr0,wr1,wr2 + + waddw wr0,wr1,wr2 + + waddwss wr0,wr1,wr2 + + waddwus wr0,wr1,wr2 + + waligni wr0,wr1,wr2,3 + + walignr0 wr1,wr1,wr2 + + walignr1 wr1,wr1,wr2 + + walignr2 wr1,wr1,wr2 + + walignr3 wr1,wr1,wr2 + + wand wr0,wr1,wr2 + + wandn wr0,wr1,wr2 + + wavg2b wr0,wr1,wr2 + + wavg2br wr0,wr1,wr2 + + wavg2h wr0,wr1,wr2 + + wavg2hr wr0,wr1,wr2 + + wcmpeqb wr0,wr1,wr2 + + wcmpeqh wr0,wr1,wr2 + + wcmpeqw wr0,wr1,wr2 + + wcmpgtsb wr1,wr1,wr2 + + wcmpgtsh wr1,wr1,wr2 + + wcmpgtsw wr1,wr1,wr2 + + wcmpgtub wr1,wr1,wr2 + + wcmpgtuh wr1,wr1,wr2 + + wcmpgtuw wr1,wr1,wr2 + + label_wldrb: + wldrb wr0,[r1] + wldrb wr0,[r1],4 + wldrb wr0,[r1],{4} + wldrb wr0,[r1,4] + wldrb wr0,[r1,4]! + wldrb wr0,[label_wldrb] + wldrb wr0,[expression.byte] + wldrb wr0,[expression.byte]! + + label_wldrd: + wldrd wr0,[r1] + wldrd wr0,[r1],4 + wldrd wr0,[r1],{4} + wldrd wr0,[r1,4] + wldrd wr0,[r1,4]! + wldrd wr0,[label_wldrd] + wldrd wr0,[expression.dword] + wldrd wr0,[expression.dword]! + + label_wldrh: + wldrh wr0,[r1] + wldrh wr0,[r1],4 + wldrh wr0,[r1],{4} + wldrh wr0,[r1,4] + wldrh wr0,[r1,4]! + wldrh wr0,[label_wldrh] + wldrh wr0,[expression.hword] + wldrh wr0,[expression.hword]! + + label_wldrw: + wldrw wr0,[r1] + wldrw wr0,[r1],4 + wldrw wr0,[r1],{4} + wldrw wr0,[r1,4] + wldrw wr0,[r1,4]! + wldrw wr0,[label_wldrw] + wldrw wr0,[expression.word] + wldrw wr0,[expression.word]! + wldrw wcgr0,[r1] + wldrw wcgr0,[r1],4 + wldrw wcgr0,[r1],{4} + wldrw wcgr0,[r1,4] + wldrw wcgr0,[r1,4]! + wldrw wcgr0,[label_wldrw] + wldrw wcgr0,[expression.word] + wldrw wcgr0,[expression.word]! + + wmacs wr0,wr1,wr2 + + wmacsz wr0,wr1,wr2 + + wmacu wr0,wr1,wr2 + + wmacuz wr0,wr1,wr2 + + wmadds wr0,wr1,wr2 + + wmaddu wr0,wr1,wr2 + + wmaxsb wr0,wr1,wr2 + + wmaxsh wr0,wr1,wr2 + + wmaxsw wr0,wr1,wr2 + + wmaxub wr0,wr1,wr2 + + wmaxuh wr0,wr1,wr2 + + wmaxuw wr0,wr1,wr2 + + wminsb wr0,wr1,wr2 + + wminsh wr0,wr1,wr2 + + wminsw wr0,wr1,wr2 + + wminub wr0,wr1,wr2 + + wminuh wr0,wr1,wr2 + + wminuw wr0,wr1,wr2 + + wmov wr0,wr1 + + wmulsl wr0,wr1,wr2 + + wmulsm wr0,wr1,wr2 + + wmulul wr0,wr1,wr2 + + wmulum wr0,wr1,wr2 + + wor wr0,wr1,wr2 + + wpackdss wr1,wr1,wr2 + + wpackdus wr1,wr1,wr2 + + wpackhss wr1,wr1,wr2 + + wpackhus wr1,wr1,wr2 + + wpackwss wr1,wr1,wr2 + + wpackwus wr1,wr1,wr2 + + wrord wr0,wr1,wr2 + + wrordg wr0,wr1,wcgr2 + + wrorh wr0,wr1,wr2 + + wrorhg wr0,wr1,wcgr2 + + wrorw wr0,wr1,wr2 + + wrorwg wr0,wr1,wcgr2 + + wsadb wr0,wr1,wr2 + + wsadbz wr0,wr1,wr2 + + wsadh wr0,wr1,wr2 + + wsadhz wr0,wr1,wr2 + + wshufh wr0,wr1,2 + + wshufh wr0,wr1,2 + + wslld wr0,wr1,wr2 + + wslldg wr0,wr1,wcgr2 + + wsllh wr0,wr1,wr2 + + wsllhg wr0,wr1,wcgr2 + + wsllw wr0,wr1,wr2 + + wsllwg wr0,wr1,wcgr2 + + wsrad wr0,wr1,wr2 + + wsradg wr0,wr1,wcgr2 + + wsrah wr0,wr1,wr2 + + wsrahg wr0,wr1,wcgr2 + + wsraw wr0,wr1,wr2 + + wsrawg wr0,wr1,wcgr2 + + wsrld wr0,wr1,wr2 + + wsrldg wr0,wr1,wcgr2 + + wsrlh wr0,wr1,wr2 + + wsrlhg wr0,wr1,wcgr2 + + wsrlw wr0,wr1,wr2 + + wsrlwg wr0,wr1,wcgr2 + + label_wstrb: + wstrb wr0,[r1] + wstrb wr0,[r1],4 + wstrb wr0,[r1],{4} + wstrb wr0,[r1,4] + wstrb wr0,[r1,4]! + wstrb wr0,[label_wstrb] + wstrb wr0,[expression.byte] + wstrb wr0,[expression.byte]! + + label_wstrd: + wstrd wr0,[r1] + wstrd wr0,[r1],4 + wstrd wr0,[r1],{4} + wstrd wr0,[r1,4] + wstrd wr0,[r1,4]! + wstrd wr0,[label_wstrd] + wstrd wr0,[expression.dword] + wstrd wr0,[expression.dword]! + + label_wstrh: + wstrh wr0,[r1] + wstrh wr0,[r1],4 + wstrh wr0,[r1],{4} + wstrh wr0,[r1,4] + wstrh wr0,[r1,4]! + wstrh wr0,[label_wstrh] + wstrh wr0,[expression.hword] + wstrh wr0,[expression.hword]! + + label_wstrw: + wstrw wr0,[r1] + wstrw wr0,[r1],4 + wstrw wr0,[r1],{4} + wstrw wr0,[r1,4] + wstrw wr0,[r1,4]! + wstrw wr0,[label_wstrw] + wstrw wr0,[expression.word] + wstrw wr0,[expression.word]! + wstrw wcgr0,[r1] + wstrw wcgr0,[r1],4 + wstrw wcgr0,[r1],{4} + wstrw wcgr0,[r1,4] + wstrw wcgr0,[r1,4]! + wstrw wcgr0,[label_wstrw] + wstrw wcgr0,[expression.word] + wstrw wcgr0,[expression.word]! + + wsubb wr0,wr1,wr2 + + wsubbss wr0,wr1,wr2 + + wsubbus wr0,wr1,wr2 + + wsubh wr0,wr1,wr2 + + wsubhss wr0,wr1,wr2 + + wsubhus wr0,wr1,wr2 + + wsubw wr0,wr1,wr2 + + wsubwss wr0,wr1,wr2 + + wsubwus wr0,wr1,wr2 + + wunpckehsb wr0,wr1 + + wunpckehsh wr0,wr1 + + wunpckehsw wr0,wr1 + + wunpckehub wr0,wr1 + + wunpckehuh wr0,wr1 + + wunpckehuw wr0,wr1 + + wunpckelsb wr0,wr1 + + wunpckelsh wr0,wr1 + + wunpckelsw wr0,wr1 + + wunpckelub wr0,wr1 + + wunpckeluh wr0,wr1 + + wunpckeluw wr0,wr1 + + wunpckihb wr0,wr1,wr2 + + wunpckihh wr0,wr1,wr2 + + wunpckihw wr0,wr1,wr2 + + wunpckilb wr0,wr1,wr2 + + wunpckilh wr0,wr1,wr2 + + wunpckilw wr0,wr1,wr2 + + wxor wr0,wr1,wr2 + + wzero wr0 + +coprocessor COPRO_IWMMXT_V2 + torvscb r15 + + torvsch r15 + + torvscw r15 + + wabsb wr0,wr1 + + wabsdiffb wr0,wr1,wr2 + + wabsdiffh wr0,wr1,wr2 + + wabsdiffw wr0,wr1,wr2 + + wabsh wr0,wr1 + + wabsw wr0,wr1 + + waddhc wr0,wr1,wr2 + + waddsubhx wr0,wr1,wr2 + + waddwc wr0,wr1,wr2 + + wavg4 wr0,wr1,wr2 + + wavg4r wr0,wr1,wr2 + + wldrd wr0,[r1],r2 + wldrd wr0,[r1],-r2 + wldrd wr0,[r1],r2,lsl 2 + wldrd wr0,[r1],-r2,lsl 2 + wldrd wr0,[r1,r2] + wldrd wr0,[r1,-r2] + wldrd wr0,[r1,r2]! + wldrd wr0,[r1,-r2]! + wldrd wr0,[r1,r2,lsl 2] + wldrd wr0,[r1,-r2,lsl 2] + wldrd wr0,[r1,r2,lsl 2]! + wldrd wr0,[r1,-r2,lsl 2]! + + wmaddsn wr0,wr1,wr2 + + wmaddsx wr0,wr1,wr2 + + wmaddun wr0,wr1,wr2 + + wmaddux wr0,wr1,wr2 + + wmerge wr0,wr1,wr2,3 + + wmiabb wr0,wr1,wr2 + + wmiabbn wr0,wr1,wr2 + + wmiabt wr0,wr1,wr2 + + wmiabtn wr0,wr1,wr2 + + wmiatb wr0,wr1,wr2 + + wmiatbn wr0,wr1,wr2 + + wmiatt wr0,wr1,wr2 + + wmiattn wr0,wr1,wr2 + + wmiawbb wr0,wr1,wr2 + + wmiawbbn wr0,wr1,wr2 + + wmiawbt wr0,wr1,wr2 + + wmiawbtn wr0,wr1,wr2 + + wmiawtb wr0,wr1,wr2 + + wmiawtbn wr0,wr1,wr2 + + wmiawtt wr0,wr1,wr2 + + wmiawttn wr0,wr1,wr2 + + wmulsmr wr0,wr1,wr2 + + wmulumr wr0,wr1,wr2 + + wmulwl wr0,wr1,wr2 + + wmulwsm wr0,wr1,wr2 + + wmulwsmr wr0,wr1,wr2 + + wmulwum wr0,wr1,wr2 + + wmulwumr wr0,wr1,wr2 + + wqmiabb wr0,wr1,wr2 + + wqmiabbn wr0,wr1,wr2 + + wqmiabt wr0,wr1,wr2 + + wqmiabtn wr0,wr1,wr2 + + wqmiatb wr0,wr1,wr2 + + wqmiatbn wr0,wr1,wr2 + + wqmiatt wr0,wr1,wr2 + + wqmiattn wr0,wr1,wr2 + + wqmulm wr0,wr1,wr2 + + wqmulmr wr0,wr1,wr2 + + wqmulwm wr0,wr1,wr2 + + wqmulwmr wr0,wr1,wr2 + + wrord wr0,wr1,2 + + wrorh wr0,wr1,2 + + wrorw wr0,wr1,2 + + wslld wr0,wr1,2 + + wsllh wr0,wr1,2 + + wsllw wr0,wr1,2 + + wsrad wr0,wr1,2 + + wsrah wr0,wr1,2 + + wsraw wr0,wr1,2 + + wsrld wr0,wr1,2 + + wsrlh wr0,wr1,2 + + wsrlw wr0,wr1,2 + + wstrd wr0,[r1],r2 + wstrd wr0,[r1],-r2 + wstrd wr0,[r1],r2,lsl 2 + wstrd wr0,[r1],-r2,lsl 2 + wstrd wr0,[r1,r2] + wstrd wr0,[r1,-r2] + wstrd wr0,[r1,r2]! + wstrd wr0,[r1,-r2]! + wstrd wr0,[r1,r2,lsl 2] + wstrd wr0,[r1,-r2,lsl 2] + wstrd wr0,[r1,r2,lsl 2]! + wstrd wr0,[r1,-r2,lsl 2]! + + wsubaddhx wr0,wr1,wr2 diff --git a/armdoc/InstructionFormatsMAVERICK.asm b/armdoc/InstructionFormatsMAVERICK.asm new file mode 100644 index 0000000..e82b768 --- /dev/null +++ b/armdoc/InstructionFormatsMAVERICK.asm @@ -0,0 +1,278 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;To avoid unnecessary repetition only ARM mode is used +;here. There is no change needed for THUMB mode except +;to specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;All instructions can be conditional. The condition code +;should be added at the end of the main opcode and +;before any size/type specifiers. For example: "addhi" +;and "vaddhi.i16". The syntax also supports the pre-UAL +;style of putting the condition before any modifiers +;like "s" or "fd". For example: "ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;MAVERICK, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_MAVERICK + + cfabs32 c0,c1 + + cfabs64 c0,c1 + + cfabsd c0,c1 + + cfabss c0,c1 + + cfadd32 c0,c1,c2 + + cfadd64 c0,c1,c2 + + cfaddd c0,c1,c2 + + cfadds c0,c1,c2 + + cfcmp32 r1,c1,c2 + + cfcmp64 r1,c1,c2 + + cfcmpd r1,c1,c2 + + cfcmps r1,c1,c2 + + cfcpyd c0,c1 + + cfcpys c0,c1 + + cfcvt32d c0,c1 + + cfcvt32s c0,c1 + + cfcvt64d c0,c1 + + cfcvt64s c0,c1 + + cfcvtd32 c0,c1 + + cfcvtds c0,c1 + + cfcvts32 c0,c1 + + cfcvtsd c0,c1 + + label_cfldr32: + cfldr32 c0,[r1] + cfldr32 c0,[r1],4 + cfldr32 c0,[r1],{4} + cfldr32 c0,[r1,4] + cfldr32 c0,[r1,4]! + cfldr32 c0,[label_cfldr32] + cfldr32 c0,[expression.word] + cfldr32 c0,[expression.word]! + + label_cfldr64: + cfldr64 c0,[r1] + cfldr64 c0,[r1],4 + cfldr64 c0,[r1],{4} + cfldr64 c0,[r1,4] + cfldr64 c0,[r1,4]! + cfldr64 c0,[label_cfldr64] + cfldr64 c0,[expression.word] + cfldr64 c0,[expression.word]! + + label_cfldrd: + cfldrd c0,[r1] + cfldrd c0,[r1],4 + cfldrd c0,[r1],{4} + cfldrd c0,[r1,4] + cfldrd c0,[r1,4]! + cfldrd c0,[label_cfldrd] + cfldrd c0,[expression.word] + cfldrd c0,[expression.word]! + + label_cfldrs: + cfldrs c0,[r1] + cfldrs c0,[r1],4 + cfldrs c0,[r1],{4} + cfldrs c0,[r1,4] + cfldrs c0,[r1,4]! + cfldrs c0,[label_cfldrs] + cfldrs c0,[expression.word] + cfldrs c0,[expression.word]! + + cfmac32 c0,c1,c2 + + cfmadd32 a0,c1,c2,c3 + + cfmadda32 a0,a1,c2,c4 + + cfmsc32 c0,c1,c2 + + cfmsub32 a0,c1,c2,c4 + + cfmsuba32 a0,a1,c2,c4 + + cfmul32 c0,c1,c2 + + cfmul64 c0,c1,c2 + + cfmuld c0,c1,c2 + + cfmuls c0,c1,c2 + + cfmv32a c0,a1 + + cfmv32ah c0,a1 + + cfmv32al c0,a1 + + cfmv32am c0,a1 + + cfmv32sc c0,dspsc + + cfmv64a c0,a1 + + cfmv64hr c0,r1 + + cfmv64lr c0,r1 + + cfmva32 a0,c1 + + cfmva64 a0,c1 + + cfmvah32 a0,c1 + + cfmval32 a0,c1 + + cfmvam32 a0,c1 + + cfmvdhr c0,r1 + + cfmvdlr c0,r1 + + cfmvr64h r1,c1 + + cfmvr64l r1,c1 + + cfmvrdh r1,c1 + + cfmvrdl r1,c1 + + cfmvrs r1,c1 + + cfmvsc32 dspsc,c0 + + cfmvsr c0,r1 + + cfneg32 c0,c1 + + cfneg64 c0,c1 + + cfnegd c0,c1 + + cfnegs c0,c1 + + cfrshl32 c0,c1,r3 + + cfrshl64 c0,c1,r3 + + cfsh32 c0,c1,2 + + cfsh64 c0,c1,2 + + label_cfstr32: + cfstr32 c0,[r1] + cfstr32 c0,[r1],4 + cfstr32 c0,[r1],{4} + cfstr32 c0,[r1,4] + cfstr32 c0,[r1,4]! + cfstr32 c0,[label_cfstr32] + cfstr32 c0,[expression.word] + cfstr32 c0,[expression.word]! + + label_cfstr64: + cfstr64 c0,[r1] + cfstr64 c0,[r1],4 + cfstr64 c0,[r1],{4} + cfstr64 c0,[r1,4] + cfstr64 c0,[r1,4]! + cfstr64 c0,[label_cfstr64] + cfstr64 c0,[expression.word] + cfstr64 c0,[expression.word]! + + label_cfstrd: + cfstrd c0,[r1] + cfstrd c0,[r1],4 + cfstrd c0,[r1],{4} + cfstrd c0,[r1,4] + cfstrd c0,[r1,4]! + cfstrd c0,[label_cfstrd] + cfstrd c0,[expression.word] + cfstrd c0,[expression.word]! + + label_cfstrs: + cfstrs c0,[r1] + cfstrs c0,[r1],4 + cfstrs c0,[r1],{4} + cfstrs c0,[r1,4] + cfstrs c0,[r1,4]! + cfstrs c0,[label_cfstrs] + cfstrs c0,[expression.word] + cfstrs c0,[expression.word]! + + cfsub32 c0,c1,c2 + + cfsub64 c0,c1,c2 + + cfsubd c0,c1,c2 + + cfsubs c0,c1,c2 + + cftruncd32 c0,c1 + + cftruncs32 c0,c1 diff --git a/armdoc/InstructionFormatsSIMD.asm b/armdoc/InstructionFormatsSIMD.asm new file mode 100644 index 0000000..d24dc0d --- /dev/null +++ b/armdoc/InstructionFormatsSIMD.asm @@ -0,0 +1,3056 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;To avoid unnecessary repetition only ARM mode is used +;here. There is no change needed for THUMB mode except +;to specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;In THUMB mode all instructions can be conditional. In +;ARM mode most instructions are unconditional. The +;condition code should be added at the end of the main +;opcode and before any size/type specifiers. For +;example: "addhi" and "vaddhi.i16". The syntax also +;supports the pre-UAL style of putting the condition +;before any modifiers like "s" or "fd". For example: +;"ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;SIMD, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_SIMD_INT + + vaba.s16 d0,d1,d2 + vaba.s16 q0,q1,q2 + + vaba.s32 d0,d1,d2 + vaba.s32 q0,q1,q2 + + vaba.s8 d0,d1,d2 + vaba.s8 q0,q1,q2 + + vaba.u16 d0,d1,d2 + vaba.u16 q0,q1,q2 + + vaba.u32 d0,d1,d2 + vaba.u32 q0,q1,q2 + + vaba.u8 d0,d1,d2 + vaba.u8 q0,q1,q2 + + vabal.s16 q0,d1,d2 + + vabal.s32 q0,d1,d2 + + vabal.s8 q0,d1,d2 + + vabal.u16 q0,d1,d2 + + vabal.u32 q0,d1,d2 + + vabal.u8 q0,d1,d2 + + vabd.s16 d0,d1 + vabd.s16 d0,d1,d2 + vabd.s16 q0,q1 + vabd.s16 q0,q1,q2 + + vabd.s32 d0,d1 + vabd.s32 d0,d1,d2 + vabd.s32 q0,q1 + vabd.s32 q0,q1,q2 + + vabd.s8 d0,d1 + vabd.s8 d0,d1,d2 + vabd.s8 q0,q1 + vabd.s8 q0,q1,q2 + + vabd.u16 d0,d1 + vabd.u16 d0,d1,d2 + vabd.u16 q0,q1 + vabd.u16 q0,q1,q2 + + vabd.u32 d0,d1 + vabd.u32 d0,d1,d2 + vabd.u32 q0,q1 + vabd.u32 q0,q1,q2 + + vabd.u8 d0,d1 + vabd.u8 d0,d1,d2 + vabd.u8 q0,q1 + vabd.u8 q0,q1,q2 + + vabdl.s16 q0,d1,d2 + + vabdl.s32 q0,d1,d2 + + vabdl.s8 q0,d1,d2 + + vabdl.u16 q0,d1,d2 + + vabdl.u32 q0,d1,d2 + + vabdl.u8 q0,d1,d2 + + vabs.s16 d0,d1 + vabs.s16 q0,q1 + + vabs.s32 d0,d1 + vabs.s32 q0,q1 + + vabs.s8 d0,d1 + vabs.s8 q0,q1 + + vadd.i16 d0,d1 + vadd.i16 d0,d1,d2 + vadd.i16 q0,q1 + vadd.i16 q0,q1,q2 + + vadd.i32 d0,d1 + vadd.i32 d0,d1,d2 + vadd.i32 q0,q1 + vadd.i32 q0,q1,q2 + + vadd.i64 d0,d1 + vadd.i64 d0,d1,d2 + vadd.i64 q0,q1 + vadd.i64 q0,q1,q2 + + vadd.i8 d0,d1 + vadd.i8 d0,d1,d2 + vadd.i8 q0,q1 + vadd.i8 q0,q1,q2 + + vaddhn.i16 d0,q1,q2 + + vaddhn.i32 d0,q1,q2 + + vaddhn.i64 d0,q1,q2 + + vaddl.s16 q0,d1,d2 + + vaddl.s32 q0,d1,d2 + + vaddl.s8 q0,d1,d2 + + vaddl.u16 q0,d1,d2 + + vaddl.u32 q0,d1,d2 + + vaddl.u8 q0,d1,d2 + + vaddw.s16 q0,d1 + vaddw.s16 q0,q1,d2 + + vaddw.s32 q0,d1 + vaddw.s32 q0,q1,d2 + + vaddw.s8 q0,d1 + vaddw.s8 q0,q1,d2 + + vaddw.u16 q0,d1 + vaddw.u16 q0,q1,d2 + + vaddw.u32 q0,d1 + vaddw.u32 q0,q1,d2 + + vaddw.u8 q0,d1 + vaddw.u8 q0,q1,d2 + + vand d0,d1 + vand d0,d1,d2 + vand q0,q1 + vand q0,q1,q2 + + vand.i16 d0,not 1 + vand.i16 q0,0xfffe + + vand.i32 d0,not 1 + vand.i32 q0,not 1 + + vbic d0,d1 + vbic d0,d1,d2 + vbic q0,q1 + vbic q0,q1,q2 + + vbic.i16 d0,1 + vbic.i16 q0,not -2 + + vbic.i32 d0,1 + vbic.i32 q0,1 + + vbif d0,d1 + vbif d0,d1,d2 + vbif q0,q1 + vbif q0,q1,q2 + + vbit d0,d1 + vbit d0,d1,d2 + vbit q0,q1 + vbit q0,q1,q2 + + vbsl d0,d1 + vbsl d0,d1,d2 + vbsl q0,q1 + vbsl q0,q1,q2 + + vceq.i16 d0,0 + vceq.i16 d0,d1 + vceq.i16 d0,d1,0 + vceq.i16 d0,d1,d2 + vceq.i16 q0,0 + vceq.i16 q0,q1 + vceq.i16 q0,q1,0 + vceq.i16 q0,q1,q2 + + vceq.i32 d0,0 + vceq.i32 d0,d1 + vceq.i32 d0,d1,0 + vceq.i32 d0,d1,d2 + vceq.i32 q0,0 + vceq.i32 q0,q1 + vceq.i32 q0,q1,0 + vceq.i32 q0,q1,q2 + + vceq.i8 d0,0 + vceq.i8 d0,d1 + vceq.i8 d0,d1,0 + vceq.i8 d0,d1,d2 + vceq.i8 q0,0 + vceq.i8 q0,q1 + vceq.i8 q0,q1,0 + vceq.i8 q0,q1,q2 + + vcge.s16 d0,0 + vcge.s16 d0,d1 + vcge.s16 d0,d1,0 + vcge.s16 d0,d1,d2 + vcge.s16 q0,0 + vcge.s16 q0,q1 + vcge.s16 q0,q1,0 + vcge.s16 q0,q1,q2 + + vcge.s32 d0,0 + vcge.s32 d0,d1 + vcge.s32 d0,d1,0 + vcge.s32 d0,d1,d2 + vcge.s32 q0,0 + vcge.s32 q0,q1 + vcge.s32 q0,q1,0 + vcge.s32 q0,q1,q2 + + vcge.s8 d0,0 + vcge.s8 d0,d1 + vcge.s8 d0,d1,0 + vcge.s8 d0,d1,d2 + vcge.s8 q0,0 + vcge.s8 q0,q1 + vcge.s8 q0,q1,0 + vcge.s8 q0,q1,q2 + + vcge.u16 d0,d1 + vcge.u16 d0,d1,d2 + vcge.u16 q0,q1 + vcge.u16 q0,q1,q2 + + vcge.u32 d0,d1 + vcge.u32 d0,d1,d2 + vcge.u32 q0,q1 + vcge.u32 q0,q1,q2 + + vcge.u8 d0,d1 + vcge.u8 d0,d1,d2 + vcge.u8 q0,q1 + vcge.u8 q0,q1,q2 + + vcgt.s16 d0,0 + vcgt.s16 d0,d1 + vcgt.s16 d0,d1,0 + vcgt.s16 d0,d1,d2 + vcgt.s16 q0,0 + vcgt.s16 q0,q1 + vcgt.s16 q0,q1,0 + vcgt.s16 q0,q1,q2 + + vcgt.s32 d0,0 + vcgt.s32 d0,d1 + vcgt.s32 d0,d1,0 + vcgt.s32 d0,d1,d2 + vcgt.s32 q0,0 + vcgt.s32 q0,q1 + vcgt.s32 q0,q1,0 + vcgt.s32 q0,q1,q2 + + vcgt.s8 d0,0 + vcgt.s8 d0,d1 + vcgt.s8 d0,d1,0 + vcgt.s8 d0,d1,d2 + vcgt.s8 q0,0 + vcgt.s8 q0,q1 + vcgt.s8 q0,q1,0 + vcgt.s8 q0,q1,q2 + + vcgt.u16 d0,d1 + vcgt.u16 d0,d1,d2 + vcgt.u16 q0,q1 + vcgt.u16 q0,q1,q2 + + vcgt.u32 d0,d1 + vcgt.u32 d0,d1,d2 + vcgt.u32 q0,q1 + vcgt.u32 q0,q1,q2 + + vcgt.u8 d0,d1 + vcgt.u8 d0,d1,d2 + vcgt.u8 q0,q1 + vcgt.u8 q0,q1,q2 + + vcle.s16 d0,0 + vcle.s16 d0,d1 + vcle.s16 d0,d1,0 + vcle.s16 d0,d1,d2 + vcle.s16 q0,0 + vcle.s16 q0,q1 + vcle.s16 q0,q1,0 + vcle.s16 q0,q1,q2 + + vcle.s32 d0,0 + vcle.s32 d0,d1 + vcle.s32 d0,d1,0 + vcle.s32 d0,d1,d2 + vcle.s32 q0,0 + vcle.s32 q0,q1 + vcle.s32 q0,q1,0 + vcle.s32 q0,q1,q2 + + vcle.s8 d0,0 + vcle.s8 d0,d1 + vcle.s8 d0,d1,0 + vcle.s8 d0,d1,d2 + vcle.s8 q0,0 + vcle.s8 q0,q1 + vcle.s8 q0,q1,0 + vcle.s8 q0,q1,q2 + + vcle.u16 d0,d1 + vcle.u16 d0,d1,d2 + vcle.u16 q0,q1 + vcle.u16 q0,q1,q2 + + vcle.u32 d0,d1 + vcle.u32 d0,d1,d2 + vcle.u32 q0,q1 + vcle.u32 q0,q1,q2 + + vcle.u8 d0,d1 + vcle.u8 d0,d1,d2 + vcle.u8 q0,q1 + vcle.u8 q0,q1,q2 + + vcls.s16 d0,d1 + vcls.s16 q0,q1 + + vcls.s32 d0,d1 + vcls.s32 q0,q1 + + vcls.s8 d0,d1 + vcls.s8 q0,q1 + + vclt.s16 d0,0 + vclt.s16 d0,d1 + vclt.s16 d0,d1,0 + vclt.s16 d0,d1,d2 + vclt.s16 q0,0 + vclt.s16 q0,q1 + vclt.s16 q0,q1,0 + vclt.s16 q0,q1,q2 + + vclt.s32 d0,0 + vclt.s32 d0,d1 + vclt.s32 d0,d1,0 + vclt.s32 d0,d1,d2 + vclt.s32 q0,0 + vclt.s32 q0,q1 + vclt.s32 q0,q1,0 + vclt.s32 q0,q1,q2 + + vclt.s8 d0,0 + vclt.s8 d0,d1 + vclt.s8 d0,d1,0 + vclt.s8 d0,d1,d2 + vclt.s8 q0,0 + vclt.s8 q0,q1 + vclt.s8 q0,q1,0 + vclt.s8 q0,q1,q2 + + vclt.u16 d0,d1 + vclt.u16 d0,d1,d2 + vclt.u16 q0,q1 + vclt.u16 q0,q1,q2 + + vclt.u32 d0,d1 + vclt.u32 d0,d1,d2 + vclt.u32 q0,q1 + vclt.u32 q0,q1,q2 + + vclt.u8 d0,d1 + vclt.u8 d0,d1,d2 + vclt.u8 q0,q1 + vclt.u8 q0,q1,q2 + + vclz.i16 d0,d1 + vclz.i16 q0,q1 + + vclz.i32 d0,d1 + vclz.i32 q0,q1 + + vclz.i8 d0,d1 + vclz.i8 q0,q1 + + vcnt.8 d0,d1 + vcnt.8 q0,q1 + + vdup.16 d0,d1[0] + vdup.16 d0,r1 + vdup.16 q0,d1[1] + vdup.16 q0,r1 + + vdup.32 d0,d1[0] + vdup.32 d0,r1 + vdup.32 q0,d1[1] + vdup.32 q0,r1 + + vdup.8 d0,d1[0] + vdup.8 d0,r1 + vdup.8 q0,d1[1] + vdup.8 q0,r1 + + veor d0,d1 + veor d0,d1,d2 + veor q0,q1 + veor q0,q1,q2 + + vext.16 d0,d1,1 + vext.16 d0,d1,d2,1 + vext.16 q0,q1,1 + vext.16 q0,q1,q2,1 + + vext.32 d0,d1,1 + vext.32 d0,d1,d2,1 + vext.32 q0,q1,1 + vext.32 q0,q1,q2,1 + + vext.64 d0,d1,0 + vext.64 d0,d1,d2,0 + vext.64 q0,q1,1 + vext.64 q0,q1,q2,1 + + vext.8 d0,d1,2 + vext.8 d0,d1,d2,1 + vext.8 q0,q1,2 + vext.8 q0,q1,q2,1 + + vhadd.s16 d0,d1 + vhadd.s16 d0,d1,d2 + vhadd.s16 q0,q1 + vhadd.s16 q0,q1,q2 + + vhadd.s32 d0,d1 + vhadd.s32 d0,d1,d2 + vhadd.s32 q0,q1 + vhadd.s32 q0,q1,q2 + + vhadd.s8 d0,d1 + vhadd.s8 d0,d1,d2 + vhadd.s8 q0,q1 + vhadd.s8 q0,q1,q2 + + vhadd.u16 d0,d1 + vhadd.u16 d0,d1,d2 + vhadd.u16 q0,q1 + vhadd.u16 q0,q1,q2 + + vhadd.u32 d0,d1 + vhadd.u32 d0,d1,d2 + vhadd.u32 q0,q1 + vhadd.u32 q0,q1,q2 + + vhadd.u8 d0,d1 + vhadd.u8 d0,d1,d2 + vhadd.u8 q0,q1 + vhadd.u8 q0,q1,q2 + + vhsub.s16 d0,d1 + vhsub.s16 d0,d1,d2 + vhsub.s16 q0,q1 + vhsub.s16 q0,q1,q2 + + vhsub.s32 d0,d1 + vhsub.s32 d0,d1,d2 + vhsub.s32 q0,q1 + vhsub.s32 q0,q1,q2 + + vhsub.s8 d0,d1 + vhsub.s8 d0,d1,d2 + vhsub.s8 q0,q1 + vhsub.s8 q0,q1,q2 + + vhsub.u16 d0,d1 + vhsub.u16 d0,d1,d2 + vhsub.u16 q0,q1 + vhsub.u16 q0,q1,q2 + + vhsub.u32 d0,d1 + vhsub.u32 d0,d1,d2 + vhsub.u32 q0,q1 + vhsub.u32 q0,q1,q2 + + vhsub.u8 d0,d1 + vhsub.u8 d0,d1,d2 + vhsub.u8 q0,q1 + vhsub.u8 q0,q1,q2 + + vld1.16 {d0},[r1] + vld1.16 {d0},[r1]! + vld1.16 {d0},[r1],8 + vld1.16 {d0},[r1],r2 + vld1.16 {d0},[r1@64] + vld1.16 {d0},[r1@64]! + vld1.16 {d0},[r1@64],8 + vld1.16 {d0},[r1@64],r2 + vld1.16 {d0,d1},[r2] + vld1.16 {d0,d1},[r2]! + vld1.16 {d0,d1},[r2],16 + vld1.16 {d0,d1},[r2],r3 + vld1.16 {d0,d1},[r2@64] + vld1.16 {d0,d1},[r2@64]! + vld1.16 {d0,d1},[r2@64],16 + vld1.16 {d0,d1},[r2@64],r3 + vld1.16 {d0,d1,d2},[r3] + vld1.16 {d0,d1,d2},[r3]! + vld1.16 {d0,d1,d2},[r3],24 + vld1.16 {d0,d1,d2},[r3],r4 + vld1.16 {d0,d1,d2},[r3@64] + vld1.16 {d0,d1,d2},[r3@64]! + vld1.16 {d0,d1,d2},[r3@64],24 + vld1.16 {d0,d1,d2},[r3@64],r4 + vld1.16 {d0,d1,d2,d3},[r4] + vld1.16 {d0,d1,d2,d3},[r4]! + vld1.16 {d0,d1,d2,d3},[r4],32 + vld1.16 {d0,d1,d2,d3},[r4],r5 + vld1.16 {d0,d1,d2,d3},[r4@64] + vld1.16 {d0,d1,d2,d3},[r4@64]! + vld1.16 {d0,d1,d2,d3},[r4@64],32 + vld1.16 {d0,d1,d2,d3},[r4@64],r5 + vld1.16 {d0[1]},[r2] + vld1.16 {d0[1]},[r2]! + vld1.16 {d0[1]},[r2],2 + vld1.16 {d0[1]},[r2],r3 + vld1.16 {d0[1]},[r2@16] + vld1.16 {d0[1]},[r2@16]! + vld1.16 {d0[1]},[r2@16],2 + vld1.16 {d0[1]},[r2@16],r3 + vld1.16 {d0[]},[r1] + vld1.16 {d0[]},[r1]! + vld1.16 {d0[]},[r1],2 + vld1.16 {d0[]},[r1],r2 + vld1.16 {d0[]},[r1@16] + vld1.16 {d0[]},[r1@16]! + vld1.16 {d0[]},[r1@16],2 + vld1.16 {d0[]},[r1@16],r2 + vld1.16 {d0[],d1[]},[r2] + vld1.16 {d0[],d1[]},[r2]! + vld1.16 {d0[],d1[]},[r2],2 + vld1.16 {d0[],d1[]},[r2],r3 + vld1.16 {d0[],d1[]},[r2@16] + vld1.16 {d0[],d1[]},[r2@16]! + vld1.16 {d0[],d1[]},[r2@16],2 + vld1.16 {d0[],d1[]},[r2@16],r3 + + vld1.32 {d0},[r1] + vld1.32 {d0},[r1]! + vld1.32 {d0},[r1],8 + vld1.32 {d0},[r1],r2 + vld1.32 {d0},[r1@64] + vld1.32 {d0},[r1@64]! + vld1.32 {d0},[r1@64],8 + vld1.32 {d0},[r1@64],r2 + vld1.32 {d0,d1},[r2] + vld1.32 {d0,d1},[r2]! + vld1.32 {d0,d1},[r2],16 + vld1.32 {d0,d1},[r2],r3 + vld1.32 {d0,d1},[r2@64] + vld1.32 {d0,d1},[r2@64]! + vld1.32 {d0,d1},[r2@64],16 + vld1.32 {d0,d1},[r2@64],r3 + vld1.32 {d0,d1,d2},[r3] + vld1.32 {d0,d1,d2},[r3]! + vld1.32 {d0,d1,d2},[r3],24 + vld1.32 {d0,d1,d2},[r3],r4 + vld1.32 {d0,d1,d2},[r3@64] + vld1.32 {d0,d1,d2},[r3@64]! + vld1.32 {d0,d1,d2},[r3@64],24 + vld1.32 {d0,d1,d2},[r3@64],r4 + vld1.32 {d0,d1,d2,d3},[r4] + vld1.32 {d0,d1,d2,d3},[r4]! + vld1.32 {d0,d1,d2,d3},[r4],32 + vld1.32 {d0,d1,d2,d3},[r4],r5 + vld1.32 {d0,d1,d2,d3},[r4@64] + vld1.32 {d0,d1,d2,d3},[r4@64]! + vld1.32 {d0,d1,d2,d3},[r4@64],32 + vld1.32 {d0,d1,d2,d3},[r4@64],r5 + vld1.32 {d0[1]},[r2] + vld1.32 {d0[1]},[r2]! + vld1.32 {d0[1]},[r2],4 + vld1.32 {d0[1]},[r2],r3 + vld1.32 {d0[1]},[r2@32] + vld1.32 {d0[1]},[r2@32]! + vld1.32 {d0[1]},[r2@32],4 + vld1.32 {d0[1]},[r2@32],r3 + vld1.32 {d0[]},[r1] + vld1.32 {d0[]},[r1]! + vld1.32 {d0[]},[r1],4 + vld1.32 {d0[]},[r1],r2 + vld1.32 {d0[]},[r1@32] + vld1.32 {d0[]},[r1@32]! + vld1.32 {d0[]},[r1@32],4 + vld1.32 {d0[]},[r1@32],r2 + vld1.32 {d0[],d1[]},[r2] + vld1.32 {d0[],d1[]},[r2]! + vld1.32 {d0[],d1[]},[r2],4 + vld1.32 {d0[],d1[]},[r2],r3 + vld1.32 {d0[],d1[]},[r2@32] + vld1.32 {d0[],d1[]},[r2@32]! + vld1.32 {d0[],d1[]},[r2@32],4 + vld1.32 {d0[],d1[]},[r2@32],r3 + + vld1.64 {d0},[r1] + vld1.64 {d0},[r1]! + vld1.64 {d0},[r1],8 + vld1.64 {d0},[r1],r2 + vld1.64 {d0},[r1@64] + vld1.64 {d0},[r1@64]! + vld1.64 {d0},[r1@64],8 + vld1.64 {d0},[r1@64],r2 + vld1.64 {d0,d1},[r2] + vld1.64 {d0,d1},[r2]! + vld1.64 {d0,d1},[r2],16 + vld1.64 {d0,d1},[r2],r3 + vld1.64 {d0,d1},[r2@64] + vld1.64 {d0,d1},[r2@64]! + vld1.64 {d0,d1},[r2@64],16 + vld1.64 {d0,d1},[r2@64],r3 + vld1.64 {d0,d1,d2},[r3] + vld1.64 {d0,d1,d2},[r3]! + vld1.64 {d0,d1,d2},[r3],24 + vld1.64 {d0,d1,d2},[r3],r4 + vld1.64 {d0,d1,d2},[r3@64] + vld1.64 {d0,d1,d2},[r3@64]! + vld1.64 {d0,d1,d2},[r3@64],24 + vld1.64 {d0,d1,d2},[r3@64],r4 + vld1.64 {d0,d1,d2,d3},[r4] + vld1.64 {d0,d1,d2,d3},[r4]! + vld1.64 {d0,d1,d2,d3},[r4],32 + vld1.64 {d0,d1,d2,d3},[r4],r5 + vld1.64 {d0,d1,d2,d3},[r4@64] + vld1.64 {d0,d1,d2,d3},[r4@64]! + vld1.64 {d0,d1,d2,d3},[r4@64],32 + vld1.64 {d0,d1,d2,d3},[r4@64],r5 + + vld1.8 {d0},[r1] + vld1.8 {d0},[r1]! + vld1.8 {d0},[r1],8 + vld1.8 {d0},[r1],r2 + vld1.8 {d0},[r1@64] + vld1.8 {d0},[r1@64]! + vld1.8 {d0},[r1@64],8 + vld1.8 {d0},[r1@64],r2 + vld1.8 {d0,d1},[r2] + vld1.8 {d0,d1},[r2]! + vld1.8 {d0,d1},[r2],16 + vld1.8 {d0,d1},[r2],r3 + vld1.8 {d0,d1},[r2@64] + vld1.8 {d0,d1},[r2@64]! + vld1.8 {d0,d1},[r2@64],16 + vld1.8 {d0,d1},[r2@64],r3 + vld1.8 {d0,d1,d2},[r3] + vld1.8 {d0,d1,d2},[r3]! + vld1.8 {d0,d1,d2},[r3],24 + vld1.8 {d0,d1,d2},[r3],r4 + vld1.8 {d0,d1,d2},[r3@64] + vld1.8 {d0,d1,d2},[r3@64]! + vld1.8 {d0,d1,d2},[r3@64],24 + vld1.8 {d0,d1,d2},[r3@64],r4 + vld1.8 {d0,d1,d2,d3},[r4] + vld1.8 {d0,d1,d2,d3},[r4]! + vld1.8 {d0,d1,d2,d3},[r4],32 + vld1.8 {d0,d1,d2,d3},[r4],r5 + vld1.8 {d0,d1,d2,d3},[r4@64] + vld1.8 {d0,d1,d2,d3},[r4@64]! + vld1.8 {d0,d1,d2,d3},[r4@64],32 + vld1.8 {d0,d1,d2,d3},[r4@64],r5 + vld1.8 {d0[1]},[r2] + vld1.8 {d0[1]},[r2]! + vld1.8 {d0[1]},[r2],1 + vld1.8 {d0[1]},[r2],r3 + vld1.8 {d0[]},[r1] + vld1.8 {d0[]},[r1]! + vld1.8 {d0[]},[r1],1 + vld1.8 {d0[]},[r1],r2 + vld1.8 {d0[],d1[]},[r2] + vld1.8 {d0[],d1[]},[r2]! + vld1.8 {d0[],d1[]},[r2],1 + vld1.8 {d0[],d1[]},[r2],r3 + + vld2.16 {d0,d1},[r2] + vld2.16 {d0,d1},[r2]! + vld2.16 {d0,d1},[r2],16 + vld2.16 {d0,d1},[r2],r3 + vld2.16 {d0,d1},[r2@64] + vld2.16 {d0,d1},[r2@64]! + vld2.16 {d0,d1},[r2@64],16 + vld2.16 {d0,d1},[r2@64],r3 + vld2.16 {d0,d2},[r3] + vld2.16 {d0,d2},[r3]! + vld2.16 {d0,d2},[r3],16 + vld2.16 {d0,d2},[r3],r4 + vld2.16 {d0,d2},[r3@64] + vld2.16 {d0,d2},[r3@64]! + vld2.16 {d0,d2},[r3@64],16 + vld2.16 {d0,d2},[r3@64],r4 + vld2.16 {d0,d1,d2,d3},[r4] + vld2.16 {d0,d1,d2,d3},[r4]! + vld2.16 {d0,d1,d2,d3},[r4],32 + vld2.16 {d0,d1,d2,d3},[r4],r5 + vld2.16 {d0,d1,d2,d3},[r4@64] + vld2.16 {d0,d1,d2,d3},[r4@64]! + vld2.16 {d0,d1,d2,d3},[r4@64],32 + vld2.16 {d0,d1,d2,d3},[r4@64],r5 + vld2.16 {d0[1],d1[1]},[r2] + vld2.16 {d0[1],d1[1]},[r2]! + vld2.16 {d0[1],d1[1]},[r2],4 + vld2.16 {d0[1],d1[1]},[r2],r3 + vld2.16 {d0[1],d1[1]},[r2@32] + vld2.16 {d0[1],d1[1]},[r2@32]! + vld2.16 {d0[1],d1[1]},[r2@32],4 + vld2.16 {d0[1],d1[1]},[r2@32],r3 + vld2.16 {d0[1],d2[1]},[r2] + vld2.16 {d0[1],d2[1]},[r2]! + vld2.16 {d0[1],d2[1]},[r2],4 + vld2.16 {d0[1],d2[1]},[r2],r3 + vld2.16 {d0[1],d2[1]},[r2@32] + vld2.16 {d0[1],d2[1]},[r2@32]! + vld2.16 {d0[1],d2[1]},[r2@32],4 + vld2.16 {d0[1],d2[1]},[r2@32],r3 + vld2.16 {d0[],d1[]},[r2] + vld2.16 {d0[],d1[]},[r2]! + vld2.16 {d0[],d1[]},[r2],4 + vld2.16 {d0[],d1[]},[r2],r3 + vld2.16 {d0[],d1[]},[r2@32] + vld2.16 {d0[],d1[]},[r2@32]! + vld2.16 {d0[],d1[]},[r2@32],4 + vld2.16 {d0[],d1[]},[r2@32],r3 + vld2.16 {d0[],d2[]},[r2] + vld2.16 {d0[],d2[]},[r2]! + vld2.16 {d0[],d2[]},[r2],4 + vld2.16 {d0[],d2[]},[r2],r3 + vld2.16 {d0[],d2[]},[r2@32] + vld2.16 {d0[],d2[]},[r2@32]! + vld2.16 {d0[],d2[]},[r2@32],4 + vld2.16 {d0[],d2[]},[r2@32],r3 + + vld2.32 {d0,d1},[r2] + vld2.32 {d0,d1},[r2]! + vld2.32 {d0,d1},[r2],16 + vld2.32 {d0,d1},[r2],r3 + vld2.32 {d0,d1},[r2@64] + vld2.32 {d0,d1},[r2@64]! + vld2.32 {d0,d1},[r2@64],16 + vld2.32 {d0,d1},[r2@64],r3 + vld2.32 {d0,d2},[r3] + vld2.32 {d0,d2},[r3]! + vld2.32 {d0,d2},[r3],16 + vld2.32 {d0,d2},[r3],r4 + vld2.32 {d0,d2},[r3@64] + vld2.32 {d0,d2},[r3@64]! + vld2.32 {d0,d2},[r3@64],16 + vld2.32 {d0,d2},[r3@64],r4 + vld2.32 {d0,d1,d2,d3},[r4] + vld2.32 {d0,d1,d2,d3},[r4]! + vld2.32 {d0,d1,d2,d3},[r4],32 + vld2.32 {d0,d1,d2,d3},[r4],r5 + vld2.32 {d0,d1,d2,d3},[r4@64] + vld2.32 {d0,d1,d2,d3},[r4@64]! + vld2.32 {d0,d1,d2,d3},[r4@64],32 + vld2.32 {d0,d1,d2,d3},[r4@64],r5 + vld2.32 {d0[1],d1[1]},[r2] + vld2.32 {d0[1],d1[1]},[r2]! + vld2.32 {d0[1],d1[1]},[r2],8 + vld2.32 {d0[1],d1[1]},[r2],r3 + vld2.32 {d0[1],d1[1]},[r2@64] + vld2.32 {d0[1],d1[1]},[r2@64]! + vld2.32 {d0[1],d1[1]},[r2@64],8 + vld2.32 {d0[1],d1[1]},[r2@64],r3 + vld2.32 {d0[1],d2[1]},[r2] + vld2.32 {d0[1],d2[1]},[r2]! + vld2.32 {d0[1],d2[1]},[r2],8 + vld2.32 {d0[1],d2[1]},[r2],r3 + vld2.32 {d0[1],d2[1]},[r2@64] + vld2.32 {d0[1],d2[1]},[r2@64]! + vld2.32 {d0[1],d2[1]},[r2@64],8 + vld2.32 {d0[1],d2[1]},[r2@64],r3 + vld2.32 {d0[],d1[]},[r2] + vld2.32 {d0[],d1[]},[r2]! + vld2.32 {d0[],d1[]},[r2],8 + vld2.32 {d0[],d1[]},[r2],r3 + vld2.32 {d0[],d1[]},[r2@64] + vld2.32 {d0[],d1[]},[r2@64]! + vld2.32 {d0[],d1[]},[r2@64],8 + vld2.32 {d0[],d1[]},[r2@64],r3 + vld2.32 {d0[],d2[]},[r2] + vld2.32 {d0[],d2[]},[r2]! + vld2.32 {d0[],d2[]},[r2],8 + vld2.32 {d0[],d2[]},[r2],r3 + vld2.32 {d0[],d2[]},[r2@64] + vld2.32 {d0[],d2[]},[r2@64]! + vld2.32 {d0[],d2[]},[r2@64],8 + vld2.32 {d0[],d2[]},[r2@64],r3 + + vld2.8 {d0,d1},[r2] + vld2.8 {d0,d1},[r2]! + vld2.8 {d0,d1},[r2],16 + vld2.8 {d0,d1},[r2],r3 + vld2.8 {d0,d1},[r2@64] + vld2.8 {d0,d1},[r2@64]! + vld2.8 {d0,d1},[r2@64],16 + vld2.8 {d0,d1},[r2@64],r3 + vld2.8 {d0,d2},[r3] + vld2.8 {d0,d2},[r3]! + vld2.8 {d0,d2},[r3],16 + vld2.8 {d0,d2},[r3],r4 + vld2.8 {d0,d2},[r3@64] + vld2.8 {d0,d2},[r3@64]! + vld2.8 {d0,d2},[r3@64],16 + vld2.8 {d0,d2},[r3@64],r4 + vld2.8 {d0,d1,d2,d3},[r4] + vld2.8 {d0,d1,d2,d3},[r4]! + vld2.8 {d0,d1,d2,d3},[r4],32 + vld2.8 {d0,d1,d2,d3},[r4],r5 + vld2.8 {d0,d1,d2,d3},[r4@64] + vld2.8 {d0,d1,d2,d3},[r4@64]! + vld2.8 {d0,d1,d2,d3},[r4@64],32 + vld2.8 {d0,d1,d2,d3},[r4@64],r5 + vld2.8 {d0[1],d1[1]},[r2] + vld2.8 {d0[1],d1[1]},[r2]! + vld2.8 {d0[1],d1[1]},[r2],2 + vld2.8 {d0[1],d1[1]},[r2],r3 + vld2.8 {d0[1],d1[1]},[r2@16] + vld2.8 {d0[1],d1[1]},[r2@16]! + vld2.8 {d0[1],d1[1]},[r2@16],2 + vld2.8 {d0[1],d1[1]},[r2@16],r3 + vld2.8 {d0[],d1[]},[r2] + vld2.8 {d0[],d1[]},[r2]! + vld2.8 {d0[],d1[]},[r2],2 + vld2.8 {d0[],d1[]},[r2],r3 + vld2.8 {d0[],d1[]},[r2@16] + vld2.8 {d0[],d1[]},[r2@16]! + vld2.8 {d0[],d1[]},[r2@16],2 + vld2.8 {d0[],d1[]},[r2@16],r3 + vld2.8 {d0[],d2[]},[r2] + vld2.8 {d0[],d2[]},[r2]! + vld2.8 {d0[],d2[]},[r2],2 + vld2.8 {d0[],d2[]},[r2],r3 + vld2.8 {d0[],d2[]},[r2@16] + vld2.8 {d0[],d2[]},[r2@16]! + vld2.8 {d0[],d2[]},[r2@16],2 + vld2.8 {d0[],d2[]},[r2@16],r3 + + vld3.16 {d0,d1,d2},[r2] + vld3.16 {d0,d1,d2},[r2]! + vld3.16 {d0,d1,d2},[r2],24 + vld3.16 {d0,d1,d2},[r2],r3 + vld3.16 {d0,d1,d2},[r2@64] + vld3.16 {d0,d1,d2},[r2@64]! + vld3.16 {d0,d1,d2},[r2@64],24 + vld3.16 {d0,d1,d2},[r2@64],r3 + vld3.16 {d0,d2,d4},[r3] + vld3.16 {d0,d2,d4},[r3]! + vld3.16 {d0,d2,d4},[r3],24 + vld3.16 {d0,d2,d4},[r3],r4 + vld3.16 {d0,d2,d4},[r3@64] + vld3.16 {d0,d2,d4},[r3@64]! + vld3.16 {d0,d2,d4},[r3@64],24 + vld3.16 {d0,d2,d4},[r3@64],r4 + vld3.16 {d0[1],d1[1],d2[1]},[r2] + vld3.16 {d0[1],d1[1],d2[1]},[r2]! + vld3.16 {d0[1],d1[1],d2[1]},[r2],6 + vld3.16 {d0[1],d1[1],d2[1]},[r2],r3 + vld3.16 {d0[1],d2[1],d4[1]},[r2] + vld3.16 {d0[1],d2[1],d4[1]},[r2]! + vld3.16 {d0[1],d2[1],d4[1]},[r2],6 + vld3.16 {d0[1],d2[1],d4[1]},[r2],r3 + vld3.16 {d0[],d1[],d2[]},[r2] + vld3.16 {d0[],d1[],d2[]},[r2]! + vld3.16 {d0[],d1[],d2[]},[r2],6 + vld3.16 {d0[],d1[],d2[]},[r2],r3 + vld3.16 {d0[],d2[],d4[]},[r2] + vld3.16 {d0[],d2[],d4[]},[r2]! + vld3.16 {d0[],d2[],d4[]},[r2],6 + vld3.16 {d0[],d2[],d4[]},[r2],r3 + + vld3.32 {d0,d1,d2},[r2] + vld3.32 {d0,d1,d2},[r2]! + vld3.32 {d0,d1,d2},[r2],24 + vld3.32 {d0,d1,d2},[r2],r3 + vld3.32 {d0,d1,d2},[r2@64] + vld3.32 {d0,d1,d2},[r2@64]! + vld3.32 {d0,d1,d2},[r2@64],24 + vld3.32 {d0,d1,d2},[r2@64],r3 + vld3.32 {d0,d2,d4},[r3] + vld3.32 {d0,d2,d4},[r3]! + vld3.32 {d0,d2,d4},[r3],24 + vld3.32 {d0,d2,d4},[r3],r4 + vld3.32 {d0,d2,d4},[r3@64] + vld3.32 {d0,d2,d4},[r3@64]! + vld3.32 {d0,d2,d4},[r3@64],24 + vld3.32 {d0,d2,d4},[r3@64],r4 + vld3.32 {d0[1],d1[1],d2[1]},[r2] + vld3.32 {d0[1],d1[1],d2[1]},[r2]! + vld3.32 {d0[1],d1[1],d2[1]},[r2],12 + vld3.32 {d0[1],d1[1],d2[1]},[r2],r3 + vld3.32 {d0[1],d2[1],d4[1]},[r2] + vld3.32 {d0[1],d2[1],d4[1]},[r2]! + vld3.32 {d0[1],d2[1],d4[1]},[r2],12 + vld3.32 {d0[1],d2[1],d4[1]},[r2],r3 + vld3.32 {d0[],d1[],d2[]},[r2] + vld3.32 {d0[],d1[],d2[]},[r2]! + vld3.32 {d0[],d1[],d2[]},[r2],12 + vld3.32 {d0[],d1[],d2[]},[r2],r3 + vld3.32 {d0[],d2[],d4[]},[r2] + vld3.32 {d0[],d2[],d4[]},[r2]! + vld3.32 {d0[],d2[],d4[]},[r2],12 + vld3.32 {d0[],d2[],d4[]},[r2],r3 + + vld3.8 {d0,d1,d2},[r2] + vld3.8 {d0,d1,d2},[r2]! + vld3.8 {d0,d1,d2},[r2],24 + vld3.8 {d0,d1,d2},[r2],r3 + vld3.8 {d0,d1,d2},[r2@64] + vld3.8 {d0,d1,d2},[r2@64]! + vld3.8 {d0,d1,d2},[r2@64],24 + vld3.8 {d0,d1,d2},[r2@64],r3 + vld3.8 {d0,d2,d4},[r3] + vld3.8 {d0,d2,d4},[r3]! + vld3.8 {d0,d2,d4},[r3],24 + vld3.8 {d0,d2,d4},[r3],r4 + vld3.8 {d0,d2,d4},[r3@64] + vld3.8 {d0,d2,d4},[r3@64]! + vld3.8 {d0,d2,d4},[r3@64],24 + vld3.8 {d0,d2,d4},[r3@64],r4 + vld3.8 {d0[1],d1[1],d2[1]},[r2] + vld3.8 {d0[1],d1[1],d2[1]},[r2]! + vld3.8 {d0[1],d1[1],d2[1]},[r2],3 + vld3.8 {d0[1],d1[1],d2[1]},[r2],r3 + vld3.8 {d0[],d1[],d2[]},[r2] + vld3.8 {d0[],d1[],d2[]},[r2]! + vld3.8 {d0[],d1[],d2[]},[r2],3 + vld3.8 {d0[],d1[],d2[]},[r2],r3 + vld3.8 {d0[],d2[],d4[]},[r2] + vld3.8 {d0[],d2[],d4[]},[r2]! + vld3.8 {d0[],d2[],d4[]},[r2],3 + vld3.8 {d0[],d2[],d4[]},[r2],r3 + + vld4.16 {d0,d1,d2,d3},[r4] + vld4.16 {d0,d1,d2,d3},[r4]! + vld4.16 {d0,d1,d2,d3},[r4],32 + vld4.16 {d0,d1,d2,d3},[r4],r5 + vld4.16 {d0,d1,d2,d3},[r4@64] + vld4.16 {d0,d1,d2,d3},[r4@64]! + vld4.16 {d0,d1,d2,d3},[r4@64],32 + vld4.16 {d0,d1,d2,d3},[r4@64],r5 + vld4.16 {d0,d2,d4,d6},[r4] + vld4.16 {d0,d2,d4,d6},[r4]! + vld4.16 {d0,d2,d4,d6},[r4],32 + vld4.16 {d0,d2,d4,d6},[r4],r5 + vld4.16 {d0,d2,d4,d6},[r4@64] + vld4.16 {d0,d2,d4,d6},[r4@64]! + vld4.16 {d0,d2,d4,d6},[r4@64],32 + vld4.16 {d0,d2,d4,d6},[r4@64],r5 + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2] + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2],8 + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64] + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64]! + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64],8 + vld4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64],r3 + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2] + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2]! + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2],8 + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2],r3 + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64] + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64]! + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64],8 + vld4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64],r3 + vld4.16 {d0[],d1[],d2[],d3[]},[r2] + vld4.16 {d0[],d1[],d2[],d3[]},[r2]! + vld4.16 {d0[],d1[],d2[],d3[]},[r2],8 + vld4.16 {d0[],d1[],d2[],d3[]},[r2],r3 + vld4.16 {d0[],d1[],d2[],d3[]},[r2@64] + vld4.16 {d0[],d1[],d2[],d3[]},[r2@64]! + vld4.16 {d0[],d1[],d2[],d3[]},[r2@64],8 + vld4.16 {d0[],d1[],d2[],d3[]},[r2@64],r3 + vld4.16 {d0[],d2[],d4[],d6[]},[r2] + vld4.16 {d0[],d2[],d4[],d6[]},[r2]! + vld4.16 {d0[],d2[],d4[],d6[]},[r2],8 + vld4.16 {d0[],d2[],d4[],d6[]},[r2],r3 + vld4.16 {d0[],d2[],d4[],d6[]},[r2@64] + vld4.16 {d0[],d2[],d4[],d6[]},[r2@64]! + vld4.16 {d0[],d2[],d4[],d6[]},[r2@64],8 + vld4.16 {d0[],d2[],d4[],d6[]},[r2@64],r3 + + vld4.32 {d0,d1,d2,d3},[r4] + vld4.32 {d0,d1,d2,d3},[r4]! + vld4.32 {d0,d1,d2,d3},[r4],32 + vld4.32 {d0,d1,d2,d3},[r4],r5 + vld4.32 {d0,d1,d2,d3},[r4@64] + vld4.32 {d0,d1,d2,d3},[r4@64]! + vld4.32 {d0,d1,d2,d3},[r4@64],32 + vld4.32 {d0,d1,d2,d3},[r4@64],r5 + vld4.32 {d0,d2,d4,d6},[r4] + vld4.32 {d0,d2,d4,d6},[r4]! + vld4.32 {d0,d2,d4,d6},[r4],32 + vld4.32 {d0,d2,d4,d6},[r4],r5 + vld4.32 {d0,d2,d4,d6},[r4@64] + vld4.32 {d0,d2,d4,d6},[r4@64]! + vld4.32 {d0,d2,d4,d6},[r4@64],32 + vld4.32 {d0,d2,d4,d6},[r4@64],r5 + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2] + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2],16 + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64] + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64]! + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64],16 + vld4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64],r3 + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2] + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2]! + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2],16 + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2],r3 + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64] + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64]! + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64],16 + vld4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64],r3 + vld4.32 {d0[],d1[],d2[],d3[]},[r2] + vld4.32 {d0[],d1[],d2[],d3[]},[r2]! + vld4.32 {d0[],d1[],d2[],d3[]},[r2],16 + vld4.32 {d0[],d1[],d2[],d3[]},[r2],r3 + vld4.32 {d0[],d1[],d2[],d3[]},[r2@64] + vld4.32 {d0[],d1[],d2[],d3[]},[r2@64]! + vld4.32 {d0[],d1[],d2[],d3[]},[r2@64],16 + vld4.32 {d0[],d1[],d2[],d3[]},[r2@64],r3 + vld4.32 {d0[],d2[],d4[],d6[]},[r2] + vld4.32 {d0[],d2[],d4[],d6[]},[r2]! + vld4.32 {d0[],d2[],d4[],d6[]},[r2],16 + vld4.32 {d0[],d2[],d4[],d6[]},[r2],r3 + vld4.32 {d0[],d2[],d4[],d6[]},[r2@64] + vld4.32 {d0[],d2[],d4[],d6[]},[r2@64]! + vld4.32 {d0[],d2[],d4[],d6[]},[r2@64],16 + vld4.32 {d0[],d2[],d4[],d6[]},[r2@64],r3 + + vld4.8 {d0,d1,d2,d3},[r4] + vld4.8 {d0,d1,d2,d3},[r4]! + vld4.8 {d0,d1,d2,d3},[r4],32 + vld4.8 {d0,d1,d2,d3},[r4],r5 + vld4.8 {d0,d1,d2,d3},[r4@64] + vld4.8 {d0,d1,d2,d3},[r4@64]! + vld4.8 {d0,d1,d2,d3},[r4@64],32 + vld4.8 {d0,d1,d2,d3},[r4@64],r5 + vld4.8 {d0,d2,d4,d6},[r4] + vld4.8 {d0,d2,d4,d6},[r4]! + vld4.8 {d0,d2,d4,d6},[r4],32 + vld4.8 {d0,d2,d4,d6},[r4],r5 + vld4.8 {d0,d2,d4,d6},[r4@64] + vld4.8 {d0,d2,d4,d6},[r4@64]! + vld4.8 {d0,d2,d4,d6},[r4@64],32 + vld4.8 {d0,d2,d4,d6},[r4@64],r5 + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2] + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2],4 + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32] + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32]! + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32],4 + vld4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32],r3 + vld4.8 {d0[],d1[],d2[],d3[]},[r2] + vld4.8 {d0[],d1[],d2[],d3[]},[r2]! + vld4.8 {d0[],d1[],d2[],d3[]},[r2],4 + vld4.8 {d0[],d1[],d2[],d3[]},[r2],r3 + vld4.8 {d0[],d1[],d2[],d3[]},[r2@32] + vld4.8 {d0[],d1[],d2[],d3[]},[r2@32]! + vld4.8 {d0[],d1[],d2[],d3[]},[r2@32],4 + vld4.8 {d0[],d1[],d2[],d3[]},[r2@32],r3 + vld4.8 {d0[],d2[],d4[],d6[]},[r2] + vld4.8 {d0[],d2[],d4[],d6[]},[r2]! + vld4.8 {d0[],d2[],d4[],d6[]},[r2],4 + vld4.8 {d0[],d2[],d4[],d6[]},[r2],r3 + vld4.8 {d0[],d2[],d4[],d6[]},[r2@32] + vld4.8 {d0[],d2[],d4[],d6[]},[r2@32]! + vld4.8 {d0[],d2[],d4[],d6[]},[r2@32],4 + vld4.8 {d0[],d2[],d4[],d6[]},[r2@32],r3 + + vmax.s16 d0,d1 + vmax.s16 d0,d1,d2 + vmax.s16 q0,q1 + vmax.s16 q0,q1,q2 + + vmax.s32 d0,d1 + vmax.s32 d0,d1,d2 + vmax.s32 q0,q1 + vmax.s32 q0,q1,q2 + + vmax.s8 d0,d1 + vmax.s8 d0,d1,d2 + vmax.s8 q0,q1 + vmax.s8 q0,q1,q2 + + vmax.u16 d0,d1 + vmax.u16 d0,d1,d2 + vmax.u16 q0,q1 + vmax.u16 q0,q1,q2 + + vmax.u32 d0,d1 + vmax.u32 d0,d1,d2 + vmax.u32 q0,q1 + vmax.u32 q0,q1,q2 + + vmax.u8 d0,d1 + vmax.u8 d0,d1,d2 + vmax.u8 q0,q1 + vmax.u8 q0,q1,q2 + + vmin.s16 d0,d1 + vmin.s16 d0,d1,d2 + vmin.s16 q0,q1 + vmin.s16 q0,q1,q2 + + vmin.s32 d0,d1 + vmin.s32 d0,d1,d2 + vmin.s32 q0,q1 + vmin.s32 q0,q1,q2 + + vmin.s8 d0,d1 + vmin.s8 d0,d1,d2 + vmin.s8 q0,q1 + vmin.s8 q0,q1,q2 + + vmin.u16 d0,d1 + vmin.u16 d0,d1,d2 + vmin.u16 q0,q1 + vmin.u16 q0,q1,q2 + + vmin.u32 d0,d1 + vmin.u32 d0,d1,d2 + vmin.u32 q0,q1 + vmin.u32 q0,q1,q2 + + vmin.u8 d0,d1 + vmin.u8 d0,d1,d2 + vmin.u8 q0,q1 + vmin.u8 q0,q1,q2 + + vmla.i16 d0,d1,d2 + vmla.i16 d0,d1,d2[0] + vmla.i16 q0,q1,q2 + vmla.i16 q0,q1,d2[1] + + vmla.i32 d0,d1,d2 + vmla.i32 d0,d1,d2[0] + vmla.i32 q0,q1,q2 + vmla.i32 q0,q1,d2[1] + + vmla.i8 d0,d1,d2 + vmla.i8 q0,q1,q2 + + vmla.s16 d0,d1,d2 + vmla.s16 q0,q1,q2 + + vmla.s32 d0,d1,d2 + vmla.s32 q0,q1,q2 + + vmla.s8 d0,d1,d2 + vmla.s8 q0,q1,q2 + + vmla.u16 d0,d1,d2 + vmla.u16 q0,q1,q2 + + vmla.u32 d0,d1,d2 + vmla.u32 q0,q1,q2 + + vmla.u8 d0,d1,d2 + vmla.u8 q0,q1,q2 + + vmlal.s16 q0,d1,d2 + vmlal.s16 q0,d1,d2[0] + + vmlal.s32 q0,d1,d2 + vmlal.s32 q0,d1,d2[0] + + vmlal.s8 q0,d1,d2 + + vmlal.u16 q0,d1,d2 + vmlal.u16 q0,d1,d2[1] + + vmlal.u32 q0,d1,d2 + vmlal.u32 q0,d1,d2[0] + + vmlal.u8 q0,d1,d2 + + vmls.i16 d0,d1,d2 + vmls.i16 d0,d1,d2[0] + vmls.i16 q0,q1,q2 + vmls.i16 q0,q1,d2[1] + + vmls.i32 d0,d1,d2 + vmls.i32 d0,d1,d2[0] + vmls.i32 q0,q1,q2 + vmls.i32 q0,q1,d2[1] + + vmls.i8 d0,d1,d2 + vmls.i8 q0,q1,q2 + + vmls.s16 d0,d1,d2 + vmls.s16 q0,q1,q2 + + vmls.s32 d0,d1,d2 + vmls.s32 q0,q1,q2 + + vmls.s8 d0,d1,d2 + vmls.s8 q0,q1,q2 + + vmls.u16 d0,d1,d2 + vmls.u16 q0,q1,q2 + + vmls.u32 d0,d1,d2 + vmls.u32 q0,q1,q2 + + vmls.u8 d0,d1,d2 + vmls.u8 q0,q1,q2 + + vmlsl.s16 q0,d1,d2 + vmlsl.s16 q0,d1,d2[1] + + vmlsl.s32 q0,d1,d2 + vmlsl.s32 q0,d1,d2[0] + + vmlsl.s8 q0,d1,d2 + + vmlsl.u16 q0,d1,d2 + vmlsl.u16 q0,d1,d2[1] + + vmlsl.u32 q0,d1,d2 + vmlsl.u32 q0,d1,d2[0] + + vmlsl.u8 q0,d1,d2 + + vmov d0,d1 + vmov q0,q1 + + vmov.16 d0[1],r1 + + vmov.8 d0[1],r1 + + vmov.i16 d0,1 + vmov.i16 q0,1 + + vmov.i32 d0,1 + vmov.i32 q0,1 + + vmov.i64 d0,1 + vmov.i64 q0,1 + + vmov.i8 d0,1 + vmov.i8 q0,1 + + vmov.s16 r0,d1[1] + + vmov.s8 r0,d1[1] + + vmov.u16 r0,d1[1] + + vmov.u8 r0,d1[1] + + vmovl.s16 q0,d1 + + vmovl.s32 q0,d1 + + vmovl.s8 q0,d1 + + vmovl.u16 q0,d1 + + vmovl.u32 q0,d1 + + vmovl.u8 q0,d1 + + vmovn.i16 d0,q1 + + vmovn.i32 d0,q1 + + vmovn.i8 d0,q1 + + vmul.i16 d0,d1 + vmul.i16 d0,d1,d2 + vmul.i16 d0,d1[1] + vmul.i16 d0,d1,d2[1] + vmul.i16 q0,q1 + vmul.i16 q0,q1,q2 + vmul.i16 q0,d1[1] + vmul.i16 q0,q1,d2[1] + + vmul.i32 d0,d1 + vmul.i32 d0,d1,d2 + vmul.i32 d0,d1[0] + vmul.i32 d0,d1,d2[0] + vmul.i32 q0,q1 + vmul.i32 q0,q1,q2 + vmul.i32 q0,d1[0] + vmul.i32 q0,q1,d2[0] + + vmul.i8 d0,d1 + vmul.i8 d0,d1,d2 + vmul.i8 q0,q1 + vmul.i8 q0,q1,q2 + + vmul.p8 d0,d1 + vmul.p8 d0,d1,d2 + + vmul.s16 d0,d1 + vmul.s16 d0,d1,d2 + + vmul.s32 d0,d1 + vmul.s32 d0,d1,d2 + + vmul.s8 d0,d1 + vmul.s8 d0,d1,d2 + vmul.s8 q0,q1 + vmul.s8 q0,q1,q2 + + vmul.u16 d0,d1 + vmul.u16 d0,d1,d2 + + vmul.u32 d0,d1 + vmul.u32 d0,d1,d2 + + vmul.u8 d0,d1 + vmul.u8 d0,d1,d2 + vmul.u8 q0,q1 + vmul.u8 q0,q1,q2 + + vmull.p8 q0,d1,d2 + + vmull.s16 q0,d1,d2 + vmull.s16 q0,d1,d2[0] + + vmull.s32 q0,d1,d2 + vmull.s32 q0,d1,d2[0] + + vmull.s8 q0,d1,d2 + + vmull.u16 q0,d1,d2 + vmull.u16 q0,d1,d2[1] + + vmull.u32 q0,d1,d2 + vmull.u32 q0,d1,d2[0] + + vmull.u8 q0,d1,d2 + + vmvn d0,d1 + vmvn q0,q1 + + vmvn.i16 d0,1 + vmvn.i16 q0,1 + + vmvn.i32 d0,1 + vmvn.i32 q0,1 + + vneg.s16 d0,d1 + vneg.s16 q0,q1 + + vneg.s32 d0,d1 + vneg.s32 q0,q1 + + vneg.s8 d0,d1 + vneg.s8 q0,q1 + + vorn d0,d1 + vorn d0,d1,d2 + vorn q0,q1 + vorn q0,q1,q2 + + vorn.i16 d0,not 1 + vorn.i16 q0,0xfffe + + vorn.i32 d0,not 1 + vorn.i32 q0,not 1 + + vorr d0,d1 + vorr d0,d1,d2 + vorr q0,q1 + vorr q0,q1,q2 + + vorr.i16 d0,1 + vorr.i16 q0,not -2 + + vorr.i32 d0,1 + vorr.i32 q0,1 + + vpadal.s16 d0,d1 + vpadal.s16 q0,q1 + + vpadal.s32 d0,d1 + vpadal.s32 q0,q1 + + vpadal.s8 d0,d1 + vpadal.s8 q0,q1 + + vpadal.u16 d0,d1 + vpadal.u16 q0,q1 + + vpadal.u32 d0,d1 + vpadal.u32 q0,q1 + + vpadal.u8 d0,d1 + vpadal.u8 q0,q1 + + vpadd.i16 d0,d1 + vpadd.i16 d0,d1,d2 + + vpadd.i32 d0,d1 + vpadd.i32 d0,d1,d2 + + vpadd.i8 d0,d1 + vpadd.i8 d0,d1,d2 + + vpaddl.s16 d0,d1 + vpaddl.s16 q0,q1 + + vpaddl.s32 d0,d1 + vpaddl.s32 q0,q1 + + vpaddl.s8 d0,d1 + vpaddl.s8 q0,q1 + + vpaddl.u16 d0,d1 + vpaddl.u16 q0,q1 + + vpaddl.u32 d0,d1 + vpaddl.u32 q0,q1 + + vpaddl.u8 d0,d1 + vpaddl.u8 q0,q1 + + vpmax.s16 d0,d1 + vpmax.s16 d0,d1,d2 + + vpmax.s32 d0,d1 + vpmax.s32 d0,d1,d2 + + vpmax.s8 d0,d1 + vpmax.s8 d0,d1,d2 + + vpmax.u16 d0,d1 + vpmax.u16 d0,d1,d2 + + vpmax.u32 d0,d1 + vpmax.u32 d0,d1,d2 + + vpmax.u8 d0,d1 + vpmax.u8 d0,d1,d2 + + vpmin.s16 d0,d1 + vpmin.s16 d0,d1,d2 + + vpmin.s32 d0,d1 + vpmin.s32 d0,d1,d2 + + vpmin.s8 d0,d1 + vpmin.s8 d0,d1,d2 + + vpmin.u16 d0,d1 + vpmin.u16 d0,d1,d2 + + vpmin.u32 d0,d1 + vpmin.u32 d0,d1,d2 + + vpmin.u8 d0,d1 + vpmin.u8 d0,d1,d2 + + vqabs.s16 d0,d1 + vqabs.s16 q0,q1 + + vqabs.s32 d0,d1 + vqabs.s32 q0,q1 + + vqabs.s8 d0,d1 + vqabs.s8 q0,q1 + + vqadd.s16 d0,d1 + vqadd.s16 d0,d1,d2 + vqadd.s16 q0,q1 + vqadd.s16 q0,q1,q2 + + vqadd.s32 d0,d1 + vqadd.s32 d0,d1,d2 + vqadd.s32 q0,q1 + vqadd.s32 q0,q1,q2 + + vqadd.s64 d0,d1 + vqadd.s64 d0,d1,d2 + vqadd.s64 q0,q1 + vqadd.s64 q0,q1,q2 + + vqadd.s8 d0,d1 + vqadd.s8 d0,d1,d2 + vqadd.s8 q0,q1 + vqadd.s8 q0,q1,q2 + + vqadd.u16 d0,d1 + vqadd.u16 d0,d1,d2 + vqadd.u16 q0,q1 + vqadd.u16 q0,q1,q2 + + vqadd.u32 d0,d1 + vqadd.u32 d0,d1,d2 + vqadd.u32 q0,q1 + vqadd.u32 q0,q1,q2 + + vqadd.u64 d0,d1 + vqadd.u64 d0,d1,d2 + vqadd.u64 q0,q1 + vqadd.u64 q0,q1,q2 + + vqadd.u8 d0,d1 + vqadd.u8 d0,d1,d2 + vqadd.u8 q0,q1 + vqadd.u8 q0,q1,q2 + + vqdmlal.s16 q0,d1,d2 + vqdmlal.s16 q0,d1,d2[0] + + vqdmlal.s32 q0,d1,d2 + vqdmlal.s32 q0,d1,d2[0] + + vqdmlsl.s16 q0,d1,d2 + vqdmlsl.s16 q0,d1,d2[0] + + vqdmlsl.s32 q0,d1,d2 + vqdmlsl.s32 q0,d1,d2[0] + + vqdmulh.s16 d0,d1 + vqdmulh.s16 d0,d1,d2 + vqdmulh.s16 d0,d1[1] + vqdmulh.s16 d0,d1,d2[1] + vqdmulh.s16 q0,q1 + vqdmulh.s16 q0,q1,q2 + vqdmulh.s16 q0,d1[1] + vqdmulh.s16 q0,q1,d2[1] + + vqdmulh.s32 d0,d1 + vqdmulh.s32 d0,d1,d2 + vqdmulh.s32 d0,d1[0] + vqdmulh.s32 d0,d1,d2[0] + vqdmulh.s32 q0,q1 + vqdmulh.s32 q0,q1,q2 + vqdmulh.s32 q0,d1[0] + vqdmulh.s32 q0,q1,d2[0] + + vqdmull.s16 q0,d1,d2 + vqdmull.s16 q0,d1,d2[0] + + vqdmull.s32 q0,d1,d2 + vqdmull.s32 q0,d1,d2[0] + + vqmovn.s16 d0,q1 + + vqmovn.s32 d0,q1 + + vqmovn.s64 d0,q1 + + vqmovn.u16 d0,q1 + + vqmovn.u32 d0,q1 + + vqmovn.u64 d0,q1 + + vqmovun.s16 d0,q1 + + vqmovun.s32 d0,q1 + + vqmovun.s64 d0,q1 + + vqneg.s16 d0,d1 + vqneg.s16 q0,q1 + + vqneg.s32 d0,d1 + vqneg.s32 q0,q1 + + vqneg.s8 d0,d1 + vqneg.s8 q0,q1 + + vqrdmulh.s16 d0,d1 + vqrdmulh.s16 d0,d1,d2 + vqrdmulh.s16 d0,d1[1] + vqrdmulh.s16 d0,d1,d2[1] + vqrdmulh.s16 q0,q1 + vqrdmulh.s16 q0,q1,q2 + vqrdmulh.s16 q0,d1[1] + vqrdmulh.s16 q0,q1,d2[1] + + vqrdmulh.s32 d0,d1 + vqrdmulh.s32 d0,d1,d2 + vqrdmulh.s32 d0,d1[0] + vqrdmulh.s32 d0,d1,d2[0] + vqrdmulh.s32 q0,q1 + vqrdmulh.s32 q0,q1,q2 + vqrdmulh.s32 q0,d1[0] + vqrdmulh.s32 q0,q1,d1[0] + + vqrshl.s16 d0,d1 + vqrshl.s16 d0,d1,d2 + vqrshl.s16 q0,q1 + vqrshl.s16 q0,q1,q2 + + vqrshl.s32 d0,d1 + vqrshl.s32 d0,d1,d2 + vqrshl.s32 q0,q1 + vqrshl.s32 q0,q1,q2 + + vqrshl.s64 d0,d1 + vqrshl.s64 d0,d1,d2 + vqrshl.s64 q0,q1 + vqrshl.s64 q0,q1,q2 + + vqrshl.s8 d0,d1 + vqrshl.s8 d0,d1,d2 + vqrshl.s8 q0,q1 + vqrshl.s8 q0,q1,q2 + + vqrshl.u16 d0,d1 + vqrshl.u16 d0,d1,d2 + vqrshl.u16 q0,q1 + vqrshl.u16 q0,q1,q2 + + vqrshl.u32 d0,d1 + vqrshl.u32 d0,d1,d2 + vqrshl.u32 q0,q1 + vqrshl.u32 q0,q1,q2 + + vqrshl.u64 d0,d1 + vqrshl.u64 d0,d1,d2 + vqrshl.u64 q0,q1 + vqrshl.u64 q0,q1,q2 + + vqrshl.u8 d0,d1 + vqrshl.u8 d0,d1,d2 + vqrshl.u8 q0,q1 + vqrshl.u8 q0,q1,q2 + + vqrshrn.s16 d0,q1,1 + + vqrshrn.s32 d0,q1,1 + + vqrshrn.s64 d0,q1,1 + + vqrshrn.u16 d0,q1,1 + + vqrshrn.u32 d0,q1,1 + + vqrshrn.u64 d0,q1,1 + + vqrshrun.s16 d0,q1,1 + + vqrshrun.s32 d0,q1,1 + + vqrshrun.s64 d0,q1,1 + + vqshl.s16 d0,1 + vqshl.s16 d0,d1 + vqshl.s16 d0,d1,1 + vqshl.s16 d0,d1,d2 + vqshl.s16 q0,1 + vqshl.s16 q0,q1 + vqshl.s16 q0,q1,1 + vqshl.s16 q0,q1,q2 + + vqshl.s32 d0,1 + vqshl.s32 d0,d1 + vqshl.s32 d0,d1,1 + vqshl.s32 d0,d1,d2 + vqshl.s32 q0,1 + vqshl.s32 q0,q1 + vqshl.s32 q0,q1,1 + vqshl.s32 q0,q1,q2 + + vqshl.s64 d0,1 + vqshl.s64 d0,d1 + vqshl.s64 d0,d1,1 + vqshl.s64 d0,d1,d2 + vqshl.s64 q0,1 + vqshl.s64 q0,q1 + vqshl.s64 q0,q1,1 + vqshl.s64 q0,q1,q2 + + vqshl.s8 d0,1 + vqshl.s8 d0,d1 + vqshl.s8 d0,d1,1 + vqshl.s8 d0,d1,d2 + vqshl.s8 q0,1 + vqshl.s8 q0,q1 + vqshl.s8 q0,q1,1 + vqshl.s8 q0,q1,q2 + + vqshl.u16 d0,1 + vqshl.u16 d0,d1 + vqshl.u16 d0,d1,1 + vqshl.u16 d0,d1,d2 + vqshl.u16 q0,1 + vqshl.u16 q0,q1 + vqshl.u16 q0,q1,1 + vqshl.u16 q0,q1,q2 + + vqshl.u32 d0,1 + vqshl.u32 d0,d1 + vqshl.u32 d0,d1,1 + vqshl.u32 d0,d1,d2 + vqshl.u32 q0,1 + vqshl.u32 q0,q1 + vqshl.u32 q0,q1,1 + vqshl.u32 q0,q1,q2 + + vqshl.u64 d0,1 + vqshl.u64 d0,d1 + vqshl.u64 d0,d1,1 + vqshl.u64 d0,d1,d2 + vqshl.u64 q0,1 + vqshl.u64 q0,q1 + vqshl.u64 q0,q1,1 + vqshl.u64 q0,q1,q2 + + vqshl.u8 d0,1 + vqshl.u8 d0,d1 + vqshl.u8 d0,d1,1 + vqshl.u8 d0,d1,d2 + vqshl.u8 q0,1 + vqshl.u8 q0,q1 + vqshl.u8 q0,q1,1 + vqshl.u8 q0,q1,q2 + + vqshlu.s16 d0,1 + vqshlu.s16 d0,d1,1 + vqshlu.s16 q0,1 + vqshlu.s16 q0,q1,1 + + vqshlu.s32 d0,1 + vqshlu.s32 d0,d1,1 + vqshlu.s32 q0,1 + vqshlu.s32 q0,q1,1 + + vqshlu.s64 d0,1 + vqshlu.s64 d0,d1,1 + vqshlu.s64 q0,1 + vqshlu.s64 q0,q1,1 + + vqshlu.s8 d0,1 + vqshlu.s8 d0,d1,1 + vqshlu.s8 q0,1 + vqshlu.s8 q0,q1,1 + + vqshrn.s16 d0,q1,1 + + vqshrn.s32 d0,q1,1 + + vqshrn.s64 d0,q1,1 + + vqshrn.u16 d0,q1,1 + + vqshrn.u32 d0,q1,1 + + vqshrn.u64 d0,q1,1 + + vqshrun.s16 d0,q1,1 + + vqshrun.s32 d0,q1,1 + + vqshrun.s64 d0,q1,1 + + vqsub.s16 d0,d1 + vqsub.s16 d0,d1,d2 + vqsub.s16 q0,q1 + vqsub.s16 q0,q1,q2 + + vqsub.s32 d0,d1 + vqsub.s32 d0,d1,d2 + vqsub.s32 q0,q1 + vqsub.s32 q0,q1,q2 + + vqsub.s64 d0,d1 + vqsub.s64 d0,d1,d2 + vqsub.s64 q0,q1 + vqsub.s64 q0,q1,q2 + + vqsub.s8 d0,d1 + vqsub.s8 d0,d1,d2 + vqsub.s8 q0,q1 + vqsub.s8 q0,q1,q2 + + vqsub.u16 d0,d1 + vqsub.u16 d0,d1,d2 + vqsub.u16 q0,q1 + vqsub.u16 q0,q1,q2 + + vqsub.u32 d0,d1 + vqsub.u32 d0,d1,d2 + vqsub.u32 q0,q1 + vqsub.u32 q0,q1,q2 + + vqsub.u64 d0,d1 + vqsub.u64 d0,d1,d2 + vqsub.u64 q0,q1 + vqsub.u64 q0,q1,q2 + + vqsub.u8 d0,d1 + vqsub.u8 d0,d1,d2 + vqsub.u8 q0,q1 + vqsub.u8 q0,q1,q2 + + vraddhn.i16 d0,q1,q2 + + vraddhn.i32 d0,q1,q2 + + vraddhn.i64 d0,q1,q2 + + vrecpe.u32 d0,d1 + vrecpe.u32 q0,q1 + + vrev16.8 d0,d1 + vrev16.8 q0,q1 + + vrev32.16 d0,d1 + vrev32.16 q0,q1 + + vrev32.8 d0,d1 + vrev32.8 q0,q1 + + vrev64.16 d0,d1 + vrev64.16 q0,q1 + + vrev64.32 d0,d1 + vrev64.32 q0,q1 + + vrev64.8 d0,d1 + vrev64.8 q0,q1 + + vrhadd.s16 d0,d1 + vrhadd.s16 d0,d1,d2 + vrhadd.s16 q0,q1 + vrhadd.s16 q0,q1,q2 + + vrhadd.s32 d0,d1 + vrhadd.s32 d0,d1,d2 + vrhadd.s32 q0,q1 + vrhadd.s32 q0,q1,q2 + + vrhadd.s8 d0,d1 + vrhadd.s8 d0,d1,d2 + vrhadd.s8 q0,q1 + vrhadd.s8 q0,q1,q2 + + vrhadd.u16 d0,d1 + vrhadd.u16 d0,d1,d2 + vrhadd.u16 q0,q1 + vrhadd.u16 q0,q1,q2 + + vrhadd.u32 d0,d1 + vrhadd.u32 d0,d1,d2 + vrhadd.u32 q0,q1 + vrhadd.u32 q0,q1,q2 + + vrhadd.u8 d0,d1 + vrhadd.u8 d0,d1,d2 + vrhadd.u8 q0,q1 + vrhadd.u8 q0,q1,q2 + + vrshl.s16 d0,d1 + vrshl.s16 d0,d1,d2 + vrshl.s16 q0,q1 + vrshl.s16 q0,q1,q2 + + vrshl.s32 d0,d1 + vrshl.s32 d0,d1,d2 + vrshl.s32 q0,q1 + vrshl.s32 q0,q1,q2 + + vrshl.s64 d0,d1 + vrshl.s64 d0,d1,d2 + vrshl.s64 q0,q1 + vrshl.s64 q0,q1,q2 + + vrshl.s8 d0,d1 + vrshl.s8 d0,d1,d2 + vrshl.s8 q0,q1 + vrshl.s8 q0,q1,q2 + + vrshl.u16 d0,d1 + vrshl.u16 d0,d1,d2 + vrshl.u16 q0,q1 + vrshl.u16 q0,q1,q2 + + vrshl.u32 d0,d1 + vrshl.u32 d0,d1,d2 + vrshl.u32 q0,q1 + vrshl.u32 q0,q1,q2 + + vrshl.u64 d0,d1 + vrshl.u64 d0,d1,d2 + vrshl.u64 q0,q1 + vrshl.u64 q0,q1,q2 + + vrshl.u8 d0,d1 + vrshl.u8 d0,d1,d2 + vrshl.u8 q0,q1 + vrshl.u8 q0,q1,q2 + + vrshr.s16 d0,1 + vrshr.s16 d0,d1,1 + vrshr.s16 q0,1 + vrshr.s16 q0,q1,1 + + vrshr.s32 d0,1 + vrshr.s32 d0,d1,1 + vrshr.s32 q0,1 + vrshr.s32 q0,q1,1 + + vrshr.s64 d0,1 + vrshr.s64 d0,d1,1 + vrshr.s64 q0,1 + vrshr.s64 q0,q1,1 + + vrshr.s8 d0,1 + vrshr.s8 d0,d1,1 + vrshr.s8 q0,1 + vrshr.s8 q0,q1,1 + + vrshr.u16 d0,1 + vrshr.u16 d0,d1,1 + vrshr.u16 q0,1 + vrshr.u16 q0,q1,1 + + vrshr.u32 d0,1 + vrshr.u32 d0,d1,1 + vrshr.u32 q0,1 + vrshr.u32 q0,q1,1 + + vrshr.u64 d0,1 + vrshr.u64 d0,d1,1 + vrshr.u64 q0,1 + vrshr.u64 q0,q1,1 + + vrshr.u8 d0,1 + vrshr.u8 d0,d1,1 + vrshr.u8 q0,1 + vrshr.u8 q0,q1,1 + + vrshrn.i16 d0,q1,1 + + vrshrn.i32 d0,q1,1 + + vrshrn.i64 d0,q1,1 + + vrsqrte.u32 d0,d1 + vrsqrte.u32 q0,q1 + + vrsra.s16 d0,1 + vrsra.s16 d0,d1,1 + vrsra.s16 q0,1 + vrsra.s16 q0,q1,1 + + vrsra.s32 d0,1 + vrsra.s32 d0,d1,1 + vrsra.s32 q0,1 + vrsra.s32 q0,q1,1 + + vrsra.s64 d0,1 + vrsra.s64 d0,d1,1 + vrsra.s64 q0,1 + vrsra.s64 q0,q1,1 + + vrsra.s8 d0,1 + vrsra.s8 d0,d1,1 + vrsra.s8 q0,1 + vrsra.s8 q0,q1,1 + + vrsra.u16 d0,1 + vrsra.u16 d0,d1,1 + vrsra.u16 q0,1 + vrsra.u16 q0,q1,1 + + vrsra.u32 d0,1 + vrsra.u32 d0,d1,1 + vrsra.u32 q0,1 + vrsra.u32 q0,q1,1 + + vrsra.u64 d0,1 + vrsra.u64 d0,d1,1 + vrsra.u64 q0,1 + vrsra.u64 q0,q1,1 + + vrsra.u8 d0,1 + vrsra.u8 d0,d1,1 + vrsra.u8 q0,1 + vrsra.u8 q0,q1,1 + + vrsubhn.i16 d0,q1,q2 + + vrsubhn.i32 d0,q1,q2 + + vrsubhn.i64 d0,q1,q2 + + vshl.i16 d0,1 + vshl.i16 d0,d1,1 + vshl.i16 q0,1 + vshl.i16 q0,q1,1 + + vshl.i32 d0,1 + vshl.i32 d0,d1,1 + vshl.i32 q0,1 + vshl.i32 q0,q1,1 + + vshl.i64 d0,1 + vshl.i64 d0,d1,1 + vshl.i64 q0,1 + vshl.i64 q0,q1,1 + + vshl.i8 d0,1 + vshl.i8 d0,d1,1 + vshl.i8 q0,1 + vshl.i8 q0,q1,1 + + vshl.s16 d0,d1 + vshl.s16 d0,d1,d2 + vshl.s16 q0,q1 + vshl.s16 q0,q1,q2 + + vshl.s32 d0,d1 + vshl.s32 d0,d1,d2 + vshl.s32 q0,q1 + vshl.s32 q0,q1,q2 + + vshl.s64 d0,d1 + vshl.s64 d0,d1,d2 + vshl.s64 q0,q1 + vshl.s64 q0,q1,q2 + + vshl.s8 d0,d1 + vshl.s8 d0,d1,d2 + vshl.s8 q0,q1 + vshl.s8 q0,q1,q2 + + vshl.u16 d0,d1 + vshl.u16 d0,d1,d2 + vshl.u16 q0,q1 + vshl.u16 q0,q1,q2 + + vshl.u32 d0,d1 + vshl.u32 d0,d1,d2 + vshl.u32 q0,q1 + vshl.u32 q0,q1,q2 + + vshl.u64 d0,d1 + vshl.u64 d0,d1,d2 + vshl.u64 q0,q1 + vshl.u64 q0,q1,q2 + + vshl.u8 d0,d1 + vshl.u8 d0,d1,d2 + vshl.u8 q0,q1 + vshl.u8 q0,q1,q2 + + vshll.i16 q0,d1,16 + + vshll.i32 q0,d1,32 + + vshll.i8 q0,d1,8 + + vshll.s16 q0,d1,1 + vshll.s16 q0,d1,16 + + vshll.s32 q0,d1,1 + vshll.s32 q0,d1,32 + + vshll.s8 q0,d1,1 + vshll.s8 q0,d1,8 + + vshll.u16 q0,d1,1 + vshll.u16 q0,d1,16 + + vshll.u32 q0,d1,1 + vshll.u32 q0,d1,32 + + vshll.u8 q0,d1,1 + vshll.u8 q0,d1,8 + + vshr.s16 d0,1 + vshr.s16 d0,d1,1 + vshr.s16 q0,1 + vshr.s16 q0,q1,1 + + vshr.s32 d0,1 + vshr.s32 d0,d1,1 + vshr.s32 q0,1 + vshr.s32 q0,q1,1 + + vshr.s64 d0,1 + vshr.s64 d0,d1,1 + vshr.s64 q0,1 + vshr.s64 q0,q1,1 + + vshr.s8 d0,1 + vshr.s8 d0,d1,1 + vshr.s8 q0,1 + vshr.s8 q0,q1,1 + + vshr.u16 d0,1 + vshr.u16 d0,d1,1 + vshr.u16 q0,1 + vshr.u16 q0,q1,1 + + vshr.u32 d0,1 + vshr.u32 d0,d1,1 + vshr.u32 q0,1 + vshr.u32 q0,q1,1 + + vshr.u64 d0,1 + vshr.u64 d0,d1,1 + vshr.u64 q0,1 + vshr.u64 q0,q1,1 + + vshr.u8 d0,1 + vshr.u8 d0,d1,1 + vshr.u8 q0,1 + vshr.u8 q0,q1,1 + + vshrn.i16 d0,q1,1 + + vshrn.i32 d0,q1,1 + + vshrn.i64 d0,q1,1 + + vsli.16 d0,1 + vsli.16 d0,d1,1 + vsli.16 q0,1 + vsli.16 q0,q1,1 + + vsli.32 d0,1 + vsli.32 d0,d1,1 + vsli.32 q0,1 + vsli.32 q0,q1,1 + + vsli.64 d0,1 + vsli.64 d0,d1,1 + vsli.64 q0,1 + vsli.64 q0,q1,1 + + vsli.8 d0,1 + vsli.8 d0,d1,1 + vsli.8 q0,1 + vsli.8 q0,q1,1 + + vsra.s16 d0,1 + vsra.s16 d0,d1,1 + vsra.s16 q0,1 + vsra.s16 q0,q1,1 + + vsra.s32 d0,1 + vsra.s32 d0,d1,1 + vsra.s32 q0,1 + vsra.s32 q0,q1,1 + + vsra.s64 d0,1 + vsra.s64 d0,d1,1 + vsra.s64 q0,1 + vsra.s64 q0,q1,1 + + vsra.s8 d0,1 + vsra.s8 d0,d1,1 + vsra.s8 q0,1 + vsra.s8 q0,q1,1 + + vsra.u16 d0,1 + vsra.u16 d0,d1,1 + vsra.u16 q0,1 + vsra.u16 q0,q1,1 + + vsra.u32 d0,1 + vsra.u32 d0,d1,1 + vsra.u32 q0,1 + vsra.u32 q0,q1,1 + + vsra.u64 d0,1 + vsra.u64 d0,d1,1 + vsra.u64 q0,1 + vsra.u64 q0,q1,1 + + vsra.u8 d0,1 + vsra.u8 d0,d1,1 + vsra.u8 q0,1 + vsra.u8 q0,q1,1 + + vsri.16 d0,1 + vsri.16 d0,d1,1 + vsri.16 q0,1 + vsri.16 q0,q1,1 + + vsri.32 d0,1 + vsri.32 d0,d1,1 + vsri.32 q0,1 + vsri.32 q0,q1,1 + + vsri.64 d0,1 + vsri.64 d0,d1,1 + vsri.64 q0,1 + vsri.64 q0,q1,1 + + vsri.8 d0,1 + vsri.8 d0,d1,1 + vsri.8 q0,1 + vsri.8 q0,q1,1 + + vst1.16 {d0},[r1] + vst1.16 {d0},[r1]! + vst1.16 {d0},[r1],8 + vst1.16 {d0},[r1],r2 + vst1.16 {d0},[r1@64] + vst1.16 {d0},[r1@64]! + vst1.16 {d0},[r1@64],8 + vst1.16 {d0},[r1@64],r2 + vst1.16 {d0,d1},[r2] + vst1.16 {d0,d1},[r2]! + vst1.16 {d0,d1},[r2],16 + vst1.16 {d0,d1},[r2],r3 + vst1.16 {d0,d1},[r2@64] + vst1.16 {d0,d1},[r2@64]! + vst1.16 {d0,d1},[r2@64],16 + vst1.16 {d0,d1},[r2@64],r3 + vst1.16 {d0,d1,d2},[r3] + vst1.16 {d0,d1,d2},[r3]! + vst1.16 {d0,d1,d2},[r3],24 + vst1.16 {d0,d1,d2},[r3],r4 + vst1.16 {d0,d1,d2},[r3@64] + vst1.16 {d0,d1,d2},[r3@64]! + vst1.16 {d0,d1,d2},[r3@64],24 + vst1.16 {d0,d1,d2},[r3@64],r4 + vst1.16 {d0,d1,d2,d3},[r4] + vst1.16 {d0,d1,d2,d3},[r4]! + vst1.16 {d0,d1,d2,d3},[r4],32 + vst1.16 {d0,d1,d2,d3},[r4],r5 + vst1.16 {d0,d1,d2,d3},[r4@64] + vst1.16 {d0,d1,d2,d3},[r4@64]! + vst1.16 {d0,d1,d2,d3},[r4@64],32 + vst1.16 {d0,d1,d2,d3},[r4@64],r5 + vst1.16 {d0[1]},[r2] + vst1.16 {d0[1]},[r2]! + vst1.16 {d0[1]},[r2],2 + vst1.16 {d0[1]},[r2],r3 + vst1.16 {d0[1]},[r2@16] + vst1.16 {d0[1]},[r2@16]! + vst1.16 {d0[1]},[r2@16],2 + vst1.16 {d0[1]},[r2@16],r3 + + vst1.32 {d0},[r1] + vst1.32 {d0},[r1]! + vst1.32 {d0},[r1],8 + vst1.32 {d0},[r1],r2 + vst1.32 {d0},[r1@64] + vst1.32 {d0},[r1@64]! + vst1.32 {d0},[r1@64],8 + vst1.32 {d0},[r1@64],r2 + vst1.32 {d0,d1},[r2] + vst1.32 {d0,d1},[r2]! + vst1.32 {d0,d1},[r2],16 + vst1.32 {d0,d1},[r2],r3 + vst1.32 {d0,d1},[r2@64] + vst1.32 {d0,d1},[r2@64]! + vst1.32 {d0,d1},[r2@64],16 + vst1.32 {d0,d1},[r2@64],r3 + vst1.32 {d0,d1,d2},[r3] + vst1.32 {d0,d1,d2},[r3]! + vst1.32 {d0,d1,d2},[r3],24 + vst1.32 {d0,d1,d2},[r3],r4 + vst1.32 {d0,d1,d2},[r3@64] + vst1.32 {d0,d1,d2},[r3@64]! + vst1.32 {d0,d1,d2},[r3@64],24 + vst1.32 {d0,d1,d2},[r3@64],r4 + vst1.32 {d0,d1,d2,d3},[r4] + vst1.32 {d0,d1,d2,d3},[r4]! + vst1.32 {d0,d1,d2,d3},[r4],32 + vst1.32 {d0,d1,d2,d3},[r4],r5 + vst1.32 {d0,d1,d2,d3},[r4@64] + vst1.32 {d0,d1,d2,d3},[r4@64]! + vst1.32 {d0,d1,d2,d3},[r4@64],32 + vst1.32 {d0,d1,d2,d3},[r4@64],r5 + vst1.32 {d0[1]},[r2] + vst1.32 {d0[1]},[r2]! + vst1.32 {d0[1]},[r2],4 + vst1.32 {d0[1]},[r2],r3 + vst1.32 {d0[1]},[r2@32] + vst1.32 {d0[1]},[r2@32]! + vst1.32 {d0[1]},[r2@32],4 + vst1.32 {d0[1]},[r2@32],r3 + + vst1.64 {d0},[r1] + vst1.64 {d0},[r1]! + vst1.64 {d0},[r1],8 + vst1.64 {d0},[r1],r2 + vst1.64 {d0},[r1@64] + vst1.64 {d0},[r1@64]! + vst1.64 {d0},[r1@64],8 + vst1.64 {d0},[r1@64],r2 + vst1.64 {d0,d1},[r2] + vst1.64 {d0,d1},[r2]! + vst1.64 {d0,d1},[r2],16 + vst1.64 {d0,d1},[r2],r3 + vst1.64 {d0,d1},[r2@64] + vst1.64 {d0,d1},[r2@64]! + vst1.64 {d0,d1},[r2@64],16 + vst1.64 {d0,d1},[r2@64],r3 + vst1.64 {d0,d1,d2},[r3] + vst1.64 {d0,d1,d2},[r3]! + vst1.64 {d0,d1,d2},[r3],24 + vst1.64 {d0,d1,d2},[r3],r4 + vst1.64 {d0,d1,d2},[r3@64] + vst1.64 {d0,d1,d2},[r3@64]! + vst1.64 {d0,d1,d2},[r3@64],24 + vst1.64 {d0,d1,d2},[r3@64],r4 + vst1.64 {d0,d1,d2,d3},[r4] + vst1.64 {d0,d1,d2,d3},[r4]! + vst1.64 {d0,d1,d2,d3},[r4],32 + vst1.64 {d0,d1,d2,d3},[r4],r5 + vst1.64 {d0,d1,d2,d3},[r4@64] + vst1.64 {d0,d1,d2,d3},[r4@64]! + vst1.64 {d0,d1,d2,d3},[r4@64],32 + vst1.64 {d0,d1,d2,d3},[r4@64],r5 + + vst1.8 {d0},[r1] + vst1.8 {d0},[r1]! + vst1.8 {d0},[r1],8 + vst1.8 {d0},[r1],r2 + vst1.8 {d0},[r1@64] + vst1.8 {d0},[r1@64]! + vst1.8 {d0},[r1@64],8 + vst1.8 {d0},[r1@64],r2 + vst1.8 {d0,d1},[r2] + vst1.8 {d0,d1},[r2]! + vst1.8 {d0,d1},[r2],16 + vst1.8 {d0,d1},[r2],r3 + vst1.8 {d0,d1},[r2@64] + vst1.8 {d0,d1},[r2@64]! + vst1.8 {d0,d1},[r2@64],16 + vst1.8 {d0,d1},[r2@64],r3 + vst1.8 {d0,d1,d2},[r3] + vst1.8 {d0,d1,d2},[r3]! + vst1.8 {d0,d1,d2},[r3],24 + vst1.8 {d0,d1,d2},[r3],r4 + vst1.8 {d0,d1,d2},[r3@64] + vst1.8 {d0,d1,d2},[r3@64]! + vst1.8 {d0,d1,d2},[r3@64],24 + vst1.8 {d0,d1,d2},[r3@64],r4 + vst1.8 {d0,d1,d2,d3},[r4] + vst1.8 {d0,d1,d2,d3},[r4]! + vst1.8 {d0,d1,d2,d3},[r4],32 + vst1.8 {d0,d1,d2,d3},[r4],r5 + vst1.8 {d0,d1,d2,d3},[r4@64] + vst1.8 {d0,d1,d2,d3},[r4@64]! + vst1.8 {d0,d1,d2,d3},[r4@64],32 + vst1.8 {d0,d1,d2,d3},[r4@64],r5 + vst1.8 {d0[1]},[r2] + vst1.8 {d0[1]},[r2]! + vst1.8 {d0[1]},[r2],1 + vst1.8 {d0[1]},[r2],r3 + + vst2.16 {d0,d1},[r2] + vst2.16 {d0,d1},[r2]! + vst2.16 {d0,d1},[r2],16 + vst2.16 {d0,d1},[r2],r3 + vst2.16 {d0,d1},[r2@64] + vst2.16 {d0,d1},[r2@64]! + vst2.16 {d0,d1},[r2@64],16 + vst2.16 {d0,d1},[r2@64],r3 + vst2.16 {d0,d2},[r3] + vst2.16 {d0,d2},[r3]! + vst2.16 {d0,d2},[r3],16 + vst2.16 {d0,d2},[r3],r4 + vst2.16 {d0,d2},[r3@64] + vst2.16 {d0,d2},[r3@64]! + vst2.16 {d0,d2},[r3@64],16 + vst2.16 {d0,d2},[r3@64],r4 + vst2.16 {d0,d1,d2,d3},[r4] + vst2.16 {d0,d1,d2,d3},[r4]! + vst2.16 {d0,d1,d2,d3},[r4],32 + vst2.16 {d0,d1,d2,d3},[r4],r5 + vst2.16 {d0,d1,d2,d3},[r4@64] + vst2.16 {d0,d1,d2,d3},[r4@64]! + vst2.16 {d0,d1,d2,d3},[r4@64],32 + vst2.16 {d0,d1,d2,d3},[r4@64],r5 + vst2.16 {d0[1],d1[1]},[r2] + vst2.16 {d0[1],d1[1]},[r2]! + vst2.16 {d0[1],d1[1]},[r2],4 + vst2.16 {d0[1],d1[1]},[r2],r3 + vst2.16 {d0[1],d1[1]},[r2@32] + vst2.16 {d0[1],d1[1]},[r2@32]! + vst2.16 {d0[1],d1[1]},[r2@32],4 + vst2.16 {d0[1],d1[1]},[r2@32],r3 + vst2.16 {d0[1],d2[1]},[r2] + vst2.16 {d0[1],d2[1]},[r2]! + vst2.16 {d0[1],d2[1]},[r2],4 + vst2.16 {d0[1],d2[1]},[r2],r3 + vst2.16 {d0[1],d2[1]},[r2@32] + vst2.16 {d0[1],d2[1]},[r2@32]! + vst2.16 {d0[1],d2[1]},[r2@32],4 + vst2.16 {d0[1],d2[1]},[r2@32],r3 + vst2.32 {d0,d1},[r2] + vst2.32 {d0,d1},[r2]! + vst2.32 {d0,d1},[r2],16 + vst2.32 {d0,d1},[r2],r3 + vst2.32 {d0,d1},[r2@64] + vst2.32 {d0,d1},[r2@64]! + vst2.32 {d0,d1},[r2@64],16 + vst2.32 {d0,d1},[r2@64],r3 + vst2.32 {d0,d2},[r3] + vst2.32 {d0,d2},[r3]! + vst2.32 {d0,d2},[r3],16 + vst2.32 {d0,d2},[r3],r4 + vst2.32 {d0,d2},[r3@64] + vst2.32 {d0,d2},[r3@64]! + vst2.32 {d0,d2},[r3@64],16 + vst2.32 {d0,d2},[r3@64],r4 + vst2.32 {d0,d1,d2,d3},[r4] + vst2.32 {d0,d1,d2,d3},[r4]! + vst2.32 {d0,d1,d2,d3},[r4],32 + vst2.32 {d0,d1,d2,d3},[r4],r5 + vst2.32 {d0,d1,d2,d3},[r4@64] + vst2.32 {d0,d1,d2,d3},[r4@64]! + vst2.32 {d0,d1,d2,d3},[r4@64],32 + vst2.32 {d0,d1,d2,d3},[r4@64],r5 + vst2.32 {d0[1],d1[1]},[r2] + vst2.32 {d0[1],d1[1]},[r2]! + vst2.32 {d0[1],d1[1]},[r2],8 + vst2.32 {d0[1],d1[1]},[r2],r3 + vst2.32 {d0[1],d1[1]},[r2@64] + vst2.32 {d0[1],d1[1]},[r2@64]! + vst2.32 {d0[1],d1[1]},[r2@64],8 + vst2.32 {d0[1],d1[1]},[r2@64],r3 + vst2.32 {d0[1],d2[1]},[r2] + vst2.32 {d0[1],d2[1]},[r2]! + vst2.32 {d0[1],d2[1]},[r2],8 + vst2.32 {d0[1],d2[1]},[r2],r3 + vst2.32 {d0[1],d2[1]},[r2@64] + vst2.32 {d0[1],d2[1]},[r2@64]! + vst2.32 {d0[1],d2[1]},[r2@64],8 + vst2.32 {d0[1],d2[1]},[r2@64],r3 + + vst2.8 {d0,d1},[r2] + vst2.8 {d0,d1},[r2]! + vst2.8 {d0,d1},[r2],16 + vst2.8 {d0,d1},[r2],r3 + vst2.8 {d0,d1},[r2@64] + vst2.8 {d0,d1},[r2@64]! + vst2.8 {d0,d1},[r2@64],16 + vst2.8 {d0,d1},[r2@64],r3 + vst2.8 {d0,d2},[r3] + vst2.8 {d0,d2},[r3]! + vst2.8 {d0,d2},[r3],16 + vst2.8 {d0,d2},[r3],r4 + vst2.8 {d0,d2},[r3@64] + vst2.8 {d0,d2},[r3@64]! + vst2.8 {d0,d2},[r3@64],16 + vst2.8 {d0,d2},[r3@64],r4 + vst2.8 {d0,d1,d2,d3},[r4] + vst2.8 {d0,d1,d2,d3},[r4]! + vst2.8 {d0,d1,d2,d3},[r4],32 + vst2.8 {d0,d1,d2,d3},[r4],r5 + vst2.8 {d0,d1,d2,d3},[r4@64] + vst2.8 {d0,d1,d2,d3},[r4@64]! + vst2.8 {d0,d1,d2,d3},[r4@64],32 + vst2.8 {d0,d1,d2,d3},[r4@64],r5 + vst2.8 {d0[1],d1[1]},[r2] + vst2.8 {d0[1],d1[1]},[r2]! + vst2.8 {d0[1],d1[1]},[r2],2 + vst2.8 {d0[1],d1[1]},[r2],r3 + vst2.8 {d0[1],d1[1]},[r2@16] + vst2.8 {d0[1],d1[1]},[r2@16]! + vst2.8 {d0[1],d1[1]},[r2@16],2 + vst2.8 {d0[1],d1[1]},[r2@16],r3 + + vst3.16 {d0,d1,d2},[r2] + vst3.16 {d0,d1,d2},[r2]! + vst3.16 {d0,d1,d2},[r2],24 + vst3.16 {d0,d1,d2},[r2],r3 + vst3.16 {d0,d1,d2},[r2@64] + vst3.16 {d0,d1,d2},[r2@64]! + vst3.16 {d0,d1,d2},[r2@64],24 + vst3.16 {d0,d1,d2},[r2@64],r3 + vst3.16 {d0,d2,d4},[r3] + vst3.16 {d0,d2,d4},[r3]! + vst3.16 {d0,d2,d4},[r3],24 + vst3.16 {d0,d2,d4},[r3],r4 + vst3.16 {d0,d2,d4},[r3@64] + vst3.16 {d0,d2,d4},[r3@64]! + vst3.16 {d0,d2,d4},[r3@64],24 + vst3.16 {d0,d2,d4},[r3@64],r4 + vst3.16 {d0[1],d1[1],d2[1]},[r2] + vst3.16 {d0[1],d1[1],d2[1]},[r2]! + vst3.16 {d0[1],d1[1],d2[1]},[r2],6 + vst3.16 {d0[1],d1[1],d2[1]},[r2],r3 + vst3.16 {d0[1],d2[1],d4[1]},[r2] + vst3.16 {d0[1],d2[1],d4[1]},[r2]! + vst3.16 {d0[1],d2[1],d4[1]},[r2],6 + vst3.16 {d0[1],d2[1],d4[1]},[r2],r3 + + vst3.32 {d0,d1,d2},[r2] + vst3.32 {d0,d1,d2},[r2]! + vst3.32 {d0,d1,d2},[r2],24 + vst3.32 {d0,d1,d2},[r2],r3 + vst3.32 {d0,d1,d2},[r2@64] + vst3.32 {d0,d1,d2},[r2@64]! + vst3.32 {d0,d1,d2},[r2@64],24 + vst3.32 {d0,d1,d2},[r2@64],r3 + vst3.32 {d0,d2,d4},[r3] + vst3.32 {d0,d2,d4},[r3]! + vst3.32 {d0,d2,d4},[r3],24 + vst3.32 {d0,d2,d4},[r3],r4 + vst3.32 {d0,d2,d4},[r3@64] + vst3.32 {d0,d2,d4},[r3@64]! + vst3.32 {d0,d2,d4},[r3@64],24 + vst3.32 {d0,d2,d4},[r3@64],r4 + vst3.32 {d0[1],d1[1],d2[1]},[r2] + vst3.32 {d0[1],d1[1],d2[1]},[r2]! + vst3.32 {d0[1],d1[1],d2[1]},[r2],12 + vst3.32 {d0[1],d1[1],d2[1]},[r2],r3 + vst3.32 {d0[1],d2[1],d4[1]},[r2] + vst3.32 {d0[1],d2[1],d4[1]},[r2]! + vst3.32 {d0[1],d2[1],d4[1]},[r2],12 + vst3.32 {d0[1],d2[1],d4[1]},[r2],r3 + + vst3.8 {d0,d1,d2},[r2] + vst3.8 {d0,d1,d2},[r2]! + vst3.8 {d0,d1,d2},[r2],24 + vst3.8 {d0,d1,d2},[r2],r3 + vst3.8 {d0,d1,d2},[r2@64] + vst3.8 {d0,d1,d2},[r2@64]! + vst3.8 {d0,d1,d2},[r2@64],24 + vst3.8 {d0,d1,d2},[r2@64],r3 + vst3.8 {d0,d2,d4},[r3] + vst3.8 {d0,d2,d4},[r3]! + vst3.8 {d0,d2,d4},[r3],24 + vst3.8 {d0,d2,d4},[r3],r4 + vst3.8 {d0,d2,d4},[r3@64] + vst3.8 {d0,d2,d4},[r3@64]! + vst3.8 {d0,d2,d4},[r3@64],24 + vst3.8 {d0,d2,d4},[r3@64],r4 + vst3.8 {d0[1],d1[1],d2[1]},[r2] + vst3.8 {d0[1],d1[1],d2[1]},[r2]! + vst3.8 {d0[1],d1[1],d2[1]},[r2],3 + vst3.8 {d0[1],d1[1],d2[1]},[r2],r3 + + vst4.16 {d0,d1,d2,d3},[r4] + vst4.16 {d0,d1,d2,d3},[r4]! + vst4.16 {d0,d1,d2,d3},[r4],32 + vst4.16 {d0,d1,d2,d3},[r4],r5 + vst4.16 {d0,d1,d2,d3},[r4@64] + vst4.16 {d0,d1,d2,d3},[r4@64]! + vst4.16 {d0,d1,d2,d3},[r4@64],32 + vst4.16 {d0,d1,d2,d3},[r4@64],r5 + vst4.16 {d0,d2,d4,d6},[r4] + vst4.16 {d0,d2,d4,d6},[r4]! + vst4.16 {d0,d2,d4,d6},[r4],32 + vst4.16 {d0,d2,d4,d6},[r4],r5 + vst4.16 {d0,d2,d4,d6},[r4@64] + vst4.16 {d0,d2,d4,d6},[r4@64]! + vst4.16 {d0,d2,d4,d6},[r4@64],32 + vst4.16 {d0,d2,d4,d6},[r4@64],r5 + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2] + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2],8 + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64] + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64]! + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64],8 + vst4.16 {d0[1],d1[1],d2[1],d3[1]},[r2@64],r3 + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2] + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2]! + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2],8 + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2],r3 + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64] + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64]! + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64],8 + vst4.16 {d0[1],d2[1],d4[1],d6[1]},[r2@64],r3 + + vst4.32 {d0,d1,d2,d3},[r4] + vst4.32 {d0,d1,d2,d3},[r4]! + vst4.32 {d0,d1,d2,d3},[r4],32 + vst4.32 {d0,d1,d2,d3},[r4],r5 + vst4.32 {d0,d1,d2,d3},[r4@64] + vst4.32 {d0,d1,d2,d3},[r4@64]! + vst4.32 {d0,d1,d2,d3},[r4@64],32 + vst4.32 {d0,d1,d2,d3},[r4@64],r5 + vst4.32 {d0,d2,d4,d6},[r4] + vst4.32 {d0,d2,d4,d6},[r4]! + vst4.32 {d0,d2,d4,d6},[r4],32 + vst4.32 {d0,d2,d4,d6},[r4],r5 + vst4.32 {d0,d2,d4,d6},[r4@64] + vst4.32 {d0,d2,d4,d6},[r4@64]! + vst4.32 {d0,d2,d4,d6},[r4@64],32 + vst4.32 {d0,d2,d4,d6},[r4@64],r5 + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2] + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2],16 + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64] + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64]! + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64],16 + vst4.32 {d0[1],d1[1],d2[1],d3[1]},[r2@64],r3 + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2] + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2]! + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2],16 + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2],r3 + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64] + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64]! + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64],16 + vst4.32 {d0[1],d2[1],d4[1],d6[1]},[r2@64],r3 + + vst4.8 {d0,d1,d2,d3},[r4] + vst4.8 {d0,d1,d2,d3},[r4]! + vst4.8 {d0,d1,d2,d3},[r4],32 + vst4.8 {d0,d1,d2,d3},[r4],r5 + vst4.8 {d0,d1,d2,d3},[r4@64] + vst4.8 {d0,d1,d2,d3},[r4@64]! + vst4.8 {d0,d1,d2,d3},[r4@64],32 + vst4.8 {d0,d1,d2,d3},[r4@64],r5 + vst4.8 {d0,d2,d4,d6},[r4] + vst4.8 {d0,d2,d4,d6},[r4]! + vst4.8 {d0,d2,d4,d6},[r4],32 + vst4.8 {d0,d2,d4,d6},[r4],r5 + vst4.8 {d0,d2,d4,d6},[r4@64] + vst4.8 {d0,d2,d4,d6},[r4@64]! + vst4.8 {d0,d2,d4,d6},[r4@64],32 + vst4.8 {d0,d2,d4,d6},[r4@64],r5 + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2] + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2]! + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2],4 + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2],r3 + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32] + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32]! + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32],4 + vst4.8 {d0[1],d1[1],d2[1],d3[1]},[r2@32],r3 + + vsub.i16 d0,d1 + vsub.i16 d0,d1,d2 + vsub.i16 q0,q1 + vsub.i16 q0,q1,q2 + + vsub.i32 d0,d1 + vsub.i32 d0,d1,d2 + vsub.i32 q0,q1 + vsub.i32 q0,q1,q2 + + vsub.i64 d0,d1 + vsub.i64 d0,d1,d2 + vsub.i64 q0,q1 + vsub.i64 q0,q1,q2 + + vsub.i8 d0,d1 + vsub.i8 d0,d1,d2 + vsub.i8 q0,q1 + vsub.i8 q0,q1,q2 + + vsubhn.i16 d0,q1,q2 + + vsubhn.i32 d0,q1,q2 + + vsubhn.i64 d0,q1,q2 + + vsubl.s16 q0,d1,d2 + + vsubl.s32 q0,d1,d2 + + vsubl.s8 q0,d1,d2 + + vsubl.u16 q0,d1,d2 + + vsubl.u32 q0,d1,d2 + + vsubl.u8 q0,d1,d2 + + vsubw.s16 q0,d1 + vsubw.s16 q0,q1,d2 + + vsubw.s32 q0,d1 + vsubw.s32 q0,q1,d2 + + vsubw.s8 q0,d1 + vsubw.s8 q0,q1,d2 + + vsubw.u16 q0,d1 + vsubw.u16 q0,q1,d2 + + vsubw.u32 q0,d1 + vsubw.u32 q0,q1,d2 + + vsubw.u8 q0,d1 + vsubw.u8 q0,q1,d2 + + vswp d0,d1 + vswp q0,q1 + + vtbl.8 d0,{d1},d2 + vtbl.8 d0,{d1,d2},d3 + vtbl.8 d0,{d1,d2,d3},d4 + vtbl.8 d0,{d1,d2,d3,d4},d5 + + vtbx.8 d0,{d1},d2 + vtbx.8 d0,{d1,d2},d3 + vtbx.8 d0,{d1,d2,d3},d4 + vtbx.8 d0,{d1,d2,d3,d4},d5 + + vtrn.16 d0,d1 + vtrn.16 q0,q1 + + vtrn.32 d0,d1 + vtrn.32 q0,q1 + + vtrn.8 d0,d1 + vtrn.8 q0,q1 + + vtst.16 d0,d1 + vtst.16 d0,d1,d2 + vtst.16 q0,q1 + vtst.16 q0,q1,q2 + + vtst.32 d0,d1 + vtst.32 d0,d1,d2 + vtst.32 q0,q1 + vtst.32 q0,q1,q2 + + vtst.8 d0,d1 + vtst.8 d0,d1,d2 + vtst.8 q0,q1 + vtst.8 q0,q1,q2 + + vuzp.16 d0,d1 + vuzp.16 q0,q1 + + vuzp.32 d0,d1 + vuzp.32 q0,q1 + + vuzp.8 d0,d1 + vuzp.8 q0,q1 + + vzip.16 d0,d1 + vzip.16 q0,q1 + + vzip.32 d0,d1 + vzip.32 q0,q1 + + vzip.8 d0,d1 + vzip.8 q0,q1 + +coprocessor COPRO_SIMD_FLOAT + + vabd.f32 d0,d1 + vabd.f32 d0,d1,d2 + vabd.f32 q0,q1 + vabd.f32 q0,q1,q2 + + vabs.f32 d0,d1 + vabs.f32 q0,q1 + + vacge.f32 d0,d1 + vacge.f32 d0,d1,d2 + vacge.f32 q0,q1 + vacge.f32 q0,q1,q2 + + vacgt.f32 d0,d1 + vacgt.f32 d0,d1,d2 + vacgt.f32 q0,q1 + vacgt.f32 q0,q1,q2 + + vacle.f32 d0,d1 + vacle.f32 d0,d1,d2 + vacle.f32 q0,q1 + vacle.f32 q0,q1,q2 + + vaclt.f32 d0,d1 + vaclt.f32 d0,d1,d2 + vaclt.f32 q0,q1 + vaclt.f32 q0,q1,q2 + + vadd.f32 d0,d1 + vadd.f32 d0,d1,d2 + vadd.f32 q0,q1 + vadd.f32 q0,q1,q2 + + vceq.f32 d0,0 + vceq.f32 d0,d1 + vceq.f32 d0,d1,0 + vceq.f32 d0,d1,d2 + vceq.f32 q0,0 + vceq.f32 q0,q1 + vceq.f32 q0,q1,0 + vceq.f32 q0,q1,q2 + + vcge.f32 d0,0 + vcge.f32 d0,d1 + vcge.f32 d0,d1,0 + vcge.f32 d0,d1,d2 + vcge.f32 q0,0 + vcge.f32 q0,q1 + vcge.f32 q0,q1,0 + vcge.f32 q0,q1,q2 + + vcgt.f32 d0,0 + vcgt.f32 d0,d1 + vcgt.f32 d0,d1,0 + vcgt.f32 d0,d1,d2 + vcgt.f32 q0,0 + vcgt.f32 q0,q1 + vcgt.f32 q0,q1,0 + vcgt.f32 q0,q1,q2 + + vcle.f32 d0,0 + vcle.f32 d0,d1 + vcle.f32 d0,d1,0 + vcle.f32 d0,d1,d2 + vcle.f32 q0,0 + vcle.f32 q0,q1 + vcle.f32 q0,q1,0 + vcle.f32 q0,q1,q2 + + vclt.f32 d0,0 + vclt.f32 d0,d1 + vclt.f32 d0,d1,0 + vclt.f32 d0,d1,d2 + vclt.f32 q0,0 + vclt.f32 q0,q1 + vclt.f32 q0,q1,0 + vclt.f32 q0,q1,q2 + + vcvt.f32.s32 d0,d1 + vcvt.f32.s32 d0,d1,2 + vcvt.f32.s32 q0,q1 + vcvt.f32.s32 q0,q1,2 + + vcvt.f32.u32 d0,d1 + vcvt.f32.u32 d0,d1,2 + vcvt.f32.u32 q0,q1 + vcvt.f32.u32 q0,q1,2 + + vcvt.s32.f32 d0,d1 + vcvt.s32.f32 d0,d1,2 + vcvt.s32.f32 q0,q1 + vcvt.s32.f32 q0,q1,2 + + vcvt.u32.f32 d0,d1 + vcvt.u32.f32 d0,d1,2 + vcvt.u32.f32 q0,q1 + vcvt.u32.f32 q0,q1,2 + + vmax.f32 d0,d1 + vmax.f32 d0,d1,d2 + vmax.f32 q0,q1 + vmax.f32 q0,q1,q2 + + vmin.f32 d0,d1 + vmin.f32 d0,d1,d2 + vmin.f32 q0,q1 + vmin.f32 q0,q1,q2 + + vmla.f32 d0,d1,d2 + vmla.f32 d0,d1,d2[0] + vmla.f32 q0,q1,q2 + vmla.f32 q0,q1,d2[1] + + vmls.f32 d0,d1,d2 + vmls.f32 d0,d1,d2[0] + vmls.f32 q0,q1,q2 + vmls.f32 q0,q1,d2[1] + + vmov.f32 d0,1 + vmov.f32 d0,1.0 + vmov.f32 q0,1 + vmov.f32 q0,1.0 + + vmul.f32 d0,d1 + vmul.f32 d0,d1,d2 + vmul.f32 d0,d1[0] + vmul.f32 d0,d1,d2[0] + vmul.f32 q0,q1 + vmul.f32 q0,q1,q2 + vmul.f32 q0,d1[0] + vmul.f32 q0,q1,d1[0] + + vneg.f32 d0,d1 + vneg.f32 q0,q1 + + vpadd.f32 d0,d1 + vpadd.f32 d0,d1,d2 + + vpmax.f32 d0,d1 + vpmax.f32 d0,d1,d2 + + vpmin.f32 d0,d1 + vpmin.f32 d0,d1,d2 + + vrecpe.f32 d0,d1 + vrecpe.f32 q0,q1 + + vrecps.f32 d0,d1 + vrecps.f32 d0,d1,d2 + vrecps.f32 q0,q1 + vrecps.f32 q0,q1,q2 + + vrsqrte.f32 d0,d1 + vrsqrte.f32 q0,q1 + + vrsqrts.f32 d0,d1 + vrsqrts.f32 d0,d1,d2 + vrsqrts.f32 q0,q1 + vrsqrts.f32 q0,q1,q2 + + vsub.f32 d0,d1 + vsub.f32 d0,d1,d2 + vsub.f32 q0,q1 + vsub.f32 q0,q1,q2 + +coprocessor COPRO_SIMD_HP + + vcvt.f32.f16 q0,d1 + + vcvt.f16.f32 d0,q1 + +coprocessor COPRO_SIMD_V2 + + vfma.f32 q0,q1,q2 + vfma.f32 d0,d1,d2 + + vfms.f32 q0,q1,q2 + vfms.f32 d0,d1,d2 + +coprocessor COPRO_SIMD_V8 + + vcvtm.s32.f32 d0,d1 + vcvtm.u32.f32 d0,d1 + vcvtm.s32.f32 q0,q1 + vcvtm.u32.f32 q0,q1 + + vcvtp.s32.f32 d0,d1 + vcvtp.u32.f32 d0,d1 + vcvtp.s32.f32 q0,q1 + vcvtp.u32.f32 q0,q1 + + vcvtn.s32.f32 d0,d1 + vcvtn.u32.f32 d0,d1 + vcvtn.s32.f32 q0,q1 + vcvtn.u32.f32 q0,q1 + + vcvta.s32.f32 d0,d1 + vcvta.u32.f32 d0,d1 + vcvta.s32.f32 q0,q1 + vcvta.u32.f32 q0,q1 + + vmaxnm.f32 d0,d1,d2 + vmaxnm.f32 q0,q1,q2 + + vminnm.f32 d0,d1,d2 + vminnm.f32 q0,q1,q2 + + vrintm.f32.f32 d0,d1 + vrintm.f32.f32 q0,q1 + + vrintp.f32.f32 d0,d1 + vrintp.f32.f32 q0,q1 + + vrintn.f32.f32 d0,d1 + vrintn.f32.f32 q0,q1 + + vrinta.f32.f32 d0,d1 + vrinta.f32.f32 q0,q1 + + vrintx.f32.f32 d0,d1 + vrintx.f32.f32 q0,q1 + + vrintz.f32.f32 d0,d1 + vrintz.f32.f32 q0,q1 + +coprocessor COPRO_SIMD_CRYPTO + + aese.8 q0,q1 + aesd.8 q0,q1 + aesmc.8 q0,q1 + aesimc.8 q0,q1 + + sha1h.32 q0,q1 + sha1c.32 q0,q1,q2 + sha1p.32 q0,q1,q2 + sha1m.32 q0,q1,q2 + sha1su0.32 q0,q1,q2 + sha1su1.32 q0,q1 + + sha256h.32 q0,q1,q2 + sha256h2.32 q0,q1,q2 + sha256su0.32 q0,q1 + sha256su1.32 q0,q1,q2 + + vmull.p64 q0,d1,d2 diff --git a/armdoc/InstructionFormatsTHUMB16.asm b/armdoc/InstructionFormatsTHUMB16.asm new file mode 100644 index 0000000..42f492a --- /dev/null +++ b/armdoc/InstructionFormatsTHUMB16.asm @@ -0,0 +1,477 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition or flag +;writeback ("s") syntaxes. Almost all instructions can +;be conditional. The condition code should be added at +;the end of the main opcode and before any size/type +;specifiers. For example: "addhi" and "vaddhi.i16". The +;syntax also supports the pre-UAL style of putting the +;condition before any modifiers like "s" or "fd". For +;example: "ldmhifd", "ldmfdhi" and "addhis", "addshi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;THUMB mode, pre-UAL 16-bit instructions + ;*********************************************** + + code16 ;pre-UAL syntax, the 's' is otional + +macro align {times(($ and 2)shr 1)dh 0xde_00} + +processor CPU32_V4T + + adc r0,r1 + adc r0,r0,r1 + + add r0,r1,2 + add r0,1 + add r0,r1,r2 + add r0,r0,3 + + and r0,r1 + and r0,r0,r1 + + asr r0,1 + asr r0,r1,2 + asr r0,r1 + asr r0,r0,r1 + + bic r0,r1 + bic r0,r0,r1 + + eor r0,r1 + eor r0,r0,r1 + + ldm r0!,{r1} + ldm r0!,{r0} + + ldmia r0!,{r1} + ldmia r0!,{r0} + + lsl r0,1 + lsl r0,r1,2 + lsl r0,r1 + lsl r0,r0,r1 + + lsr r0,1 + lsr r0,r1,2 + lsr r0,r1 + lsr r0,r0,r1 + + mov r0,1 + mov r0,r1 + mov r0,expression.dword + + mul r0,r1 + mul r0,r1,r0 + mul r0,r0,r1 + + mvn r0,r1 + + neg r0 + neg r0,r1 + + orr r0,r1 + orr r0,r0,r1 + + ror r0,r1 + ror r0,r0,r1 + + rsb r0,0 + rsb r0,r1,0 + + sbc r0,r1 + sbc r0,r0,r1 + + sub r0,r1,2 + sub r0,1 + sub r0,r1,r2 + sub r0,r0,3 + + ;*********************************************** + ;THUMB mode, UAL 16-bit instructions + ;*********************************************** + + thumb ;UAL syntax, the 's', if given, is mandatory + + adcs r0,r1 + adcs r0,r0,r1 + + adds r0,r1,2 + adds r0,1 + adds r0,r1,r2 + + ands r0,r1 + ands r0,r0,r1 + + asrs r0,1 + asrs r0,r1,2 + asrs r0,r1 + asrs r0,r0,r1 + + bics r0,r1 + bics r0,r0,r1 + + eors r0,r1 + eors r0,r0,r1 + + ldm r0!,{r1} + ldm r0,{r0} + + ldmia r0!,{r1} + ldmia r0,{r0} + + lsls r0,1 + lsls r0,r1,2 + lsls r0,r1 + lsls r0,r0,r1 + + lsrs r0,1 + lsrs r0,r1,2 + lsrs r0,r1 + lsrs r0,r0,r1 + + movs r0,1 + movs r0,r1 + movs r0,expression.dword + + muls r0,r1 + muls r0,r1,r0 + muls r0,r0,r1 + + mvns r0,r1 + + negs r0 + negs r0,r1 + + orrs r0,r1 + orrs r0,r0,r1 + + rors r0,r1 + rors r0,r0,r1 + + rsbs r0,0 + rsbs r0,r1,0 + + sbcs r0,r1 + sbcs r0,r0,r1 + + subs r0,r1,2 + subs r0,1 + subs r0,r1,r2 + + ;both pre-UAL and UAL syntaxes, no 's' is allowed + + add r8,r9 + add r0,sp,4 + add sp,4 + add sp,sp,4 + add r0,pc,4 + + adr r0,label_adr_t16 + align + label_adr_t16: + + bx r0 + + cmn r0,r1 + + cmp r0,1 + cmp r0,r1 + cmp r8,r9 + + ldr r0,[r1] + ldr r0,[r1,4] + ldr r0,[sp] + ldr r0,[sp,4] + ldr r0,[label_ldr_t16] + ldr r0,[pc] + ldr r0,[pc,4] + ldr r0,[r1,r2] + ldr r1,[sp],4 + ldr r15,[sp],4 + align + label_ldr_t16: + + ldrb r0,[r1] + ldrb r0,[r1,2] + ldrb r0,[r1,r2] + + ldrh r0,[r1] + ldrh r0,[r1,2] + ldrh r0,[r1,r2] + + ldrsb r0,[r1,r2] + + ldrsh r0,[r1,r2] + + mov r8,r9 + + nop + + pop {r0} + pop {r0,r15} + + push {r0} + push {r0,r14} + + stm r0!,{r1} + stm r0!,{r1,r2} + + stmia r0!,{r1} + stmia r0!,{r1,r2} + + str r0,[r1] + str r0,[r1,4] + str r0,[sp] + str r0,[sp,4] + str r0,[r1,r2] + str r1,[sp,-4]! + str r14,[sp,-4]! + + strb r0,[r1] + strb r0,[r1,4] + strb r0,[r1,r2] + + strh r0,[r1] + strh r0,[r1,4] + strb r0,[r1,r2] + + sub sp,4 + sub sp,sp,4 + + svc 0 + + swi 0 + + tst r0,r1 + + bcc label_bcc_t16 + label_bcc_t16: + + b label_b_t16 + label_b_t16: + +processor CPU32_V5T + + bkpt 0 + + blx r0 + +processor CPU32_V6T + + cpy r0,r1 + + rev r0,r1 + + rev16 r0,r1 + + revsh r0,r1 + + sxtb r0 + sxtb r0,r1 + + sxth r0 + sxth r0,r1 + + uxtb r0 + uxtb r0,r1 + + uxth r0 + uxth r0,r1 + +processor CPU32_ALIGN + + cpsie iflags_a + + cpsid iflags_a + + setend le + +processor CPU32_6M + + add r0,r1 + + yield + + wfe + + wfi + + sev + +processor CPU32_7M + + cbnz r0,label_cbnz_t16 + dh 0xde00 + label_cbnz_t16: + + cbz r0,label_cbz_t16 + dh 0xde00 + label_cbz_t16: + +processor CPU32_7M + CPU32_V5T + + it cc + bkpt 0 ;dummy fill to satisfy IT checks + + ite cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itee cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + iteee cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + iteet cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itet cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itete cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itett cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itt cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itte cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + ittee cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + ittet cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + ittt cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + ittte cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + itttt cc + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + bkpt 0 ;dummy fill to satisfy IT checks + + ;*********************************************** + ;THUMBEE mode, 16-bit instructions + ;*********************************************** + + thumbee + +processor CPU32_T2EE + + chka r0,r1 + + hb 0 + hbl 0 + hblp 0,0 + hbp 0,0 + + ldr r0,[r1,r2,lsl 2] + ldr r0,[r1,-4] + ldr r0,[r9] + ldr r0,[r9,4] + ldr r0,[r10] + ldr r0,[r10,4] + + ldrb r0,[r1,r2] + + ldrh r0,[r1,r2,lsl 1] + + ldrsb r0,[r1,r2] + + ldrsh r0,[r1,r2,lsl 1] + + str r0,[r1,r2,lsl 2] + str r0,[r9] + str r0,[r9,4] + + strb r0,[r1,r2] + + strh r0,[r1,r2,lsl 1] + +processor CPU32_V8 + + hlt 0 + + sevl + sevl.n + +processor 0 ;16-bit UND is always encodable, it ignores the processor directive + + und + und 0 diff --git a/armdoc/InstructionFormatsTHUMB32.asm b/armdoc/InstructionFormatsTHUMB32.asm new file mode 100644 index 0000000..67b0ba3 --- /dev/null +++ b/armdoc/InstructionFormatsTHUMB32.asm @@ -0,0 +1,1226 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition or flag +;writeback ("s") syntaxes. Almost all instructions can +;be conditional. The condition code should be added at +;the end of the main opcode and before any size/type +;specifiers. For example: "addhi" and "vaddhi.i16". The +;syntax also supports the pre-UAL style of putting the +;condition before any modifiers like "s" or "fd". For +;example: "ldmhifd", "ldmfdhi" and "addhis", "addshi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;THUMB mode, 32-bit instructions + ;*********************************************** + + thumb + +processor CPU32_V4T + + label_bl_t32: + bl label_bl_t32 + +processor CPU32_X + + label_blx_t32: + blx label_blx_t32 + +processor CPU32_Z + + smc 0 + + smi 0 + +processor CPU32_6M + + dmb + dmb sy + + dsb + dsb sy + + isb + isb sy + + mrs r0,primask + + msr primask,r0 + +processor CPU32_7M + + adc r0,1 + adc r0,r1 + adc r0,r1,rrx + adc r0,r1,lsl 2 + adc r0,r1,lsr 2 + adc r0,r1,asr 2 + adc r0,r1,ror 2 + adc r0,r1,2 + adc r0,r1,r2 + adc r0,r1,r2,rrx + adc r0,r1,r2,lsl 3 + adc r0,r1,r2,lsr 3 + adc r0,r1,r2,asr 3 + adc r0,r1,r2,ror 3 + + add r0,1 + add r0,r1 + add r0,r1,rrx + add r0,r1,lsl 2 + add r0,r1,lsr 2 + add r0,r1,asr 2 + add r0,r1,ror 2 + add r0,r1,2 + add r0,r1,r2 + add r0,r1,r2,rrx + add r0,r1,r2,lsl 3 + add r0,r1,r2,lsr 3 + add r0,r1,r2,asr 3 + add r0,r1,r2,ror 3 + + addw r0,1 + addw r0,r1,2 + + label_adr_t32: + adr r0,label_adr_t32 + + and r0,1 + and r0,r1 + and r0,r1,rrx + and r0,r1,lsl 2 + and r0,r1,lsr 2 + and r0,r1,asr 2 + and r0,r1,ror 2 + and r0,r1,2 + and r0,r1,r2 + and r0,r1,r2,rrx + and r0,r1,r2,lsl 3 + and r0,r1,r2,lsr 3 + and r0,r1,r2,asr 3 + and r0,r1,r2,ror 3 + + asr r0,1 + asr r0,r1 + asr r0,r1,2 + asr r0,r1,r2 + + label_b_t32: + b label_b_t32 + + label_bcc_t32: + bcc label_bcc_t32 + + bfc r0,1,2 + + bfi r0,r1,2,3 + + bic r0,1 + bic r0,r1 + bic r0,r1,rrx + bic r0,r1,lsl 2 + bic r0,r1,lsr 2 + bic r0,r1,asr 2 + bic r0,r1,ror 2 + bic r0,r1,2 + bic r0,r1,r2 + bic r0,r1,r2,rrx + bic r0,r1,r2,lsl 3 + bic r0,r1,r2,lsr 3 + bic r0,r1,r2,asr 3 + bic r0,r1,r2,ror 3 + + cdp p9,1,c2,c3,c4 + cdp p9,1,c2,c3,c4,5 + + cdp2 p9,1,c2,c3,c4 + cdp2 p9,1,c2,c3,c4,5 + + clrex + + clz r0,r1 + + cmn r0,1 + cmn r0,r1 + cmn r0,r1,rrx + cmn r0,r1,lsl 2 + cmn r0,r1,lsr 2 + cmn r0,r1,asr 2 + cmn r0,r1,ror 2 + + cmp r0,1 + cmp r0,r1 + cmp r0,r1,rrx + cmp r0,r1,lsl 2 + cmp r0,r1,lsr 2 + cmp r0,r1,asr 2 + cmp r0,r1,ror 2 + + cpy r0,r1 + + dbg 0 + + eor r0,1 + eor r0,r1 + eor r0,r1,rrx + eor r0,r1,lsl 2 + eor r0,r1,lsr 2 + eor r0,r1,asr 2 + eor r0,r1,ror 2 + eor r0,r1,2 + eor r0,r1,r2 + eor r0,r1,r2,rrx + eor r0,r1,r2,lsl 3 + eor r0,r1,r2,lsr 3 + eor r0,r1,r2,asr 3 + eor r0,r1,r2,ror 3 + + label_ldc_t32: + ldc p9,c1,[r2] + ldc p9,c1,[r2],4 + ldc p9,c1,[r2],{4} + ldc p9,c1,[r2,4] + ldc p9,c1,[r2,4]! + ldc p9,c1,[label_ldc_t32] + ldc p9,c1,[expression.word] + ldc p9,c1,[expression.word]! + + label_ldc2_t32: + ldc2 p9,c1,[r2] + ldc2 p9,c1,[r2],4 + ldc2 p9,c1,[r2],{4} + ldc2 p9,c1,[r2,4] + ldc2 p9,c1,[r2,4]! + ldc2 p9,c1,[label_ldc2_t32] + ldc2 p9,c1,[expression.word] + ldc2 p9,c1,[expression.word]! + + label_ldc2l_t32: + ldc2l p9,c1,[r2] + ldc2l p9,c1,[r2],4 + ldc2l p9,c1,[r2],{4} + ldc2l p9,c1,[r2,4] + ldc2l p9,c1,[r2,4]! + ldc2l p9,c1,[label_ldc2l_t32] + ldc2l p9,c1,[expression.word] + ldc2l p9,c1,[expression.word]! + + label_ldcl_t32: + ldcl p9,c1,[r2] + ldcl p9,c1,[r2],4 + ldcl p9,c1,[r2],{4} + ldcl p9,c1,[r2,4] + ldcl p9,c1,[r2,4]! + ldcl p9,c1,[label_ldcl_t32] + ldcl p9,c1,[expression.word] + ldcl p9,c1,[expression.word]! + + ldm r0,{r1} + ldm r0,{r1,r2} + ldm r0,{r1-r3} + ldm r0,{r1-r3,r5} + ldm r0!,{r1} + ldm r0!,{r1,r2} + ldm r0!,{r1-r3} + ldm r0!,{r1-r3,r5} + + ldmia r0,{r1} + ldmia r0,{r1,r2} + ldmia r0,{r1-r3} + ldmia r0,{r1-r3,r5} + ldmia r0!,{r1} + ldmia r0!,{r1,r2} + ldmia r0!,{r1-r3} + ldmia r0!,{r1-r3,r5} + + ldmdb r0,{r1} + ldmdb r0,{r1,r2} + ldmdb r0,{r1-r3} + ldmdb r0,{r1-r3,r5} + ldmdb r0!,{r1} + ldmdb r0!,{r1,r2} + ldmdb r0!,{r1-r3} + ldmdb r0!,{r1-r3,r5} + + ldmea r0,{r1} + ldmea r0,{r1,r2} + ldmea r0,{r1-r3} + ldmea r0,{r1-r3,r5} + ldmea r0!,{r1} + ldmea r0!,{r1,r2} + ldmea r0!,{r1-r3} + ldmea r0!,{r1-r3,r5} + + ldmfd r0,{r1} + ldmfd r0,{r1,r2} + ldmfd r0,{r1-r3} + ldmfd r0,{r1-r3,r5} + ldmfd r0!,{r1} + ldmfd r0!,{r1,r2} + ldmfd r0!,{r1-r3} + ldmfd r0!,{r1-r3,r5} + + label_ldr_t32: + ldr r0,[r1] + ldr r0,[r1],2 + ldr r0,[r1],4 + ldr r0,[r1,2] + ldr r0,[r1,2]! + ldr r0,[r1,r2] + ldr r0,[r1,r2,lsl 3] + ldr r0,[label_ldr_t32] + ldr r0,[expression.word] + ldr r0,[expression.word]! + + label_ldrb_t32: + ldrb r0,[r1] + ldrb r0,[r1],2 + ldrb r0,[r1],4 + ldrb r0,[r1,2] + ldrb r0,[r1,2]! + ldrb r0,[r1,r2] + ldrb r0,[r1,r2,lsl 3] + ldrb r0,[label_ldrb_t32] + ldrb r0,[expression.byte] + ldrb r0,[expression.byte]! + + ldrb r0,[r13] + ldrb r0,[r13,2] + ldrb r0,[r13,r2] + + ldrbt r0,[r1] + ldrbt r0,[r1,2] + ldrbt r0,[expression.byte] + + label_ldrd_t32: + ldrd r0,[r1] + ldrd r0,[r2],4 + ldrd r0,[r1,4] + ldrd r0,[r2,4]! + ldrd r0,[label_ldrd_t32] + ldrd r2,[expression.dword] + ldrd r2,[expression.dword]! + ldrd r0,r1,[r2] + ldrd r0,r1,[r2],4 + ldrd r0,r1,[r2,4] + ldrd r0,r1,[r2,4]! + ldrd r0,r1,[label_ldrd_t32] + ldrd r0,r2,[expression.dword] + ldrd r0,r2,[expression.dword]! + + ldrex r0,[r1] + ldrex r0,[r1,4] + ldrex r0,[expression.word] + + label_ldrh_t32: + ldrh r0,[r1] + ldrh r0,[r1],2 + ldrh r0,[r1],4 + ldrh r0,[r1,2] + ldrh r0,[r1,2]! + ldrh r0,[r1,r2] + ldrh r0,[r1,r2,lsl 3] + ldrh r0,[label_ldrh_t32] + ldrh r0,[expression.hword] + ldrh r0,[expression.hword]! + + ldrh r0,[r13] + ldrh r0,[r13,2] + ldrh r0,[r13,r2] + + ldrht r0,[r1] + ldrht r0,[r1,2] + ldrht r0,[expression.hword] + + label_ldrsb_t32: + ldrsb r0,[r1] + ldrsb r0,[r1],2 + ldrsb r0,[r1],4 + ldrsb r0,[r1,2] + ldrsb r0,[r1,2]! + ldrsb r0,[r1,r2] + ldrsb r0,[r1,r2,lsl 3] + ldrsb r0,[label_ldrsb_t32] + ldrsb r0,[expression.byte] + ldrsb r0,[expression.byte]! + + ldrsbt r0,[r1] + ldrsbt r0,[r1,2] + ldrsbt r0,[expression.byte] + + label_ldrsh_t32: + ldrsh r0,[r1] + ldrsh r0,[r1],2 + ldrsh r0,[r1],4 + ldrsh r0,[r1,2] + ldrsh r0,[r1,2]! + ldrsh r0,[r1,r2] + ldrsh r0,[r1,r2,lsl 3] + ldrsh r0,[label_ldrsh_t32] + ldrsh r0,[expression.hword] + ldrsh r0,[expression.hword]! + + ldrsht r0,[r1] + ldrsht r0,[r1,2] + ldrsht r0,[expression.hword] + + ldrt r0,[r1] + ldrt r0,[r1,2] + ldrt r0,[expression.word] + + lsl r0,1 + lsl r0,r1 + lsl r0,r1,2 + lsl r0,r1,r2 + + lsr r0,1 + lsr r0,r1 + lsr r0,r1,2 + lsr r0,r1,r2 + + mcr p9,1,r2,c3,c4 + mcr p9,1,r2,c3,c4,5 + + mcr2 p9,1,r2,c3,c4 + mcr2 p9,1,r2,c3,c4,5 + + mcrr p9,1,r2,r3,c4 + + mcrr2 p9,1,r2,r3,c4 + + mla r0,r1,r2,r3 + + mls r0,r1,r2,r3 + + mov r0,1 + mov r0,r1 + mov r0,r1,rrx + mov r0,r1,lsl 2 + mov r0,r1,lsr 2 + mov r0,r1,asr 2 + mov r0,r1,ror 2 + mov r0,r1,lsl r2 + mov r0,r1,lsr r2 + mov r0,r1,asr r2 + mov r0,r1,ror r2 + mov r0,expression.word + + movt r0,1 + + movw r0,1 + + mrc p9,1,r2,c3,c4 + mrc p9,1,r15,c3,c4,5 + + mrc2 p9,1,r2,c3,c4 + mrc2 p9,1,r15,c3,c4,5 + + mrrc p9,1,r2,r3,c4 + + mrrc2 p9,1,r2,r3,c4 + + mrs r0,basepri + + msr basepri,r0 + + mul r0,r1 + mul r0,r1,r2 + + mvn r0,1 + mvn r0,r1 + mvn r0,r1,rrx + mvn r0,r1,lsl 2 + mvn r0,r1,lsr 2 + mvn r0,r1,asr 2 + mvn r0,r1,ror 2 + + neg r0 + neg r0,r1 + + nop + + orn r0,1 + orn r0,r1 + orn r0,r1,rrx + orn r0,r1,lsl 2 + orn r0,r1,lsr 2 + orn r0,r1,asr 2 + orn r0,r1,ror 2 + orn r0,r1,2 + orn r0,r1,r2 + orn r0,r1,r2,rrx + orn r0,r1,r2,lsl 3 + orn r0,r1,r2,lsr 3 + orn r0,r1,r2,asr 3 + orn r0,r1,r2,ror 3 + + orr r0,1 + orr r0,r1 + orr r0,r1,rrx + orr r0,r1,lsl 2 + orr r0,r1,lsr 2 + orr r0,r1,asr 2 + orr r0,r1,ror 2 + orr r0,r1,2 + orr r0,r1,r2 + orr r0,r1,r2,rrx + orr r0,r1,r2,lsl 3 + orr r0,r1,r2,lsr 3 + orr r0,r1,r2,asr 3 + orr r0,r1,r2,ror 3 + + label_pld_t32: + pld [r1] + pld [r1,2] + pld [r1,r2] + pld [r1,r2,lsl 3] + pld [label_pld_t32] + pld [expression.byte] + + pop {r0} + pop {r0,r1} + pop {r0-r2} + pop {r0-r2,r4} + + push {r0} + push {r0,r1} + push {r0-r2} + push {r0-r2,r4} + + rbit r0,r1 + + rev r0,r1 + + rev16 r0,r1 + + revsh r0,r1 + + ror r0,1 + ror r0,r1 + ror r0,r1,2 + ror r0,r1,r2 + + rrx r0 + rrx r0,r1 + + rsb r0,1 + rsb r0,r1 + rsb r0,r1,rrx + rsb r0,r1,lsl 2 + rsb r0,r1,lsr 2 + rsb r0,r1,asr 2 + rsb r0,r1,ror 2 + rsb r0,r1,2 + rsb r0,r1,r2 + rsb r0,r1,r2,rrx + rsb r0,r1,r2,lsl 3 + rsb r0,r1,r2,lsr 3 + rsb r0,r1,r2,asr 3 + rsb r0,r1,r2,ror 3 + + sbc r0,1 + sbc r0,r1 + sbc r0,r1,rrx + sbc r0,r1,lsl 2 + sbc r0,r1,lsr 2 + sbc r0,r1,asr 2 + sbc r0,r1,ror 2 + sbc r0,r1,2 + sbc r0,r1,r2 + sbc r0,r1,r2,rrx + sbc r0,r1,r2,lsl 3 + sbc r0,r1,r2,lsr 3 + sbc r0,r1,r2,asr 3 + sbc r0,r1,r2,ror 3 + + sbfx r0,r1,2,3 + + sev + + smlal r0,r1,r2,r3 + + smull r0,r1,r2,r3 + + label_stc_t32: + stc p9,c1,[r2] + stc p9,c1,[r2],4 + stc p9,c1,[r2],{4} + stc p9,c1,[r2,4] + stc p9,c1,[r2,4]! + stc p9,c1,[label_stc_t32] + stc p9,c1,[expression.word] + stc p9,c1,[expression.word]! + + label_stc2_t32: + stc2 p9,c1,[r2] + stc2 p9,c1,[r2],4 + stc2 p9,c1,[r2],{4} + stc2 p9,c1,[r2,4] + stc2 p9,c1,[r2,4]! + stc2 p9,c1,[label_stc2_t32] + stc2 p9,c1,[expression.word] + stc2 p9,c1,[expression.word]! + + label_stc2l_t32: + stc2l p9,c1,[r2] + stc2l p9,c1,[r2],4 + stc2l p9,c1,[r2],{4} + stc2l p9,c1,[r2,4] + stc2l p9,c1,[r2,4]! + stc2l p9,c1,[label_stc2l_t32] + stc2l p9,c1,[expression.word] + stc2l p9,c1,[expression.word]! + + label_stcl_t32: + stcl p9,c1,[r2] + stcl p9,c1,[r2],4 + stcl p9,c1,[r2],{4} + stcl p9,c1,[r2,4] + stcl p9,c1,[r2,4]! + stcl p9,c1,[label_stcl_t32] + stcl p9,c1,[expression.word] + stcl p9,c1,[expression.word]! + + stm r0,{r1} + stm r0,{r1,r2} + stm r0,{r1-r3} + stm r0,{r1-r3,r5} + stm r0!,{r1} + stm r0!,{r1,r2} + stm r0!,{r1-r3} + stm r0!,{r1-r3,r5} + + stmia r0,{r1} + stmia r0,{r1,r2} + stmia r0,{r1-r3} + stmia r0,{r1-r3,r5} + stmia r0!,{r1} + stmia r0!,{r1,r2} + stmia r0!,{r1-r3} + stmia r0!,{r1-r3,r5} + + stmdb r0,{r1} + stmdb r0,{r1,r2} + stmdb r0,{r1-r3} + stmdb r0,{r1-r3,r5} + stmdb r0!,{r1} + stmdb r0!,{r1,r2} + stmdb r0!,{r1-r3} + stmdb r0!,{r1-r3,r5} + + stmea r0,{r1} + stmea r0,{r1,r2} + stmea r0,{r1-r3} + stmea r0,{r1-r3,r5} + stmea r0!,{r1} + stmea r0!,{r1,r2} + stmea r0!,{r1-r3} + stmea r0!,{r1-r3,r5} + + stmfd r0,{r1} + stmfd r0,{r1,r2} + stmfd r0,{r1-r3} + stmfd r0,{r1-r3,r5} + stmfd r0!,{r1} + stmfd r0!,{r1,r2} + stmfd r0!,{r1-r3} + stmfd r0!,{r1-r3,r5} + + str r0,[r1] + str r0,[r1],2 + str r0,[r1,2] + str r0,[r1,2]! + str r0,[r1,r2] + str r0,[r1,r2,lsl 3] + str r0,[expression.word] + str r0,[expression.word]! + + strb r0,[r1] + strb r0,[r1],2 + strb r0,[r1,2] + strb r0,[r1,2]! + strb r0,[r1,r2] + strb r0,[r1,r2,lsl 3] + strb r0,[expression.byte] + strb r0,[expression.byte]! + + strbt r0,[r1] + strbt r0,[r1,2] + strbt r0,[expression.byte] + + strd r0,[r1] + strd r0,[r2],4 + strd r0,[r1,4] + strd r0,[r2,4]! + strd r2,[expression.dword] + strd r2,[expression.dword]! + strd r0,r1,[r2] + strd r0,r1,[r2],4 + strd r0,r1,[r2,4] + strd r0,r1,[r2,4]! + strd r0,r2,[expression.dword] + strd r0,r2,[expression.dword]! + + strex r0,r1,[r2] + strex r0,r1,[r2,4] + strex r2,r4,[expression.word] + + strh r0,[r1] + strh r0,[r1],2 + strh r0,[r1,2] + strh r0,[r1,2]! + strh r0,[r1,r2] + strh r0,[r1,r2,lsl 3] + strh r0,[expression.hword] + strh r0,[expression.hword]! + + strht r0,[r1] + strht r0,[r1,2] + strht r0,[expression.hword] + + strt r0,[r1] + strt r0,[r1,2] + strt r0,[expression.word] + + sub r0,1 + sub r0,r1 + sub r0,r1,rrx + sub r0,r1,lsl 2 + sub r0,r1,lsr 2 + sub r0,r1,asr 2 + sub r0,r1,ror 2 + sub r0,r1,2 + sub r0,r1,r2 + sub r0,r1,r2,rrx + sub r0,r1,r2,lsl 3 + sub r0,r1,r2,lsr 3 + sub r0,r1,r2,asr 3 + sub r0,r1,r2,ror 3 + + subw r0,1 + subw r0,r1,2 + + sxtb r0,r1 + sxtb r0,r1,ror 8 + + sxth r0,r1 + sxth r0,r1,ror 8 + + tbb [r0,r1] + + tbh [r0,r1,lsl 1] + + teq r0,1 + teq r0,r1 + teq r0,r1,rrx + teq r0,r1,lsl 2 + teq r0,r1,lsr 2 + teq r0,r1,asr 2 + teq r0,r1,ror 2 + + tst r0,1 + tst r0,r1 + tst r0,r1,rrx + tst r0,r1,lsl 2 + tst r0,r1,lsr 2 + tst r0,r1,asr 2 + tst r0,r1,ror 2 + + ubfx r0,r1,2,3 + + umlal r0,r1,r2,r3 + + umull r0,r1,r2,r3 + + und.w + und 0x100 + + uxtb r0,r1 + uxtb r0,r1,ror 8 + + uxth r0,r1 + uxth r0,r1,ror 8 + + wfe + + wfi + + yield + +processor CPU32_T2 + + bxj r0 + + cps 0 + + cpsid iflags_a + cpsid iflags_a,0 + + cpsie iflags_a + cpsie iflags_a,0 + + mrs r0,cpsr + mrs r0,spsr + + msr cpsr,r1 + msr cpsr_fsxc,r1 + + pkhbt r0,r1 + pkhbt r0,r1,lsl 3 + pkhbt r0,r1,r2 + pkhbt r0,r1,r2,lsl 3 + + pkhtb r0,r1 + pkhtb r0,r1,asr 3 + pkhtb r0,r1,r2 + pkhtb r0,r1,r2,asr 3 + + qadd r0,r1 + qadd r0,r1,r2 + + qadd16 r0,r1 + qadd16 r0,r1,r2 + + qadd8 r0,r1 + qadd8 r0,r1,r2 + + qaddsubx r0,r1 + qaddsubx r0,r1,r2 + + qasx r0,r1 + qasx r0,r1,r2 + + qdadd r0,r1 + qdadd r0,r1,r2 + + qdsub r0,r1 + qdsub r0,r1,r2 + + qsub r0,r1 + qsub r0,r1,r2 + + qsax r0,r1 + qsax r0,r1,r2 + + qsub16 r0,r1 + qsub16 r0,r1,r2 + + qsub8 r0,r1 + qsub8 r0,r1,r2 + + qsubaddx r0,r1 + qsubaddx r0,r1,r2 + + rfe r0 + rfe r0! + + rfedb r0 + rfedb r0! + + rfeea r0 + rfeea r0! + + rfefd r0 + rfefd r0! + + rfeia r0 + rfeia r0! + + sadd16 r0,r1 + sadd16 r0,r1,r2 + + sadd8 r0,r1 + sadd8 r0,r1,r2 + + saddsubx r0,r1 + saddsubx r0,r1,r2 + + sasx r0,r1 + sasx r0,r1,r2 + + sel r0,r1 + sel r0,r1,r2 + + shadd16 r0,r1 + shadd16 r0,r1,r2 + + shadd8 r0,r1 + shadd8 r0,r1,r2 + + shaddsubx r0,r1 + shaddsubx r0,r1,r2 + + shasx r0,r1 + shasx r0,r1,r2 + + shsax r0,r1 + shsax r0,r1,r2 + + shsub16 r0,r1 + shsub16 r0,r1,r2 + + shsub8 r0,r1 + shsub8 r0,r1,r2 + + shsubaddx r0,r1 + shsubaddx r0,r1,r2 + + smlad r0,r1,r2,r3 + + smladx r0,r1,r2,r3 + + smlabb r0,r1,r2,r3 + + smlabt r0,r1,r2,r3 + + smlalbb r0,r1,r2,r3 + + smlalbt r0,r1,r2,r3 + + smlald r0,r1,r2,r3 + + smlaldx r0,r1,r2,r3 + + smlaltb r0,r1,r2,r3 + + smlaltt r0,r1,r2,r3 + + smlatb r0,r1,r2,r3 + + smlatt r0,r1,r2,r3 + + smlawb r0,r1,r2,r3 + + smlawt r0,r1,r2,r3 + + smlsd r0,r1,r2,r3 + + smlsdx r0,r1,r2,r3 + + smlsld r0,r1,r2,r3 + + smlsldx r0,r1,r2,r3 + + smmla r0,r1,r2,r3 + + smmlar r0,r1,r2,r3 + + smmls r0,r1,r2,r3 + + smmlsr r0,r1,r2,r3 + + smmul r0,r1 + smmul r0,r1,r2 + + smmulr r0,r1 + smmulr r0,r1,r2 + + smuad r0,r1 + smuad r0,r1,r2 + + smuadx r0,r1 + smuadx r0,r1,r2 + + smulbb r0,r1 + smulbb r0,r1,r2 + + smulbt r0,r1 + smulbt r0,r1,r2 + + smultb r0,r1 + smultb r0,r1,r2 + + smultt r0,r1 + smultt r0,r1,r2 + + smulwb r0,r1 + smulwb r0,r1,r2 + + smulwt r0,r1 + smulwt r0,r1,r2 + + smusd r0,r1 + smusd r0,r1,r2 + + smusdx r0,r1 + smusdx r0,r1,r2 + + srs 0 + srs 0 ! + srs sp,0 + srs sp!,0 + + srsdb 0 + srsdb 0 ! + srsdb sp,0 + srsdb sp!,0 + + srsea 0 + srsea 0 ! + srsea sp,0 + srsea sp!,0 + + srsfd 0 + srsfd 0 ! + srsfd sp,0 + srsfd sp!,0 + + srsia 0 + srsia 0 ! + srsia sp,0 + srsia sp!,0 + + ssat r0,1,r2 + ssat r0,1,r2,lsl 3 + ssat r0,1,r2,asr 3 + + ssat16 r0,1,r2 + + ssax r0,r1 + ssax r0,r1,r2 + + ssub16 r0,r1 + ssub16 r0,r1,r2 + + ssub8 r0,r1 + ssub8 r0,r1,r2 + + ssubaddx r0,r1 + ssubaddx r0,r1,r2 + + sxtab r0,r1,r2 + sxtab r0,r1,r2,ror 8 + + sxtab16 r0,r1,r2 + sxtab16 r0,r1,r2,ror 8 + + sxtah r0,r1,r2 + sxtah r0,r1,r2,ror 8 + + sxtb16 r0,r1 + sxtb16 r0,r1,ror 8 + + uadd16 r0,r1 + uadd16 r0,r1,r2 + + uadd8 r0,r1 + uadd8 r0,r1,r2 + + uaddsubx r0,r1 + uaddsubx r0,r1,r2 + + uasx r0,r1 + uasx r0,r1,r2 + + uhadd16 r0,r1 + uhadd16 r0,r1,r2 + + uhadd8 r0,r1 + uhadd8 r0,r1,r2 + + uhaddsubx r0,r1 + uhaddsubx r0,r1,r2 + + uhasx r0,r1 + uhasx r0,r1,r2 + + uhsax r0,r1 + uhsax r0,r1,r2 + + uhsub16 r0,r1 + uhsub16 r0,r1,r2 + + uhsub8 r0,r1 + uhsub8 r0,r1,r2 + + uhsubaddx r0,r1 + uhsubaddx r0,r1,r2 + + umaal r0,r1,r2,r3 + + uqadd16 r0,r1 + uqadd16 r0,r1,r2 + + uqadd8 r0,r1 + uqadd8 r0,r1,r2 + + uqaddsubx r0,r1 + uqaddsubx r0,r1,r2 + + uqasx r0,r1 + uqasx r0,r1,r2 + + uqsax r0,r1 + uqsax r0,r1,r2 + + uqsub16 r0,r1 + uqsub16 r0,r1,r2 + + uqsub8 r0,r1 + uqsub8 r0,r1,r2 + + uqsubaddx r0,r1 + uqsubaddx r0,r1,r2 + + usad8 r0,r1,r2 + + usada8 r0,r1,r2,r3 + + usat r0,1,r2 + usat r0,1,r2,lsl 3 + usat r0,1,r2,asr 3 + + usat16 r0,1,r2 + + usax r0,r1 + usax r0,r1,r2 + + usub16 r0,r1 + usub16 r0,r1,r2 + + usub8 r0,r1 + usub8 r0,r1,r2 + + usubaddx r0,r1 + usubaddx r0,r1,r2 + + uxtab r0,r1,r2 + uxtab r0,r1,r2,ror 8 + + uxtab16 r0,r1,r2 + uxtab16 r0,r1,r2,ror 8 + + uxtah r0,r1,r2 + uxtah r0,r1,r2,ror 8 + + uxtb16 r0,r1 + uxtb16 r0,r1,ror 8 + +processor CPU32_V7 + + ldrexd r0,[r2] + ldrexd r0,r1,[r2] + + label_pli_t32: + pli [r1] + pli [r1,2] + pli [r1,r2] + pli [r1,r2,lsl 3] + pli [label_pli_t32] + pli [expression.byte] + + strexd r0,r1,[r3] + strexd r0,r1,r2,[r3] + +processor CPU32_SYNC + + ldrexb r0,[r1] + ldrexb r0,[r1,0] + ldrexb r0,byte[expression.dword] + + ldrexh r0,[r1] + ldrexh r0,[r1,0] + ldrexh r0,hword[expression.dword] + + strexb r0,r1,[r2] + strexb r0,r1,[r2,0] + strexb r0,r1,byte[expression.dword] + + strexh r0,r1,[r2] + strexh r0,r1,[r2,0] + strexh r0,r1,hword[expression.dword] + +processor CPU32_DIV + + sdiv r0,r1 + sdiv r0,r1,r2 + + udiv r0,r1 + udiv r0,r1,r2 + +processor CPU32_T2EE + + enterx + + leavex + +processor CPU32_MP + + pldw [r1] + pldw [r1,2] + pldw [r1,r2] + pldw [r1,r2,lsl 3] + pldw [expression.byte] + +processor CPU32_V8 + + dcps1 + dcps2 + dcps3 + + lda r0,[r1] + ldab r0,[r1] + ldah r0,[r1] + + ldaex r0,[r1] + ldaexb r0,[r1] + ldaexh r0,[r1] + ldaexd r0,[r2] + ldaexd r0,r1,[r2] + + sevl.w + + stl r0,[r1] + stlb r0,[r1] + stlh r0,[r1] + + stlex r2,r0,[r3] + stlexb r2,r0,[r3] + stlexh r2,r0,[r3] + stlexd r2,r0,[r3] + stlexd r2,r0,r1,[r3] + +processor CPU32_CRC + + crc32b r0,r1,r2 + crc32h r0,r1,r2 + crc32w r0,r1,r2 + + crc32cb r0,r1,r2 + crc32ch r0,r1,r2 + crc32cw r0,r1,r2 diff --git a/armdoc/InstructionFormatsVFP.asm b/armdoc/InstructionFormatsVFP.asm new file mode 100644 index 0000000..1cb7b40 --- /dev/null +++ b/armdoc/InstructionFormatsVFP.asm @@ -0,0 +1,1120 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;To avoid unnecessary repetition only ARM mode is used +;here. There is no change needed for THUMB mode except +;to specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;All instructions can be conditional. The condition code +;should be added at the end of the main opcode and +;before any size/type specifiers. For example: "addhi" +;and "vaddhi.i16". The syntax also supports the pre-UAL +;style of putting the condition before any modifiers +;like "s" or "fd". For example: "ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;VFP, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_VFP_V1xD + + fabss s0,s1 + + fadds s0,s1 + fadds s0,s1,s2 + + fcmpes s0,s1 + fcmpes s0,0.0 + + fcmpezs s0 + + fcmps s0,s1 + fcmps s0,0.0 + + fcmpzs s0 + + fcpys s0,s1 + + fdivs s0,s1 + fdivs s0,s1,s2 + + label_fldd: + fldd d0,[r1] + fldd d0,[r1,4] + fldd d0,[label_fldd] + fldd d0,[expression.word] + + fldmdbd r0!,{d0-d3} + + fldmdbs r0!,{s0-s3} + + fldmdbx r0!,{d0-d3} + + fldmead r0!,{d0-d3} + + fldmeas r0!,{s0-s3} + + fldmeax r0!,{d0-d3} + + fldmfdd r0,{d0-d3} + fldmfdd r0!,{d0-d3} + + fldmfds r0,{s0-s3} + fldmfds r0!,{s0-s3} + + fldmfdx r0,{d0-d3} + fldmfdx r0!,{d0-d3} + + fldmiad r0,{d0-d3} + fldmiad r0!,{d0-d3} + + fldmias r0,{s0-s3} + fldmias r0!,{s0-s3} + + fldmiax r0,{d0-d3} + fldmiax r0!,{d0-d3} + + fldmd r0,{d0-d3} + fldmd r0!,{d0-d3} + + fldms r0,{s0-s3} + fldms r0!,{s0-s3} + + fldmx r0,{d0-d3} + fldmx r0!,{d0-d3} + + label_flds: + flds s0,[r1] + flds s0,[r1,4] + flds s0,[label_flds] + flds s0,[expression.word] + + fmacs s0,s1,s2 + + fmdhr d0,r1 + + fmdlr d0,r1 + + fmrdh r0,d1 + + fmrdl r0,d1 + + fmrs r0,s1 + + fmrx r0,fpscr + + fmscs s0,s1,s2 + + fmsr s0,r1 + + fmstat + + fmuls s0,s1 + fmuls s0,s1,s2 + + fmxr fpscr,r1 + + fnegs s0,s1 + + fnmacs s0,s1,s2 + + fnmscs s0,s1,s2 + + fnmuls s0,s1 + fnmuls s0,s1,s2 + + fsqrts s0,s1 + + fstmdbd r0!,{d0-d3} + + fstmdbs r0!,{s0-s3} + + fstmdbx r0!,{d0-d3} + + fstmead r0,{d0-d3} + fstmead r0!,{d0-d3} + + fstmeas r0,{s0-s3} + fstmeas r0!,{s0-s3} + + fstmeax r0,{d0-d3} + fstmeax r0!,{d0-d3} + + fstmfdd r0!,{d0-d3} + + fstmfds r0!,{s0-s3} + + fstmfdx r0!,{d0-d3} + + fstmiad r0,{d0-d3} + fstmiad r0!,{d0-d3} + + fstmias r0,{s0-s3} + fstmias r0!,{s0-s3} + + fstmiax r0,{d0-d3} + fstmiax r0!,{d0-d3} + + fstmd r0,{d0-d3} + fstmd r0!,{d0-d3} + + fstms r0,{s0-s3} + fstms r0!,{s0-s3} + + fstmx r0,{d0-d3} + fstmx r0!,{d0-d3} + + label_fstd: + fstd d0,[r1] + fstd d0,[r1,4] + fstd d0,[label_fstd] + fstd d0,[expression.word] + + label_fsts: + fsts s0,[r1] + fsts s0,[r1,4] + fsts s0,[label_fsts] + fsts s0,[expression.word] + + fsubs s0,s1 + fsubs s0,s1,s2 + + fsitos s0,s1 + + ftosis s0,s1 + + ftosizs s0,s1 + + ftouis s0,s1 + + ftouizs s0,s1 + + fuitos s0,s1 + + vabs.f32 s0,s1 + + vadd.f32 s0,s1 + vadd.f32 s0,s1,s2 + + vcmp.f32 s0,0.0 + vcmp.f32 s0,s1 + + vcmpe.f32 s0,0.0 + vcmpe.f32 s0,s1 + + vcvt.f32.s32 s0,s1 + + vcvt.f32.u32 s0,s1 + + vcvt.s32.f32 s0,s1 + + vcvt.u32.f32 s0,s1 + + vcvtr.s32.f32 s0,s1 + + vcvtr.u32.f32 s0,s1 + + vdiv.f32 s0,s1 + vdiv.f32 s0,s1,s2 + + vldm r0!,{d0-d3} + vldm r0!,{s0-s3} + vldm r0,{d0-d3} + vldm r0,{s0-s3} + + vldm.32 r0!,{s0-s3} + vldm.32 r0,{s0-s3} + + vldm.64 r0!,{d0-d3} + vldm.64 r0,{d0-d3} + + vldmdb r0!,{d0-d3} + vldmdb r0!,{s0-s3} + + vldmdb.32 r0!,{s0-s3} + + vldmdb.64 r0!,{d0-d3} + + vldmea r0!,{d0-d3} + vldmea r0!,{s0-s3} + + vldmea.32 r0!,{s0-s3} + + vldmea.64 r0!,{d0-d3} + + vldmfd r0!,{d0-d3} + vldmfd r0!,{s0-s3} + vldmfd r0,{d0-d3} + vldmfd r0,{s0-s3} + + vldmfd.32 r0!,{s0-s3} + vldmfd.32 r0,{s0-s3} + + vldmfd.64 r0!,{d0-d3} + vldmfd.64 r0,{d0-d3} + + vldmia r0!,{d0-d3} + vldmia r0!,{s0-s3} + vldmia r0,{d0-d3} + vldmia r0,{s0-s3} + + vldmia.32 r0!,{s0-s3} + vldmia.32 r0,{s0-s3} + + vldmia.64 r0!,{d0-d3} + vldmia.64 r0,{d0-d3} + + label_vldr: + vldr d0,[expression.word] + vldr d0,[label_vldr] + vldr d0,[r1,4] + vldr d0,[r1] + vldr s0,[expression.word] + vldr s0,[label_vldr] + vldr s0,[r1,4] + vldr s0,[r1] + + label_vldr.32: + vldr.32 s0,[expression.word] + vldr.32 s0,[label_vldr.32] + vldr.32 s0,[r1,4] + vldr.32 s0,[r1] + + label_vldr.64: + vldr.64 d0,[expression.word] + vldr.64 d0,[label_vldr.64] + vldr.64 d0,[r1,4] + vldr.64 d0,[r1] + + vmla.f32 s0,s1,s2 + + vmls.f32 s0,s1,s2 + + vmov d0[1],r1 + vmov r0,d1[1] + vmov r0,s1 + vmov s0,r1 + + vmov.32 d0[1],r1 + vmov.32 r0,d1[1] + + vmov.f32 s0,s1 + + vmrs r0,fpscr + vmrs apsr_nzcv,fpscr + + vmsr fpscr,r1 + + vmul.f32 s0,s1 + vmul.f32 s0,s1,s2 + + vneg.f32 s0,s1 + + vnmla.f32 s0,s1,s2 + + vnmls.f32 s0,s1,s2 + + vnmul.f32 s0,s1 + vnmul.f32 s0,s1,s2 + + vpop {d0,d2,d1} + vpop {s0,s2,s1} + + vpush {d0,d2,d1} + vpush {s0,s2,s1} + + vsqrt.f32 s0,s1 + + vstm r0!,{d0-d3} + vstm r0!,{s0-s3} + vstm r0,{d0-d3} + vstm r0,{s0-s3} + + vstm.32 r0!,{s0-s3} + vstm.32 r0,{s0-s3} + + vstm.64 r0!,{d0-d3} + vstm.64 r0,{d0-d3} + + vstmdb r0!,{d0-d3} + vstmdb r0!,{s0-s3} + + vstmdb.32 r0!,{s0-s3} + + vstmdb.64 r0!,{d0-d3} + + vstmea r0!,{d0-d3} + vstmea r0!,{s0-s3} + vstmea r0,{d0-d3} + vstmea r0,{s0-s3} + + vstmea.32 r0!,{s0-s3} + vstmea.32 r0,{s0-s3} + + vstmea.64 r0!,{d0-d3} + vstmea.64 r0,{d0-d3} + + vstmfd r0!,{d0-d3} + vstmfd r0!,{s0-s3} + + vstmfd.32 r0!,{s0-s3} + + vstmfd.64 r0!,{d0-d3} + + vstmia r0!,{d0-d3} + vstmia r0!,{s0-s3} + vstmia r0,{d0-d3} + vstmia r0,{s0-s3} + + vstmia.32 r0!,{s0-s3} + vstmia.32 r0,{s0-s3} + + vstmia.64 r0!,{d0-d3} + vstmia.64 r0,{d0-d3} + + label_vstr: + vstr d0,[expression.word] + vstr d0,[label_vstr] + vstr d0,[r1,4] + vstr d0,[r1] + vstr s0,[expression.word] + vstr s0,[label_vstr] + vstr s0,[r1,4] + vstr s0,[r1] + + label_vstr.32: + vstr.32 s0,[expression.word] + vstr.32 s0,[label_vstr.32] + vstr.32 s0,[r1,4] + vstr.32 s0,[r1] + + label_vstr.64: + vstr.64 d0,[expression.word] + vstr.64 d0,[label_vstr.64] + vstr.64 d0,[r1,4] + vstr.64 d0,[r1] + + vsub.f32 s0,s1 + vsub.f32 s0,s1,s2 + +coprocessor COPRO_VFP_V1xD + COPRO_VFP_D32 + + label_fldd_d32: + fldd d20,[r1] + fldd d20,[r1,4] + fldd d20,[label_fldd_d32] + fldd d20,[expression.word] + + fldmdbd r0!,{d20-d23} + + fldmdbx r0!,{d20-d23} + + fldmead r0!,{d20-d23} + + fldmeax r0!,{d20-d23} + + fldmfdd r0,{d20-d23} + fldmfdd r0!,{d20-d23} + + fldmfdx r0,{d20-d23} + fldmfdx r0!,{d20-d23} + + fldmiad r0,{d20-d23} + fldmiad r0!,{d20-d23} + + fldmiax r0,{d20-d23} + fldmiax r0!,{d20-d23} + + fldmd r0,{d20-d23} + fldmd r0!,{d20-d23} + + fldmx r0,{d20-d23} + fldmx r0!,{d20-d23} + + fmdhr d20,r1 + + fmdlr d20,r1 + + fmrdh r0,d21 + + fmrdl r0,d21 + + fstmdbd r0!,{d20-d23} + + fstmdbx r0!,{d20-d23} + + fstmead r0,{d20-d23} + fstmead r0!,{d20-d23} + + fstmeax r0,{d20-d23} + fstmeax r0!,{d20-d23} + + fstmfdd r0!,{d20-d23} + + fstmfdx r0!,{d20-d23} + + fstmiad r0,{d20-d23} + fstmiad r0!,{d20-d23} + + fstmiax r0,{d20-d23} + fstmiax r0!,{d20-d23} + + fstmd r0,{d20-d23} + fstmd r0!,{d20-d23} + + fstmx r0,{d20-d23} + fstmx r0!,{d20-d23} + + label_fstd_d32: + fstd d20,[r1] + fstd d20,[r1,4] + fstd d20,[label_fstd_d32] + fstd d20,[expression.word] + + vldm r0!,{d20-d23} + vldm r0,{d20-d23} + + vldm.64 r0!,{d20-d23} + vldm.64 r0,{d20-d23} + + vldmdb r0!,{d20-d23} + + vldmdb.64 r0!,{d20-d23} + + vldmea r0!,{d20-d23} + + vldmea.64 r0!,{d20-d23} + + vldmfd r0!,{d20-d23} + vldmfd r0,{d20-d23} + + vldmfd.64 r0!,{d20-d23} + vldmfd.64 r0,{d20-d23} + + vldmia r0!,{d20-d23} + vldmia r0,{d20-d23} + + vldmia.64 r0!,{d20-d23} + vldmia.64 r0,{d20-d23} + + label_vldr_d32: + vldr d20,[expression.word] + vldr d20,[label_vldr_d32] + vldr d20,[r1,4] + vldr d20,[r1] + + label_vldr.64_d32: + vldr.64 d20,[expression.word] + vldr.64 d20,[label_vldr.64_d32] + vldr.64 d20,[r1,4] + vldr.64 d20,[r1] + + vmov d20[0],r1 + vmov r0,d21[0] + + vmov.32 d20[0],r1 + vmov.32 r0,d21[0] + + vpop {d5-d20} + + vpush {d5-d20} + + vstm r0!,{d20-d23} + vstm r0,{d20-d23} + + vstm.64 r0!,{d20-d23} + vstm.64 r0,{d20-d23} + + vstmdb r0!,{d20-d23} + + vstmdb.64 r0!,{d20-d23} + + vstmea r0!,{d20-d23} + vstmea r0,{d20-d23} + + vstmea.64 r0!,{d20-d23} + vstmea.64 r0,{d20-d23} + + vstmfd r0!,{d20-d23} + + vstmfd.64 r0!,{d20-d23} + + vstmia r0!,{d20-d23} + vstmia r0,{d20-d23} + + vstmia.64 r0!,{d20-d23} + vstmia.64 r0,{d20-d23} + + label_vstr_d32: + vstr d20,[expression.word] + vstr d20,[label_vstr_d32] + vstr d20,[r1,4] + vstr d20,[r1] + + label_vstr.64_d32: + vstr.64 d20,[expression.word] + vstr.64 d20,[label_vstr.64_d32] + vstr.64 d20,[r1,4] + vstr.64 d20,[r1] + +coprocessor COPRO_VFP_V1 + + fabsd d0,d1 + + faddd d0,d1 + faddd d0,d1,d2 + + fcmpd d0,d1 + fcmpd d0,0.0 + + fcmped d0,d1 + fcmped d0,0.0 + + fcmpezd d0 + + fcmpzd d0 + + fcpyd d0,d1 + + fcvtds d0,s1 + + fcvtsd s0,d1 + + fdivd d0,d1 + fdivd d0,d1,d2 + + fmacd d0,d1,d2 + + fmscd d0,d1,d2 + + fmuld d0,d1 + fmuld d0,d1,d2 + + fnegd d0,d1 + + fnmacd d0,d1,d2 + + fnmscd d0,d1,d2 + + fnmuld d0,d1 + fnmuld d0,d1,d2 + + fsitod d0,s1 + + fsqrtd d0,d1 + + fsubd d0,d1 + fsubd d0,d1,d2 + + ftosid s0,d1 + + ftosizd s0,d1 + + ftouid s0,d1 + + ftouizd s0,d1 + + fuitod d0,s0 + + vabs.f64 d0,d1 + + vadd.f64 d0,d1 + vadd.f64 d0,d1,d2 + + vcmp.f64 d0,0.0 + vcmp.f64 d0,d1 + + vcmpe.f64 d0,0.0 + vcmpe.f64 d0,d1 + + vcvt.f32.f64 s0,d1 + + vcvt.f64.f32 d0,s1 + + vcvt.f64.s32 d0,s1 + + vcvt.f64.u32 d0,s0 + + vcvt.s32.f64 s0,d1 + + vcvt.u32.f64 s0,d1 + + vcvtr.s32.f64 s0,d1 + + vcvtr.u32.f64 s0,d1 + + vdiv.f64 d0,d1 + vdiv.f64 d0,d1,d2 + + vmla.f64 d0,d1,d2 + + vmls.f64 d0,d1,d2 + + vmov.f64 d0,d1 + + vmul.f64 d0,d1 + vmul.f64 d0,d1,d2 + + vneg.f64 d0,d1 + + vnmla.f64 d0,d1,d2 + + vnmls.f64 d0,d1,d2 + + vnmul.f64 d0,d1 + vnmul.f64 d0,d1,d2 + + vsqrt.f64 d0,d1 + + vsub.f64 d0,d1 + vsub.f64 d0,d1,d2 + +coprocessor COPRO_VFP_V1 + COPRO_VFP_D32 + + fabsd d20,d21 + + faddd d20,d21 + faddd d20,d21,d22 + + fcmpd d20,d21 + fcmpd d20,0.0 + + fcmped d20,d21 + fcmped d20,0.0 + + fcmpezd d20 + + fcmpzd d20 + + fcpyd d20,d21 + + fcvtds d20,s1 + + fcvtsd s0,d21 + + fdivd d20,d21 + fdivd d20,d21,d22 + + fmacd d20,d21,d22 + + fmscd d20,d21,d22 + + fmuld d20,d21 + fmuld d20,d21,d22 + + fnegd d20,d21 + + fnmacd d20,d21,d22 + + fnmscd d20,d21,d22 + + fnmuld d20,d21 + fnmuld d20,d21,d22 + + fsitod d20,s1 + + fsqrtd d20,d21 + + fsubd d20,d21 + fsubd d20,d21,d22 + + ftosid s0,d21 + + ftosizd s0,d21 + + ftouid s0,d21 + + ftouizd s0,d21 + + fuitod d20,s0 + + vabs.f64 d20,d21 + + vadd.f64 d20,d21 + vadd.f64 d20,d21,d22 + + vcmp.f64 d20,0.0 + vcmp.f64 d20,d21 + + vcmpe.f64 d20,0.0 + vcmpe.f64 d20,d21 + + vcvt.f32.f64 s0,d21 + + vcvt.f64.f32 d20,s1 + + vcvt.f64.s32 d20,s1 + + vcvt.f64.u32 d20,s0 + + vcvt.s32.f64 s0,d21 + + vcvt.u32.f64 s0,d21 + + vcvtr.s32.f64 s0,d21 + + vcvtr.u32.f64 s0,d21 + + vdiv.f64 d20,d21 + vdiv.f64 d20,d21,d22 + + vmla.f64 d20,d21,d22 + + vmls.f64 d20,d21,d22 + + vmov.f64 d20,d21 + + vmul.f64 d20,d21 + vmul.f64 d20,d21,d22 + + vneg.f64 d20,d21 + + vnmla.f64 d20,d21,d22 + + vnmls.f64 d20,d21,d22 + + vnmul.f64 d20,d21 + vnmul.f64 d20,d21,d22 + + vsqrt.f64 d20,d21 + + vsub.f64 d20,d21 + vsub.f64 d20,d21,d22 + +coprocessor COPRO_VFP_V2 + + fmdrr d0,r1,r2 + + fmrrd r0,r1,d2 + + fmrrs r0,r1,{s2,s3} + + fmsrr {s0,s1},r2,r3 + + vmov d0,r1,r2 + vmov r0,r1,d2 + vmov r0,r1,s2,s3 + vmov s0,s1,r2,r3 + +coprocessor COPRO_VFP_V2 + COPRO_VFP_D32 + + fmdrr d20,r1,r2 + + fmrrd r0,r1,d22 + + vmov d20,r1,r2 + vmov r0,r1,d22 + +coprocessor COPRO_VFP_V3 + + fconsts s0,1.0 + fconsts s0,1 + + fconstd d0,1.0 + fconstd d0,1 + + fshtod d0,1 + fshtod d0,d0,1 + + fshtos s0,1 + fshtos s0,s0,1 + + fsltod d0,1 + fsltod d0,d0,1 + + fsltos s0,1 + fsltos s0,s0,1 + + ftoshd d0,1 + ftoshd d0,d0,1 + + ftoshs s0,1 + ftoshs s0,s0,1 + + ftosld d0,1 + ftosld d0,d0,1 + + ftosls s0,1 + ftosls s0,s0,1 + + ftouhd d0,1 + ftouhd d0,d0,1 + + ftouhs s0,1 + ftouhs s0,s0,1 + + ftould d0,1 + ftould d0,d0,1 + + ftouls s0,1 + ftouls s0,s0,1 + + fuhtod d0,1 + fuhtod d0,d0,1 + + fuhtos s0,1 + fuhtos s0,s0,1 + + fultod d0,1 + fultod d0,d0,1 + + fultos s0,1 + fultos s0,s0,1 + + vcvt.f32.s16 s0,1 + vcvt.f32.s16 s0,s0,1 + + vcvt.f32.s32 s0,1 + vcvt.f32.s32 s0,s0,1 + + vcvt.f32.u16 s0,1 + vcvt.f32.u16 s0,s0,1 + + vcvt.f32.u32 s0,1 + vcvt.f32.u32 s0,s0,1 + + vcvt.f64.s16 d0,1 + vcvt.f64.s16 d0,d0,1 + + vcvt.f64.s32 d0,3 + vcvt.f64.s32 d0,d0,3 + + vcvt.f64.u16 d0,1 + vcvt.f64.u16 d0,d0,1 + + vcvt.f64.u32 d0,3 + vcvt.f64.u32 d0,d0,3 + + vcvt.s16.f32 s0,1 + vcvt.s16.f32 s0,s0,1 + + vcvt.s16.f64 d0,1 + vcvt.s16.f64 d0,d0,1 + + vcvt.s32.f32 s0,1 + vcvt.s32.f32 s0,s0,1 + + vcvt.s32.f64 d0,3 + vcvt.s32.f64 d0,d0,3 + + vcvt.u16.f32 s0,1 + vcvt.u16.f32 s0,s0,1 + + vcvt.u16.f64 d0,1 + vcvt.u16.f64 d0,d0,1 + + vcvt.u32.f32 s0,1 + vcvt.u32.f32 s0,s0,1 + + vcvt.u32.f64 d0,3 + vcvt.u32.f64 d0,d0,3 + + vmov.f32 s0,1 + vmov.f32 s0,1.0 + + vmov.f64 d0,1 + vmov.f64 d0,1.0 + +coprocessor COPRO_VFP_V3 + COPRO_VFP_D32 + + fconstd d20,1.0 + fconstd d20,1 + + fshtod d20,1 + fshtod d20,d20,1 + + fsltod d20,1 + fsltod d20,d20,1 + + ftoshd d20,1 + ftoshd d20,d20,1 + + ftosld d20,1 + ftosld d20,d20,1 + + ftouhd d20,1 + ftouhd d20,d20,1 + + ftould d20,1 + ftould d20,d20,1 + + fuhtod d20,1 + fuhtod d20,d20,1 + + fultod d20,1 + fultod d20,d20,1 + + vcvt.f64.s16 d20,1 + vcvt.f64.s16 d20,d20,1 + + vcvt.f64.s32 d20,1 + vcvt.f64.s32 d20,d20,1 + + vcvt.f64.u16 d20,1 + vcvt.f64.u16 d20,d20,1 + + vcvt.f64.u32 d20,1 + vcvt.f64.u32 d20,d20,1 + + vcvt.s16.f64 d20,1 + vcvt.s16.f64 d20,d20,1 + + vcvt.s32.f64 d20,1 + vcvt.s32.f64 d20,d20,1 + + vcvt.u16.f64 d20,1 + vcvt.u16.f64 d20,d20,1 + + vcvt.u32.f64 d20,1 + vcvt.u32.f64 d20,d20,1 + + vmov.f64 d20,1 + vmov.f64 d20,1.0 + +coprocessor COPRO_VFP_HP + + vcvtb.f32.f16 s0,s1 + + vcvtb.f16.f32 s0,s1 + + vcvtt.f32.f16 s0,s1 + + vcvtt.f16.f32 s0,s1 + +coprocessor COPRO_VFP_V4 + + vfma.f32 s0,s1,s2 + + vfma.f64 d0,d1,d2 + + vfms.f32 s0,s1,s2 + + vfms.f64 d0,d1,d2 + + vfnma.f32 s0,s1,s2 + + vfnma.f64 d0,d1,d2 + + vfnms.f32 s0,s1,s2 + + vfnms.f64 d0,d1,d2 + +coprocessor COPRO_VFP_V4 + COPRO_VFP_D32 + + vfma.f64 d20,d21,d22 + + vfnma.f64 d20,d21,d22 + + vfms.f64 d20,d21,d22 + + vfnms.f64 d20,d21,d22 + +coprocessor COPRO_SIMD_V8 + + vcvtm.s32.f32 s0,s1 + vcvtm.u32.f32 s0,s1 + vcvtm.s32.f64 s0,d1 + vcvtm.u32.f64 s0,d1 + + vcvtp.s32.f32 s0,s1 + vcvtp.u32.f32 s0,s1 + vcvtp.s32.f64 s0,d1 + vcvtp.u32.f64 s0,d1 + + vcvtn.s32.f32 s0,s1 + vcvtn.u32.f32 s0,s1 + vcvtn.s32.f64 s0,d1 + vcvtn.u32.f64 s0,d1 + + vcvta.s32.f32 s0,s1 + vcvta.u32.f32 s0,s1 + vcvta.s32.f64 s0,d1 + vcvta.u32.f64 s0,d1 + + vcvtb.f16.f64 s0,d1 + vcvtb.f64.f16 d0,s1 + + vcvtt.f16.f64 s0,d1 + vcvtt.f64.f16 d0,s1 + + vmaxnm.f32 s0,s1,s2 + vmaxnm.f64 d0,d1,d2 + + vminnm.f32 s0,s1,s2 + vminnm.f64 d0,d1,d2 + + vrintm.f32.f32 s0,s1 + vrintm.f64.f64 d0,d1 + + vrintp.f32.f32 s0,s1 + vrintp.f64.f64 d0,d1 + + vrintn.f32.f32 s0,s1 + vrintn.f64.f64 d0,d1 + + vrinta.f32.f32 s0,s1 + vrinta.f64.f64 d0,d1 + + vrintx.f32.f32 s0,s1 + vrintx.f64.f64 d0,d1 + + vrintz.f32.f32 s0,s1 + vrintz.f64.f64 d0,d1 + + vrintr.f32.f32 s0,s1 + vrintr.f64.f64 d0,d1 + + vseleq.f32 s0,s1,s2 + vseleq.f64 d0,d1,d2 + + vselvs.f32 s0,s1,s2 + vselvs.f64 d0,d1,d2 + + vselge.f32 s0,s1,s2 + vselge.f64 d0,d1,d2 + + vselgt.f32 s0,s1,s2 + vselgt.f64 d0,d1,d2 diff --git a/armdoc/InstructionFormatsXSCALE.asm b/armdoc/InstructionFormatsXSCALE.asm new file mode 100644 index 0000000..0338e3e --- /dev/null +++ b/armdoc/InstructionFormatsXSCALE.asm @@ -0,0 +1,101 @@ +;This document is intended to show the basic formats for +;all of the instructions supported by fasmarm. + +;These formats are divided into sections showing the CPU +;processor directive needed to enable the instruction. + +;Opcodes are listed in alphabetical order within each +;section. A blank line separates each opcode from the +;next. + +;Instructions can appear in many places. Different +;versions of the instruction set can allow for different +;sets of available parameters so be sure to check for +;instructions listed in more than one place. If you are +;having trouble working out what format fasmarm is +;expecting then you can search through here for all +;instances to find the situation that matches your code. + +;Coprocessor formats are divided firstly by the +;coprocessor type and secondly by the implementation +;version. Coprocessor instructions are available in both +;ARM and THUMB modes and use the same format for both. +;There is no change needed for THUMB mode except to +;specify that the processor supports version 7M +;architecture instructions. + +;The example codes given here are merely indicative of +;which parameters go where. They are not intended as an +;enumeration of all possible allowed values of the +;parameters. Usually only one register or one immediate +;value for each parameter is given so as to show what +;type of parameter is expected at each position. If you +;try to assemble a value that is undefined, +;unpredictable or not encodable fasmarm will give a +;short error message complaining that the parameter is +;invalid. + +;These instructions do not show any condition syntax. +;All instructions can be conditional. The condition code +;should be added at the end of the main opcode and +;before any size/type specifiers. For example: "addhi" +;and "vaddhi.i16". The syntax also supports the pre-UAL +;style of putting the condition before any modifiers +;like "s" or "fd". For example: "ldmhifd", "ldmfdhi". + +;This file can be assembled by fasmarm. + +virtual at r1 + expression.dword rd 1 + expression.word rw 1 + expression.hword rh 1 + expression.byte rb 1 +end virtual + + ;*********************************************** + ;xScale, ARM mode, all instructions are 32-bit + ;*********************************************** + + code32 + +coprocessor COPRO_XSCALE + + mia acc0,r1,r2 + + miaph acc0,r1,r2 + + miabb acc0,r1,r2 + + miabt acc0,r1,r2 + + miatb acc0,r1,r2 + + miatt acc0,r1,r2 + + mar acc0,r1,r2 + + mra r0,r1,acc0 + + ;*********************************************** + ;xScale, THUMB mode, all instructions are 32-bit + ;*********************************************** + +processor CPU32_7M + + thumb + + mia acc0,r1,r2 + + miaph acc0,r1,r2 + + miabb acc0,r1,r2 + + miabt acc0,r1,r2 + + miatb acc0,r1,r2 + + miatt acc0,r1,r2 + + mar acc0,r1,r2 + + mra r0,r1,acc0 diff --git a/examples/arm64/armpe64.asm b/examples/arm64/armpe64.asm new file mode 100644 index 0000000..e1ae1a6 --- /dev/null +++ b/examples/arm64/armpe64.asm @@ -0,0 +1,40 @@ +format pe64 gui nx at 0x140000000 +processor cpu64_v8 + +section '.text' code executable + +entry $ + mov x0,xzr + adr x1,hello + adr x2,title + mov x3,xzr + ldr x8,[MessageBox] + blr x8 + mov x0,xzr + ldr x8,[ExitProcess] + blr x8 + +section '.data' data readable + + hello db 'Hello, Win64 ARM world!',0 + title db 'Win64 ARM',0 + +section '.idata' import data readable + + dw 0,0,0,rva user_name,rva user_table + dw 0,0,0,rva kernel_name,rva kernel_table + dw 0,0,0,0,0 + + user_name db 'user32.dll',0 + kernel_name db 'kernel32.dll',0 + + sMessageBox db 0,0,'MessageBoxA',0 + sExitProcess db 0,0,'ExitProcess',0 + + align 8 + user_table: + MessageBox dd rva sMessageBox + dd 0 + kernel_table: + ExitProcess dd rva sExitProcess + dd 0 diff --git a/examples/arm64/armpe64.exe b/examples/arm64/armpe64.exe new file mode 100644 index 0000000000000000000000000000000000000000..700afa72a21d9991a506f29a87b28988e2c017db GIT binary patch literal 2048 zcmeHH%}&BV5dI2i{E4J*;6gljAdOMu$;4tLdXPwzMB=T`4K|jRv?X%0F+PBA;GMGv z<2!KmjPV701DsvDLP+$;fiUUr%zWR>bY>1)zKNj$$Uw(%2$;elG3EXL6%(D^e9z)_ zwV!*_&ilFQtrN0#;5P%S#Tu69`4Ovg7IZx3cTao5%F$B z|C5Um4T;&snGgmr!?q%eu)M$tkTGgU0wXc$Gn`SNoP}nRam#`oi%D^V^k(n#0s3PM z{fq3Cv{r+5^da!=#2#lXta;nO8FyX3z^)zdV4oE)%k16{TswzfVBQ8^%=7044(Xj} zi??DzPRWm_FhzGl9_;NJw(H`K2Of752PpF}w3__b?-nVz)ODgt;5P_Fb*ff<%2%}) IdNv#Q0XH2g+V}xfnf?GD}#Xokaqb0Uw{WlD+2j4Aik5uRR$iX%j`h*L6(L~ zjtmPvJ*?lq@*y+BLT9>9G;xW<1ooyh2f*Z z9fpaD2Y`4&!z`d4OOU<<28cc<0fvc-{+XKr^-O%oz!1;?6+gfnf6XH`CnsMaJijO> xMUj__my1C`A-E*5s6-(#C8a2}xY$a;pn}1*A~m_RBr`uxAt$vgHOESU0RZbiNFo3L literal 0 HcmV?d00001 diff --git a/examples/armdwarf/armdwarf.asm b/examples/armdwarf/armdwarf.asm new file mode 100644 index 0000000..cdad5f8 --- /dev/null +++ b/examples/armdwarf/armdwarf.asm @@ -0,0 +1,13 @@ + format ELF dwarf executable at 0 + entry start + section 'one' executable readable writeable align 020h + +start: mov r1,string_hello + mov r0,4 ;SYS_WRITE0 + swi 0x123456 ;Multi-ICE DCC semihosting + mov r0,18h ;angel_SWIreason_ReportException + mov r1,20000h ;Software reason code + orr r1,r1,26h ;ADP_Stopped_ApplicationExit + swi 0x123456 ;Multi-ICE DCC semihosting + +string_hello db 'Hello ARM semi-hosting world',13,10,0 diff --git a/examples/armdwarf/armdwarf.axf b/examples/armdwarf/armdwarf.axf new file mode 100755 index 0000000000000000000000000000000000000000..dfc59206032d80c5a58e84623321d199d781814b GIT binary patch literal 836 zcmah{!AcxK5Un0ZT?FIqg296!4NgQ44hcIUUIKbZ@Q{FrNN&=TnRN$dr=e$dH=aWN zAcuUwepn8|UIjlPdDS}&trrWb-+NtEJ=Hb+^V65lLI`pe&;dD>U^5JeUJ?ZfN$ej` zhXNbFbOpeZ*4Kd&zT2HILYgnGlK#UEFxZ(d_Pf8VKFiBe%hQXmvd+iF(MZ=#QQgRy zHf6TCfnqjY50DR zu0fCBxDG57%8av_GQ(KaV?sOAW2tJil$N=X-?ho*^j(}Ja;S|Qma6fh2z(gCgSRrh zmFP&9lcvy>J@+5X5*h#kI}HqXZG$l5x74|!2P^?=+cWjdiW&o8;Xuy(8KrO%XhHc{EfVGP`(%U9m2Vf PkF5q+yF*^&gopnD;;dJflWMqH=CI$@#5U-?xfx!eS$ixIiMKme|~0muR389)kzS%H{A03r_- xn*bCCVi*7#1D0oCSn!xfp#Kq%!h**v3=`h70r`wT+9Ne5CtsmFzbGe#3jh-x76AYN literal 0 HcmV?d00001 diff --git a/examples/armelf/armelf.asm b/examples/armelf/armelf.asm new file mode 100644 index 0000000..adf397c --- /dev/null +++ b/examples/armelf/armelf.asm @@ -0,0 +1,17 @@ + format ELF executable + entry start + + segment readable executable + +start: mov r0,0 + add r1,pc,hello-$-8 + mov r2,hello_len + swi 0x900004 + mov r0,6 + swi 0x900001 + +hello: db 'Hello world',10 +hello_len=$-hello + + ;dummy section for bss, see http://board.flatassembler.net/topic.php?t=3689 + segment writeable diff --git a/examples/armpe/armpe.asm b/examples/armpe/armpe.asm new file mode 100644 index 0000000..0a84be9 --- /dev/null +++ b/examples/armpe/armpe.asm @@ -0,0 +1,34 @@ + +; Example of building a WinCE executable using direct coding + + format PE GUI + entry Start + +section '.text' data code readable writeable executable + +Start: + mov r0,0 ;window owner (NULL) + adr r1,Text ;the text + adr r2,Caption ;the caption + mov r3,0 ;style (MB_OK) + ldr pc,[MessageBoxW] ;display message and exit + +Text du 'Hello WinCE world',0 +Caption du 'ARM small PE',0 + + align 4 + +data import + + dw RVA core_imports,0,0,RVA core_name,RVA core_imports + rw 5 + + core_imports: + MessageBoxW dw 0x8000035A + dw 0 + + core_name db 'COREDLL.DLL',0 + + align 4 + +end data diff --git a/examples/armpe/armpe.exe b/examples/armpe/armpe.exe new file mode 100644 index 0000000000000000000000000000000000000000..3c5dc601055e3e70663023d9e796840917b00ef6 GIT binary patch literal 1024 zcmeZ`YG7bwU|?Wj5McQKpMk*v!~p^aFo~aN07~=8@8V}w$pNkm3JOFbD`BVUUYKe4rfExeUx8H6Wk>#6a;{J*ZZgKDbJVR*+H<2m#95 zK$vtT^-5AJN`N*_0ND!l3*4_zmn1MSJb*H3NG*8GA<+LwL!ti>gTaEwDIexP^NoBjc|>FCEH>(+Lok4#6rSd38s%&q~}u)%0=AgT+%cCb?VDY|Amn=6ox~r*6Td}mkiZ4+Aech zUcR80NWa7axK`^m-PMB{3H%tDdvx@p?&_XAJenZg8}Eqj=tSv`fZljR#)sT{de5Sa zBC9aah7J==G-wMl4d>iV(kdL-Xz{=^Y7Kril`N@=9164_NF4I{^R8apI`YqN;8-k< iIH0}kFBBkGDi`vargEYZN5|8Y&*Wq|W^Mn!8~6q-$wVUn literal 0 HcmV?d00001 diff --git a/examples/armpe/armpe3.asm b/examples/armpe/armpe3.asm new file mode 100644 index 0000000..55f1aef --- /dev/null +++ b/examples/armpe/armpe3.asm @@ -0,0 +1,13 @@ + +; Example of building a WinCE executable using high level macros + + include 'wincex.inc' + +.code + +proc Start uses [lr] + apscall MessageBoxW,0,*'Hello ArmCE world',*'ARM example HLI macros',0 + ret +endp + +.end Start diff --git a/examples/armpe/armpe3.exe b/examples/armpe/armpe3.exe new file mode 100644 index 0000000000000000000000000000000000000000..d904a66032f584975e754b4b0b118e28ec395eab GIT binary patch literal 1536 zcmeHEy-vbV6#fbw{KdWjm&CzA8wTUx1OXCEN-*feWTlNZp)DyjGInt135b0N2jj#G z@D2^g%m}}!K%$Grkjc??(ZB%l`m_+n9IO>dR8LL z!vVL;amUC+2zepg0YpvuIq_k;$Obr>;u8Nl59ru`k#Y$|auJpeYh_*Vgsg~i_ z3uj5pOE3d&L`{)xIqZ>uK*N(yu5mI=pYh(w97T7w$A;50VK@cc*%prv-W|P{(L#f| zP%(fE9X)g@W~f8L1$mv&4lJ1H(}8v3y7ZaElnK>QL5<=^LM*~p&zruvjq=ZL;FPV8 iIHEY7uNk1yY}KlgB+^DZ3&-b#&-^^D*~I_v2EG9S1w + sub v7,a1,2 + add v1,v1,1 + cmp v1,15 + bls .again + apscall MessageBoxW,0,addr outbuff,*'WinCE Start registers',0 + ret +endp + +proc string_copy_atou32 nospill,dest,source + .again: + ldrb a3,[source],1 + strh a3,[dest],2 + cmp a3,0 + bne .again + ret +endp + +proc itou32 nospill,dest,value + mov ip,0xffffffcd + and ip,ip,0xffffccff + mov a4,0 + add ip,ip,ip,lsl 16 ;ip=0xcccccccd == int(2^35/10+.5) + .next: + strb a4,[sp,-1]! + mov a3,value + umull a4,value,ip,value + movs value,value,lsr 3 ;value=quotient + sub a4,a3,value,lsl 3 + sub a4,a4,value,lsl 1 ;a4=remainder + add a4,a4,'0' + bne .next + .digit: + strh a4,[dest],2 + ldrb a4,[sp],1 + cmp a4,0 + bne .digit + strh a4,[dest],2 + ret +endp + +proc htou32 nospill,dest,value,nibbles + ;if "nibbles" is zero then leading zeros are suppressed + clz a4,value + rsb a4,a4,35 + cmp nibbles,8 + movhi nibbles,8 + cmp nibbles,0 + andeq nibbles,a4,not 3 + movne nibbles,nibbles,lsl 2 + .again: + sub nibbles,nibbles,4 + mov a4,value,ror nibbles + and a4,a4,0xf + add a4,a4,'0' + cmp a4,'9' + addhi a4,a4,'A'-'9'-1 + strh a4,[dest],2 + cmp nibbles,0 + bgt .again + mov a4,0 + strh a4,[dest],2 + ret +endp + +.end Start + +section '.rsrc' resource data readable + + RT_VERSION =16 + LANG_NEUTRAL =0 + LANG_ENGLISH =9 + SUBLANG_DEFAULT =400h + VOS__WINDOWS32 =4 + VFT_APP =1 + VFT2_UNKNOWN =0 + + directory RT_VERSION,versions + resource versions,1,LANG_NEUTRAL,version + versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\ + 'FileDescription','Demonstration of FASMARM for WinCE assembly',\ + 'LegalCopyright','Copyright (C) 2006, revolution',\ + 'FileVersion','0.0.0.0',\ + 'ProductVersion','0.0.0.0',\ + 'OriginalFilename','ARMPE4.EXE' diff --git a/examples/armpe/armpe4.exe b/examples/armpe/armpe4.exe new file mode 100644 index 0000000000000000000000000000000000000000..965c9c96a8a8d914e7b65fead141a85587ffd99f GIT binary patch literal 2560 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

+qSRYr=Jhh=+-7UM+yspHSo?sB=Cadu(N*v- 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

W98b_=!O2&i82BK*dR_I%$)GOq5Z~8rn{Ph*t9b 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 literal 0 HcmV?d00001 diff --git a/fasmarm.o b/fasmarm.o new file mode 100644 index 0000000000000000000000000000000000000000..aa78699c8c003457a84da672472919176e92a5f0 GIT binary patch literal 280220 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 literal 0 HcmV?d00001 diff --git a/fasmarm.x64 b/fasmarm.x64 new file mode 100755 index 0000000000000000000000000000000000000000..edda42f8777a5c3c469d5a9776fe36030fa90675 GIT binary patch literal 243888 zcmb4s349bq_WxX+Op+NoK*A9Y113O(V1i_qWM&Wu5CjF4T~WaWuW9dN(haVnG?^Ka zPRn}V>$q@e;c{&`6d9FBnPJTe zle87u(#>otmxTWoyk=b~%dkQd%VwLLOPKgelxyIMzjiVXCn&k8h)z&FITIGn*pxm& z>C*{mErJ4n4W)zwT?tW2UA238sZH}H+iY+06*nPMd&Fh4g#%|cQTFgv{uRhR23}O| zod&0EF!vgsPVOxhe+kbzEmg}x@l~S;b1g7e%mPEJTfZ)~6*lpl%6$q_pKEAn^L{0! za*L5{K55^fa0?NWb6>>MrghJ-*<^1O;)XV%1b{iocAHlFIATw>;PKWQc$@?EaNrgo z+4<<(sD=NGyAnJYwc0DlT6GJtF#5l+FbqXHurLrwVqq|sidZ?v$;W)w=Yo=vqx}wKmkrf81gZ-%y(`D1^`}bjq)IoTmsRe|dM9K_z=sI< z8Gr?~@v9)vRXsif;5`6p?D75pOi=sWx6x^9;BG@1`fK2(wZ(2|i%kR${RJDiF#z6$ za%mI7vGfVXdOlLkid_km)*nkjpdZDKmICLhpqdm6x8#d1f4(>@960|K$VlnhPIR!6 zc?_vIi7y=ZiDit{YFWlk%21Fo!Kh#Ae^4CizfQcu|A=_K|9bIS|6P1!9rFBR`A98= z<$UBgg;V*+&j`=PV7jpCipL|3S%oa)Z;R=e1#OurN26 zm@5g>Zkw|#sANtBH!K@%jSeylL*<486s;9sRJ}tH6N2Fp`I0BPUh*hh9{`lP=z6g; zz{UAeY6F*#x*VXZay()}Jqh{9T2oprj9XKVV?aB>$7tn(8rZ)c-8c&cmB2Pc$0|Sb z6@7sde+Um^-7J>YUQCk-JM&Etk6#0DVXd-esXtrn?yeQP4k-v__*3Sj-`|+}NSb|3 zC|N%=!PwjqI~!BZ%{QpS%KH}7E?(*nh&@oI3(9m#z>^jWtq$q%*%%Syk&%|jIJ#K> z1w<05y(r!iQv*5RRyntHaimr{rv$no6@xHJ^7*I_a`*x~+HPsFK!XT`ZYL1a^06vc z8>8l$>U}{O&eZ&Z;?Ggesoq7%GuG#AkUnl&xxDK2XBP z9YTGXJ?ppA!lDaCgA#ZEK&4gnC&o+;%BdM1bfI)i7O z=5TU4A_^C0&+T}|#ucu=CcMrVz48vAucSeyY(||ai11vv#SptED&j`lPnO>>L1|c# z#_~q5>~ED=je%n8P{iA@NZ(a=q>Zv^pFqM)x}#Uj!JI(CjW2)*6z*oQ0rm@&z(mCA zjydcn6t0YMSVSE1%Uf3XS(VC3%of*Up2Luu5N#3%lCmlrmI~GVjWwh-?nC0CL2Jch z@`Y?^w|{hKyZ_eN`}M6c_aSN1QeWUmozupL-@~l4*j+0fGroz9R?du8e$)2;W*95L zj5%AcLIkrQ&y7`n8mk*T@1?9uE!&hDh!U>9_ zmF?P_Aj+^;jRxtJiy(lpzQ9x9LFy(4j-Y9rm}B^B374jNQu+g6Zf|5wBxi8eK#atj-))~s*? z)v7*VhaUbKQ<{}i;q^vA?WvENcZTB*MotavrAda>ouE;b`8`01+&V;8UBJ4xk}9_- z0&~yjwhgcQ3L6V{H=l%v!e{Mbs(ZJTgaO^9>D#I`@|uFt$_DKN%p7CUsC9*npR?8H zq*6ClX-QcxtsASHjx}(zPyzjE74vBF{sSe&bU82ukyJ5xS*jKUiI{M3fZaO+Frj*E zC!>lhL=^2!aM=qfk{$`QflEP(G+@;&q^%r^tLCtGX)UdWvFdgLA49Chh~I~vZQ!uOBNyZOk$c10%^Nznz>Daa#iVqzNUog*}rCd*l0u~LK>b;BVosF2Fmb!9L(>(3pNG-cf3nQ?2EIuucU6!pq0+2~(I4b>} zz%TD))N8*2YSJ0np@^W4PtdyyP|&-I&;+V388Ky#pmx)KxPS&b3LCXXG+9t@a_4Ok zgJun`oPt{I3xHu+shKaVqCxCR^>GUk<10r)3fc|G)%+$36>_OX_Y+=ql0Q{U_j^T; zKTC9@^Ib;$fw*!~ExH!jc_+0}Vuei`bE$N1bCyim%|{O*M-JSJ8P6upU3DLEdkdiy z-H4Lm`gAprf=EH*Qc&*f?=O1&KGBa+D*nEpQ9t5t6qAJdS!ql8hzZ1t1gj=oPOnOU#!yp`{7fdlqa=JM41{Hnbg<{Yj#1Ry*vQ1fHIqAf{OWJ^^qg zN`(WB|AD0W25wQeTzD0Wma1t=T1)I+4 z&F!#1S+KF~unG%S&<}{~2nQy8&U&lzEQaB| z*gR=jc*Gw=QVonno;Dk{hg#H!qLVR2`U1-k<-;p611T+eI|QY4lUn4U>?>LJ3oQE$ zWUHBb5m)nng^dx;-G#VK4qOXM&?WYg1Eq*?eDnv%0;bAR%H=CIBUOBak618To?RDO~S@`d}8e84bQb8snoY z_|QL8y|*EytTSpAZYp9zh1FUt< zB9emuD{lp``EczyC>v?*FYz0oXe)*WAGlpu5?mo-x3t6;c!43k0i^gaWUHAK0I2!v zK7+NKKOS-W_te5qsfFs89@uM5@Nw@UH`L9?ZALh!(_rppgvL5S8Ph|*La8S?d#RlS zV8cXMIF`5j0s~oHSE8=di?E!4UT@G#9n9T?@<8ql3n0ZMrWMu-iUVnv-VHbz!0F`U z#-OmEj&hYdD0@ssQ02x^v7m2Ey2uIg9qv|&cQND5kWsu84N7$Scj4Mm==&Y2_t@MOZ9U zk58v(X=;vLSX{MESZvu0zQ6|{&xiljLNW`5mOorqhPOS3HJF)yzcz2#0M z_6D8INx_x#sY4rvZJlK|tAWWVCMb`)eSryx@nP4mn7fy{Yx&496o$v=r>eDIP~(N| zu;feS3j@WO@`e85tyo2}gy6>u)(VSRe&KpDRR~Mi_iOXc`DYEthOZm|ddm5{jY8F= zR^uC?I%q6dOVqzZE~r=eeSE|L9RCdQcf#Vhgnp~(4>})1qd|{Q4`N)6*e9J3mX6pb z9x*l>-z0kbLVP^XX*n}FUI|2hHXm6=A?PkfSd#?-pG6-~6#<}o}-wo0$$3lBP z&xW7`wM$ClzO&*4OnLAOk2ZTVBS-nx1SBcnDr@x9g5uQjfNr_AXHqU;vn>pEjGB=RU?9vq7kLWaVw(D?Y+-QnnSJ;}1a;xT`Uc%)&4gfp-|4IK>k+d(-e}8tUr&vuI+CXD$1|Ly~;No~WG|QjGM>Y`HD-OU`y|X`s zk4y&~bM4phe<1@Ldilsd5i>T&|84?O`N+#AfVL1F2aq3GDyUPLFhUICd6>eVz<}Dv z2Gp*L2GmLDt2v-(aO|LhsDBHE;ESdN8j)8ZB*MoMgilb2=8yyZzYVzVY{2o6e?j&2 zqe6Y@d0YHf#EIqr2#9F*MMyNeQ3z%`Q3xKAC48i zni@j`wHP=Z2WlE+P)DCbM>jznGa#0mA?<7?bsrynmX!dc6CfGL?cvXoj_Jcm_@c+y zth*6Q6&(;BoT=oBp)?FCZRUi!RM;*oK47UO9Nedr zueBf0)s~-n72#qoPX?tNB@RdSd3#K#9w3wq3}wto8&M}EpBCN=rHEc-Z@9sse*?E* z{A^4kr?s$f_!R>GS(<$vobs-mn6hs$7h3AH1#q%~ZA4*W^jafdEn0|7THu4>kv_>8 zu6HzX^&dKIC!|S&JTglf2|jMJ3k(0y%^?Kmmt;AmA!aN1BrKQ`FC_tD3tTHN5ZOqi5jFf8WkWw;)uCoiRpp6AC=IcVl=46`Ki6CPTR<& z`5~U>^z;WdkE%t}P>)jdM?Ay%lks#2)sqb@zHb0C^k}q^k9>{Q9|njgT;~)P_U4td zgS`WQNK>+~@Ckz*U8sSs1X4pVV)JU?q|V4r2;;88LmEb`6elbpfoM6x7E(_T%jgyUgu5)}rE8v0I44ZdT`s z1ITPHZwie>rOwT9<$Xhf0|s-`St8u_ei_SoQxnKQBPOOi_P9NVc?8ivsljx!P$lp#5**O7J( zfU`~=l0$S|p;TZLHpZWZ#KLv1@G-|1w6?FtU_kG7#p&dog|%A`hqs{ndsi6WNJo^t z+M~!+zM6m7fCASYPA&XOIlsDFTY+Jh6u`!d5z2zdTw%jLI~7xd*te<vS2hMn3)kd|2C?iF9X*?az%FW7B%VVJ9L^WoOmh>f8$OfoGAsT9__*Nge` zZ%#2WB0V{fk2xr>ggb!`pMYUwO?le;(2BN(XlO{?{%$E>GYKTD8<*yh=+CN*;jD}!3b zvogElRLjeV3k{fY(38sltSP*PL)TNybb$Yc6(M_xq4tgxD5{PHBD9=u`F6@QPT!mIpO zNDicih%x^FG0A_M6e7h z!2xY>7+ZaThNV0m8`Ez7kyx<((oaU6e!!|<-@$gOjR&?6zIZq4zg-R-M8hzp@7JhJ zxMVOuycUc^wo>{waa4RAA`HI>_=TW75OwsF152o!co=1RqfC#KqvB5Br?*wMkyZAU zu^GE&G?p6mJcb737JU;WW$(QpKvKvOAHa6{9#DRWkRBwYC#9dNxodzR=Z?Yi#QSbO z`UxgQv>Lol1PV=#%BjT6H?OmD-uQ-1JdM$&dEl#H5+yOjEKQMj>$3=Qo&Hd|LOF{mLnAx$&R@aq7wSTp1$i)!a-3P`Q*U?vIG6oP*VV z7d?x*;VB3D5~4VYbwn@7ygS6@C5y~*I~-=>-fL`DinMo#D^k!`Ffbs~sEfGD0E^76 zUeE0Z%?j;J$VG=KKvF;O6Zjv3dnWy10+NFxApJx~Wm)20fObRUwp%rAW;Lyg6&%%* zXl#9&7~P&6>P$XLnnVLrtAU3&)G691dW42C)Co4-Vc%@cicJ5%BJOgbxAECPuIDCz zF(#O+5pgKLGW8e$4pPwOH0%I=F}*E^o47tC7x9M}6mGI%->f$Z)i`gg&QAhdE263o zD}k3F3R;OxSL#H#fNykHp3-u_i?WRo4+)Dw{`Vk1ipVpyI%SMOxURU@gaW5S-E~ z%>}hMAU`F16s~hL@3d?|a{Y2X?y-M>@5baX+G}rAabI+MXz~&oWzcbkH-ocmEV+Rh;kOTRhMJ;f*A=~ zlYt@ag)1*b~goAFBkw?ye<+NF^UDh9Pa-uC4TBjJsdZQkP z^Wc?_J_2g+uNulu(=y$zY$T1j1>o>;C*=r>3mW6sAZ^rRIv|aedI`Y~`Q@90g)^PP z!7Hd5DaWV>*^PQ{+CcRp7H5gD;%0J%>oF51`7g&trY`T>IlXK8SFM4p&L^Z*+>Cu0 z^#$FnGN%a-wkg6w$*}(@EPN6jI@xX+kckUvU~E}`p=ug-y@HaA87kQo-vtTE=d#2u z^11%v#Nt+5;sPZ89H@f7Ea@oC;Y=_|rdR}98eb7U46i*5ya$PU@fVs}1$hPeqHNNh z@G&RkC6DYcj=^)5v=}7N{8?f%#C|2j(7TOhD$$g1&TXt0>}f=?7h2sNt?nuqP9!}* zr6Xv&6PeVPeB@*BNBzkhOpDo+fW7AL32OD~HtJC3q+*=2TCg_&3RSTJy?WjpAC&xn zNe{l1)VDhLQjoqPk#696BSwD~=8TS*!dP{Ti+nINm!Ja^y#W`{X>)rp2G`Fv|BWv5 zWhdxhxvs|T4nES8IvmqsXQn3p=~AllD}=$F2f9`aT4?eR%z3woJ^cgt$Pqx`SvW`; zvTum=Ic)MzDaJ?1;x}RjSBH|yG5sypX)3pj2wlhHV$^2xR^E>!M1FxE=s|nv=)_hOy6@!dXSZl z{{v10)|;5FtX>^}+>X99m75EQ!gXR#51wjKe>~;D6%b20AHEDrhaBjG1o$L_N1K30 zxW&dlEu*Ct-DQ96Ko@$|m`FEpYZ0SA3)2Pa#6bi1Q6fj-P9Vk>*SoP2+)m5bmc5W7 zjmg4VErg>r>ROVjK~Fa{rbNm!+Xipka*$WnI5R&08D5T)FcT6?AP$ijgZwa@rzT{34}e6~lC|fO^rklw`LuJvI)L4&xtC$x7%3p}YPgt54aJw@cZo^~VAk7ZW}Zx?HGj?T_tr-eR*!*eHQ`1NS2+(O*6H9&xKFa65(r z8we_h|7TsV8w|E z%^dPSwlaGx@;$=BTC3;(^7_R(@=+qKaElPLunx6BcOj;5Pva>E{z~-u2p!-nr{%yx zBpu>dHS=-g;vCwP8%9gL!)9>*08lNOjwh}_ZHKvv?iqp^IHn&|_Fxndwo9l=inp@8 z_%MdZw9Vk|rn1~jJhgM!A7ks|LFp{98=n2eWOji}?~Id4d$^W^8;+a_;aWPob;CJ^ z(M%JL?+NLBWl#LAw(XMrM=-He`IT*$y216rS18CNXDo0)l z5XU~P)PwU)I7#5*7t;jaeJ<&=;mMJfTXIU&46hZl{x`xvM-0Yx{tr;%{~)QH){3AS z8r>97&I#2{tXDlrHMSwsSG4_AjDX1RFl)rW0svP5e3{b;R@r?wXeqbifHl;@{0*V2 z5xu}<${aLI@|(3V2>XhjVRQ~5&cL6+w{xZgsv5eWUmiZireQL%iQgL=VP}#YdSSipG-96!nhU36%*`g^lkDL-lQ_j3$_W^8 zd(pEJ2h-lHb(yw2VUeGa(>MXi9CE%FepAfGg>vYvlXk^hC zz{B-j*rIY0Sv-98(RYxgC1XL;aT^uOno@Kb&{QrHPu!)Zr zrhjTyWA1sHxT~mUaRj);CTjKD9I<_=wgE0KS5J+82>iCt{Mi(UXEHb1OP;K8z1z z9(I%4a6YbVi>Dw-ME*fU>f5=_$jRHRtwU$Axv$L;8+xaB*POSMUHTh_xjsSm+CPA1 z$(^qlY;r)PSc@*;=nm5+5zE?OvZe5;vQ;e#Ap>q=w+kWSh0+ zCPK8<=WW(i5{o4$Fn=x9NtOHQ1*eT&^Tocb&RDOFL^I=s$Wk^Gt~Xmm=cE}qc32R| zqj71uj*U8>cQMNI5gQ7aRqGqWXKha=HSes+CqI1_oi$oaDC;`h$2Nf(Ik=CVMi;Z` zQg%|)x2^)(w|2OQZOI0=u{X4N26luI-7U1b+=A?PmxQj8aAM|ikJjNK z@VlpnE;rM+>sge3BGi>~3l3}+TFru#vIdelmAwT$r>U$GAsHLDfoa_EATvMWMKr!1 zOlu;>312Z93swVH0Uqg39~TZhNpW$X_6L^VkLBM17&^?R=Y|8fvHV(XILo&qU*#qO z#%}p3oDWf@X#X>`dThrNcVy`4rFi^XSogl7wTOz>hXXvLR5rJp%5jMLI47Rs?+vaQ z2zsW<9Y<)aqno<2n5}U8kW`Bn(36Ycsc^F??wyP0S-cctb)_~8B|-ymPNAHJ>DC9* zp|ck{c1fli{9W|8B`_Sp(kqZqyR)&neeSAt%2!`_s7u(9O$JUrjwVh%QjSVT@L~*yoHwH@}VP79elT?BcaF#~2Uf-CXr!8ec*W&|xhs(sU~Y}58{ z#F8ee`8yXv{LL_cVfl(zo7I^|YHZKu9F0{4#X-WYy>~H*zk!5x{8pZ)f37qqh6XG7 z=Zlda1u|dpk1Z$y$6|tCYbaS~Dw8iT24MDmj8-y}D|ZoMyf$Wi`;kHb zal{m@KZnjL*xDfbJC%qJqOUsz_{eKebnVYDv2jI)Rp9TGCFN5Y(-{lJ#}TYqQp;d? ze?bxGeA|Mg{RU4eA11#GL`+5L6f{`4Tk8vdOWX&t7F>G>V;qgJmtZ?vpX@Li(13cH z#^M2UIdBmOtj6<^ZYwqe6$9T%nS^cB6ZzFJX5zFlB5wYWSRSo1#K#$BEUa=|AyRPM zyN$J8`vrFetg4{~G?uUeCOi#^xg6@AXh_wX8r*yhDmyScS8YLT{`uV=+&)94hz?BS zBX5~eFQ6})(bi7rAv1a_u8X8#DFE)3m^vRtR7(NZdLA>LFQ=;tPeV10%?;cc72SqE z?H)pKqer#XaFY3oKC6Z%RQ!n5I2_nUNSKcj`|QN3_8~Bs+~d!H7zrrcz=wZ6p#

%CUr*(>-L!&45SS1VbqgoYlGPoY9QSO(yoCa7Y|ZzF%=tv z7}ZT<4>pPUYSbWfvn9fEH?$$n0qs&@GNV6g2g|G~u`3g)=t1E1h+N!`GU32Mun6^E zkC71c&B(!xl2wQr-c5i*4s9K8vK!rmCF_0gN;gQ}Pv@imK^Q*nj?>#+7N1%aBuPw_ z(2HhmMK5rhI6Uwdh^78QagyxGNsrT;Vr^w^xTs9z;xfFykdNK~bZGKK1SoC~A9uxf zLt==#C_W7Ea3I5M&biIh>bW@%s8jSP66OwQA@IqU_6s0Z%?X))2QMjK@hvhe$tGG{ z3s93Q$0e0rD&RPKg*eeU+OyEU_D08Wztw6qE%h&w@wYg>kkstBi}+_ge17GS96Mhz zDNzR>d7vFZhvOitil(VM0aS_xAWqke$nAf#r3*CAl!(2o#%NwN!)icz8qP?D(gb7I z*R$4$r3eP5iGBpofg%L0okZM9I!{B1PGH!;sf1CP3ZpU!MrE4*OTyOF53-|{AL%~S z9hGhR-fu%fmYCkd0RK0Ap9j|UMU3;mS*%(u&~Alyr;X)g`{wv#&_7do$6_pjx!s=s zp}hN9Z<9!%ydFX`mDi4_;pGAEsJyr!#m*%dEk2qI0~*R3F<{-&M6Yri7GQ0_WWNgy zSYdDNgv1K_ZV!U^E+B;i|3L<7dV5m`y?O}=Ca;G`r(Q+MYFk35WZc~1E9N1?YF~nZ z2LP&e!eIVMv@38uy|rc7>L1?vf=>DErd#WViWm<0D-t{RAHoDGjGV3nqIyj5Px*g^zTlu!WCkU?c8BgV^2`?U@Uuvf9(uf+N&|?%I14q+6`fB0{fVS?T{V*U?4I znnA*1?Er>rO&+VEM0ynmbT7)@T@mVRwqQLEUd<|pw=Y=R0JL`9;T9erc}Q3%G-1YP zA{Q>_n-Q2aCjU1YpMl?wG`_xwMz6NQRbbR$UKIKSf;ke2A=OO`j@DR>10om#R_LuP+XCcUJQ3Y9u!h_U>}ssmrv7-q7i3Dy zC~P6q4)QPHBln{^WgBxAz#SD_F^D`IiL+z2ikyy501D*MUz}}9>y+HJ>&i%Qa5Jj#SfE;p$a~-+l*moZbd9!kMY^Y7CYgk-7_)PE=sG3 zdDN6s)JQa(vfXH4w3-MmhJ$D}xlM(%F-+mo;lxGU!b#P3nAZR-MU0%pF%IskW*8$IA5y!7Hd zeAIzT75KO=Y38LjHJFBO1LsWn592BkDL4u6qS{7OwZb=V$ z;3-ToHY$BSe2TnTc%5RD$gRNk$`)fDHGp8fJ*b>AMK^?|NcgohGl`4raV-ptL>p5 z=OhUwWp=m`_~p3$JC}FpKZAwpGDpHWLl<|o=dou{;_}(fbMBGj_RyWU4c~j=tLTXN zF?u4IvG8?7;JYbPwrtgKpT)s{+{?PA)pqlLOf$8)zF;fow8#1wp znU;#!kKrpmfxi<_(k&p}!ryvCe-~q#cWgZpZZ!1QEHwjXE!dk7XD+@{g;3?VgRiJS zgmLI`m4ZWhG7dW-qF)t%{c^jFHmF}~UnB~5o^vA#hOT3Uu4RSj$qG$I1kEZ;G|Txv zn>8SmZ82*<2Kl0mGwpCwB_`cO1HPaJIL!upJpU{?=Wr9Oj_KGaK0+UBfhr8;qgNw` zw(LXs$Z$l%fzVv0r~{F(v_cIWdjhuqaYx=a1ZsctpbWUoFPiraz7qo+zT&A>s3X{b zc?$0}DCbSbW}C0wwvMj|f(rsC_TVN(a~Dt7ao`YF_Gs78Y+~-;3BfJ+Ztfwa3Ja&U zDw(&VqFDGWwu(&j)#L4nJ68Tt;uQZKxI+{Y2m6DPfGI%bmH<1YR_d;DcO#~74R~tv zFkTeySwstWM1YKgCx?DayMtvu44A&3k+=s@kl?flEa#6%HgHq$q(A*j2r^f^ z7tb6vb6zd|8RnTJ8ujMD3!in0#dGdvcf)39LfbJabHrX0t+|cO%La^j+fPOw_E8Wpk(_|xDzs)t(;c# zuLW4yqihw_$8Z8auLn6(Qv{Xdrs;pcWaqLvoL)nQYx9dgLw6RAar?OE5aTPy{Rcyf zdl&IG-{vJ3xiPIBLAF&nJ{i?!Xgt+wLl0o0DG0gz#j{=h94XztnaSU(Hl{ra1EyTp z@+ml^J&pZI`Hy4+Y^SrhgIFH1?r$i?uAoYKGDt_aPwAY3_ZAFldH}7cH=Ilx3@#PtL(e47`me4v*E$ zQ-~CA;lqPgLcTC|?n64^=gI>JV{VW*$!O5t!)z6jaFrV$swp%0nE94Lcf1mXkuLRs zfn&ExJt@y_G{h)$hZ}H(3=x;`F$?i>)W@-e;SN{Azflvp5;S@bbS#>MBdEUvMy+>1N*eU%MWA^xUHtv_gDp&%+vU_ZQfi@7HHMnrC6W1C`aJ5tG22qC!U~~+r+Na<9 ztbD;G-YFkyl`pu(>GB0n`AzbLB=H7ZaJ9>ErwZ#nG0co9Z|Me#7?el6r$1 z?6rELQZ^TBUMK~%th2Br#)g1?GI0-qn8N9DnUM|?GI8P)-A95n-$(ciTYA3Y8vtCYI^2h7)2@0ApgY*o*~k9XQIyM;CyQHW$YYH7*!!_!1Ks zqE`{_yH7|-*4NANY>Jh+^i`NVR-z95 zQ`|=Q7cDI>6V)XmQQb$9HmS}6)fs-snG6U&WWNF-b=K@2Lz4ac?9?IIex9$q2{QuT zsjQfcu)X#yIp*q6{omWGe+kt;N7X-#>Z_>cLew0(FHvh5YAr=A$$aGnj7E#%)pLeP zE;Mk69CONN`-&-Zx|$8EML;5@M*h3KmJdMuUDWgss_C!BW?#|9a}{{*JEESjljgFs2^yc6n(1?zgQanllCEYd z4>`{+5*FTMFE|9~P@M6P69fLc#bW<>GGOq+NoUp%L?{>S2Nc#GhWlq_$u3ri3D z40crzXX6=P&V;#fRNmy$hXU=8e8E0vue`}YMo1s1>0ow`H(%;ZrU$HlOmeJt0~aNv zN__lpnbmk&UZdVWSj3wij{tx=={{-WYI%JrR?{zVOY;i zrZO0HtPv0S$MKQJp@{yw`ACSu@qDD2!XUo*iEv24>SsX)LkAQrVpV0y%aQ?bYhQyF ztH&JmFiGI>v1v}s7uch-dFBf$uN?&Bz|(ECOs49~l4T-8wCN+KPoYAv1(tp$jRi}4 zDFjP*C0Lq)u$6l{L{}xF^pw!(xrod&HZ$TE^Kk&^41#;z$utvMi86M{yDjCuD9=MF zVd;5_lt!WU2K58FLV@OSF_?^KM&;^|zHurm9?)Na!P{85nJG zI%1H$|9KP*DQqk}iZ1TPbij>gz7%Ty9u_U@O;ejOs#43l;@hJ5a;i+0#!vq?@S^E~ z{fs^AL`ErFah%+jwF|d+%+8pNO01d>9MXGVoV)s>Tt=vx8w`$wszHZ#^P_zA%5Dn>Byo&!4~{u?ZIq%kW*D zX1tFF4nQ6en$kTC;!$Ek+GRr8Ocxx+#7h&DPReGLEW)%;hyuST*>0~zd5>UBaoZd9 zoyrzQ(GEzsyUlEJKdMMjFJrC7W2Wb#wu7~pF#ie0n>f?rQoIRkDRx9U%&px4 zVO8$crn5j$r{Wf(6K}b=1Um*;=VYPtOjkK-x>N=orOawVDQYIxY1VAi0S!bNqqNM^ zc6$P^TMVXKulU^1L40y)Fxb8ylI53nwUabU-3N{c%G5T^ge*bxVV970rI7Zp2Ny<} zxOzcCOjZwj_(dA}B3alfFj?t)Vp!io8+2~2 z*hfA$KrEBbJ&(^KHexi~b|vUo_AD~5^A}3*o4G=^uZG<5`O>@XsAYJMtmj`%3eTe4b+AJ6zYY{n!@-v z0`ww4Dgg@O=p5Men=lO=Ji?Cyg`e7jS1Dv;+WibQcP-Lmw=(c!6=Q zcoarr-2c3kZkYyETnq)+w*#mRxVVD*JAlw1sA2&;h@yK@bT^7__df@(+w)RZIDZz9 z?B$*10AW8Tx%Dp$?m9#@u`jl{Yn9(j?u12p6W(2sM?NRbq8k^cpoZjBXHEjLnZla| z^fgMW7pgJ~kY()${04i!nfjYw($*MkRB@ z1DH7&-=*L+*Z;hj2i|`V-mgk&lsfrOh;Dx~*48G;fiJbJ>jPf57~G2}rJoGvs|fAo znjH8Lk>{knm=18&-hooNC>8R-8Vc3 zpO?bIS>lvN`v+mUhBHH`zSE9t&z;dx`BM}e7lw-2+AqB^&QEKHS)i|JTef9i zvs9(OY^CFWhK`t=CJYc%mA4DapkFFyudfZE>pXDudcZ*WEbT=Q)HS@FbGCS^RHW=d zo0L`w*UK!Ffc7Y%95d=sK)SM{^%3ul%Gh@qhKTP_Zs&_~kD0bro3Rql1waYhgk!vV zuJiq5H?X_$>*xvyIiw=5(B%Ry4+vq+Q{2KY7_yW!-j8EIdJW3&;3IUs)Q`!ReFnmv z2zh+mfg^t9-%OduM;7JyKSml2&PSQ(@EIvXaJpz(OaVEH;<4i z;A(^R0b1jKmXGWN*#8_Kc@A#kAg{aIyyXK)k!jt{m8ZFRBy0z+Y`OY~jByDV%J-WA@}H(@iF!ph*Rc`4Rs+8w6afuWSq_v4ljjfYGcv=*R3 z{Lc_R#3>qIu?zCWRsifNv7pKw6fjVON@*9NdQ!@kxV+!qv{R5Lx!t%_=C&u+?VztT zUA&$kI4}MR1Q1QJizBgQ4d(8@2NdYrb*^6Aoh+W^Jx5{H6i(%?LoAg$f@c~x4o|U% z?A?LTz=tHTbg^=H0+(olyavtDQqigS#$6g3ht-nSvSfTgr%RodZrk@r8Z7UiQsxk< z1T5R78E70F10MP&9{Kr2Y;v2p8&C(1TLmN*aAT36Ec$+K3HLjs_-N~57+wpmo;J}Os&Q17MY54AEyH}srYvBu4r=$zM zN$Fx|tpu08^wg@g45Um-7pi~`tHTZ}2%X*;22FLDS4c1QLSl{32O5i!S3ufat>B&C zBUDdG1(sW*55pmmhC~W8L))g+APRtksltfyZhX(eHaV4-Kl{Kiq|x{Sgd48f5#v)B zJdKy%B6uF)DeM>qFFU3PRrp9=)#OwOJHY;4a&V|$>nozN3^LB{Z0|9~luwfZ0D{y$s&2nsNTM{hUn1hqRQ$#{iJ?`F{dH z2IjPjXwg=Z(fWycGyIeb(06=dPhQLFApzmrbz$r+@YN4ulr^QFCJ?En zhf=E!1YaHT9Ul!*Ue$O^ITGHjgO;!s_S3F5@zN~3i6$O>PJr-I+B9<$c?9uFgLMF| z9i??+IiNTo3cmX4Yl3eY=EGDf?@Q*Rc0`yVV%jp)Ia&~FRY%TmG`a1seU6SN1=#c+ zksF^Hd{t<=+I@(RDhaktcKd73CJ^5-5!2cbXC?S<%KHk~hBVlB^V`kb*2XvQ}S`Rp=B7kyU`KMU+)v=CujU-GyfO zFs!{N-ku|c)8>AvyMUh?ViVs1(@DOz6+$Q+COPx@r)JxqG;ee(M z!_pr=-}JvQTJFMj(v@Jg5CUiWFpJsAf=YarkGF&i+T~tiIg9^r3;*G%1ix((egXA> zF_wcX=;f}qoIeu>jI%@=?jb-znWKvkm*;tGuywwqBk+Vco2Gfg4H@x32h>|Tpgs>& zOceZolBKEU_k;NVl;L6{YmPKZ`#tih{BQKOY@({H4&~`~mWlgaqWG66?k197CX2Op zc&M0VgpRE;Ir)UWcZ&f?^TkX|ARFIdoSPHKOiUmv3D7jtQ-}{C;yb#P$wDQHFMzh? zB?~@|vh8*c2GV2l| zzIGxHF(TIw$3kDAf7Z+m1uASTn{-7p*FV7uAFY2IKV8642RgvR1+rbMrg^A&VboF3 zh#k7eF8!p(txk9e1?0ekAb_u0S0T~NeTSNeG9P`6s3k3TG;_6pQDa5NatxqkAq~Cr zcVWaFkMueg;&i-xBumfgFBI+;!dKIA3>#ow=Eh zC6AO7)V6BkRrpS?Sq)r%Sab4#V{P6+pOQT>nd2W~gy_awZyi&WZbR(Sz5pq8DO<7j zY{#BGp<&bo zxFRW}kN#PEubRKXw&(sz2ucsyr^AMGC-w`~+_j)U`>{PJK&nq4J$b*G_CFv+1Bwo> z;mF}5?-S`D`>Zuv_vw^G*;;qR!!KRuDeq~T0Q|}W8Rg#j2XF>u3mUkFv2{mqe#~&< zR;Q87FTD2e)aB=G^QO$-KtEX)RCWfNcLt5RVEAkiUzyLc&t``_!EijA`tw^&hdc1w zBm9Ruf?v>`L$jLZHB?$mX{)I2U`EO=$(@2VPJ0WpLG_=~>JDC(vMVu{gzLSu$ugTF z&M})2RL3U;x9$tpX-VZ7L8CUvuiTefo{CGAPOu)_ss+O_9^78WKl37JGQO`2dTp+b zT&MAsb11WLcko-SJe|mVfDgzgTU6=}rUp}Xz{!~4Dp+@r2LODr4I19J?#NjvA>i?@ zt^4YY}9^0 z2%_5}Q+KdCG4&--EKyy|64V6WWC@>j^OdiX{+u&yeq}oxE6VnZl_*xvanmuA$X@+c z1ls-39N5^L79@=^4Lfs;d&B1pDI;JraDeKKMH?kII|wefqjL%y!+~SBkUE<`6EIfg z9z&9x?qe~saCEyBNg7J{G(jp6yro8mt5XmK_k47`3A4lJ?ju+|cLCI0 zviAT2yLJbWbV&p2xuZxsKr~^*(XIwPBr~Nk$Ub; zU?<7mFeC3Y$#WWgP3fY-Uiu9+;`CiAX8xcWAAZ%OaSIB&W$)FD2Dw!dML~X~nU%w` zvW|gjVg;A~iuc-ba%ua?Y&yKDbbTjp0HygA(SAlt2hC%m_{3)dTu)6NYKF{|5+oh z3|);_VWWOnI|wfTegx~YT79S1&x|jx)xWOivQfl=d%k8cmyJd-oTM|0|JW^8cwB1ONX- z%x@DPoaboT0m)?eIWc`s%KLVStKG-x$=a{jhS!X$&V3AcZZ3ppt>(fW)DK_eh+x3& z5>tZ#7d~e<;&n0xrUAi4M`e={X;V)TTh6<00+ZNs-V1_-y9?J>dxrp}Zhv}pes4q) zY7w~;8VDZo@!4sq+AdNhY`Bp~)4oO`{tkrqEOB6n9xQC`5&QV)k0|2a=lAg8Z%KWV z_{c^IVL8VTR_A_+n&m^hiTvwpaJ6AkdXqE)PQsTcOcAfdVJTm^1DSH*UE&lCLRInc z;1);M(N)N)YRTcLzGaBJck|K3gl)Vk_LYqn`RHF+*?U>pNCd?!WkQ%3qxYQ$lzmEO z7Gg0>Xle2}yOiuUBxhAajA-6O^~9>S>L=ZpAc#qPCs({qKFf&{7#?>O;Cr)`utL=J30#3fxW2fjlD?0*OxbDPKZc7H>Xu_3vt_O`B<1FKE68^LKc z_c{_eJT2OP1ZO0lH55WV!;nuSW$UXXnhM~J;-l{(Gu{I^bi`aHpC1bb&PT+7a^QAC zfMXiWrO5$5Qcf{le@-^WNl(jxAxOKV@PfVZxtOj16wk;;R6HJk5Xq*x6KFrGsan^% zE_)pxxf#ItH~G<4w=#x7rZ8j%Hi|7F(~%YpY$7P6wdPZ5KE=_`Ey^|o}8UvPc_j9f(d z=uTiGdR-Sjx*5^xK98e_;DooWE4*!8Zgc0ggm>BG-L|Sew;`vx&rNu$-nCOPPkC43 z*%Y%&8S?ogahOp3WXg#1>`ga^3v1cyXTeb*msk)p>bc$&5q#HW(D6EtgcH+RGQwm* zelo=&o}|FVNAE;2b^>-9)HV9-1_t|F`bzr90b(|+G57&SScarVuXr+bI~9c7C> z+p-_;ke$85{5S=>x2+te$^Mg<;Xz2ecBsFKQ-4&6Ddr{wIQ-WpY7mZ$eU!wJgP3+< zDP}wkO8`xoD{i!=oU2hrsGey}?DRzxv;s^&CE@zSa6><1F(uF$7rv(qanPCGmEgf& z#YbL+4dAcFt4S0pT2V5&;|uUIE8!KwaYrF${(->PZh-Do2R5R1qH5XOtcI~F*B@}} zAl~}o2WlmE#wnUQaA5prtNt3ZtiaodBFsA0Hg#z#MU3H8y7UnRJ$ zD&dn4xbD`c_6EF|jyEf$44)@Q98kADeLO6rp$vdzm96z6%Y~7B)lDz0HdZ zbqCXf6vtI?9H-;+zNWb^2MkaRh&RiDCPYs15#0EMdpM3n3*-PY%`sY}p<5$CP7Zv7 zoRQ)+a-bd&zxa?G_!5y*=B`u@)F5%1kJLa1;_F{T0|KuD!bh(GrDBbb(u+Lw39Mp- z@e({r0)HliXNDrqKi%KVuE?fTWd@}*zM>1I!by0R1ST=;bKsJHnw}t5@e8FY=?Uxw zbZF04(z7JchhdX|`KRg448mT^^63^VVJ~N?#dwwkj$col{EZ+_)042DW%=|ZPAVuB zre{f@joqHQ$+MC zV8a_3rNgFpHXiaf2ENB@$Qv9)m+qC8SY;Jj*?= zV0ZjlfU0)HUk0PB8CYaKdmha&Pjr@p2|n@*o-orv(Jl4@#nc4FE@D4cEoPtz?gBl7 zf^;IhS9j2R-g>D~?=kd%u(Ue!>M73lv*2PZBbINmDl?}oi|)i=>_v;ffi?SBW20aP zzQ#cVHB2()@sUou*axOvH@_3N^jtW!&JLyHTI&G+bg^>_eXAG$AkQ;+8$>^@A5F?R z;hz<9`yZJ@=jq2;KV5}>x&l`>x8PNiP5yr35zze!ebfbgl!iXqW%kjxxND6vo5J-T zya`}-)0=eD4&3JA_!z%!BAxLCwq6TWt6caDW@(&wK zi%$Y(755-}-ou`EvFA)Y>$#ioOxLO~M6~KA?6c3R+^R|RxsH2K7@v03dcYm!Qn$ePjwZ1Pb>WU|5SMbdma+%8#48(0WonY#5+$t+ICy zO2czE%AF4LRP_d_2y%`SC|km>A+!~Di{153CULwi0kDXZDQYS!K1#fr%B>~@mqfMq zB2q}nCYAIyCQK@JtiYg>PE>9oD&g8}c9%mAOhnQqjaIokKms@8r{VjI6P>pCfg6#g zvoV~Gb7RcBWU2xdgNBwv7{dY0zv8J;HhjP;7Bsk*Q7))*&rsmw79hZFx`nWlJXnBY zY99>{eAG4*N1drSoE-cY>Y}f=o5?*;@P<3{5tUR$=_Gpz*oKj0_K7IRy3Ed zNQ1)&9?y!S7m$jiVL>3fvJ80`UfKSx&pwMo`KSWsg{AQd7F2Ql(O&uyDI0tR+{SBQ z+2wWx2$#QKLc)eu^aB@ADSYZ`pWcX2V^BY9Oa^OAZ)yzB8gm{+m}~n9m&$EsiBf#; zdKHzcLWAUySm^HnwK#K`n{(X;hz#F+!tlj?uBBC+3~UX|IFS~7Ab`UJ{-s*?S~WkJ>aKn;rP}*5#neA$2I4J%E_ak$qC1*IuM$)r^LL{lm&CY0QdgYNs&%!KcLoOa*uVF~w9oPhbJqGP9K zFaQ*N*aVOYR!&M+Gq0hjGPO5Ya{orB^L7l2AdXjIC{d5`E6d%fp&WSIFcJYJ9`T(n zAiBj&kopipjT#ZMIAEo-Xzf0t1;_Z@Nl|0E0eB7L|Qr%Y{=Mpre{Ma3_XNnh3wCX*tHl1!L5 z9%15;vM7b^6OAHjp^F$iACHr2nnLnjBqTnvnX*vGWgay$nVA=-A-9jmC*;OQ-vgfP zO$JX!{BdyGH6f+gJC#vKlQ}9H=*;J5b5PVdTW+S|_P8>CjO2MvN_SS-T*eUAu z?%@0bzqJPEZ{Tp1Qn?;iSCk3p?^~$2ay@2>w^$6XNK8s~u-~Z-=gvf7{Ho;)3fS}% z_Z-9idOTKGr@ePhtckk^S*?8ZQw3GRh{u+jwvL(Lpe2@AC}AH}P&V^V&>E75uQEgWRwNDSQ(LRAeNVq(atX&1eLFctIxOk%tM4Y&^Tb2T}9;0Im@t@}u zdSdkSm_$SLgbsbm9LU-=HADVCjGYO56h-#vfqu ze@uJLVCs39vHS@PXPUwo6m8mg1(FquZ{w&U2T(qxXF7|P z3h7w$UVNvPcY0`^EINy7vzn=;fbTRrOR`CnQcF=Ei(c_KGAeBqJ`P3{zO=zmrFW9g zOgp?-2D0hjN$J5jZuqIRrBYorc|nb)U`){e@SzO0>NW$?HFe4n;O;3cx)hCOv)TUNLn=?+w= z#JfU%sU}9f%2!TzoBnzbu^*JzgpD(ONqvOK{ul6rmveVrLP3}Lz;NrF9}`WM#I00u zQw;y@0GR4i!;_WVYPm8I$>+a{AiZiHbddyuBMT@bOtjacRAXx631pNw+AQb-RM;3i zg?nLTczk7DDASR4WR5jEOsx1!!dK9VIH8YN`9C{5@NL`*>PWDsy@!5aICk+Fqb0 z?K_^5`Eo*VGI0EaU}xAT@-CeAIz-&o9%lEZ_7+Hm+RHq#JgGg)J0W58twirK9)OLb zeM9*Oqx zWmWpA#pQkZ5R9x8Jedh4@$zL&C4l={N_@#dEz-~@`ZIPItp+|e4x=Xz>};mJ2?G5F zW5C|H#=+9a)Q~Jue>sE6mo=py zhR3t>8r}8I1uw~9=#j3Az}}tL8pz`Y?YyKw{|3)``1_Ti&Dn6YG~_ zolP1Obs>PJt)YzrJz(CZPBFEs&3~Dnb`JiC7Fbr+7Fc#?9}LYt-4@YC;Vb8(+tt`8 zTsMA4N+*y!E?csS@%KG2lgg=9Om`bW46odd;T6ZquTgJmKln(0dWi;h=5EXP$=!rFf)CISM)L9 zgt@n&u*;#)anq*Tw7x>jkqA{XC+ z>P4!wOvlM|tqd*Um8Yvfk6n&_&VFqtfpEDGE>;_ZCB1wpAoeLi!-g2oLhWBXZ#<4- zU~T>biH>%&p{)V3M4#Ip1*L#l=Cy|k;4Fy`gNp2dO%uW>6}jvl1X^iKic9=hL##Z3 z08)9a!#`8dX31cUG^C}*CBICVsZ|7#d{3bxxl@m+B!g(^Sw0&XXZa4fA}qH^?#zN^ zhYEz`-9+9sWRqP@la&awZ^N-)`<6hm;ckig8+|?Z&H$27)|zgCZ%q4`Cp%oqm!#el z15*rMl=!iCSa|{dq~>9V%p_da-Hh?LN5{#I0r-e)V|aTvg|gKFAHDoAX0>F};|>jx z(I;lw#5jW|`ueas>pU59kQ-Z5X}mB#v3FFw;MNmK7BfGjJ_ya7yjd#!i0hyn_RV;d ztlFAt<*Sse#)(d065r>G0xEu434R&yv!;<-Wj|PtQvmk0aq`!LE96by)&vl&#S(lL z!TYsW$qn-B3JF`s07NgJA>fsQkq3slU8=-?Dc7Wy_{DJHNP@*~u7%Puc_v;1@N$l@ z&|2J1>ZG;cZX6&(Tfozr#89v70JUEa-6(52yG|nu!ef#`T&LG5`Wv7-w1tjrqPxW3 zyDIoGNs-DGyi^J$c!jVD&Q?;KSmHn2E%c&_u|ma2;36Nmodh>@cf73K12qpkD_7$`KKyW#XN|sY^u2Dut1M7uZ#BQGrEPiX4WN=6H>Jpbx}q?-p;5s z>)unPif#ZVg~=)>rm56jrE)^`WvYXhfzOj5ONKjj{61Wk=yO|zh#Aj@FrF$KSOWx% zKGOc>jYQ7&FX&rpSt7)a5aRQ{0lFSpbF)-D+3rHgiqrR815(eZ1xsOJ-(qqBPrTB; zhGU~>Ooj0PUmaBwg3b=y$Q+-)MA5q*dadJ4_FKlrxV{hjPT$Llf8Z7+4F1lRSFAbs zCsxGY@%e|UXr~daBe`}Gq@ZJ@(L{P*@$ZdT@6))j9tmx{{u0{7p#50u4LqY6KL6(h zlD@BL1R&<|IYdER=4CUf!RHo3!0*3Se39UF4wuQ3m&;U6Lu>b zI5eRK@Q)#*wR1}%4hCl9%N@@_bg4E3c^zt0Topm;gteLo);B1hAy;DLSgpB1PPnXk zC$z!3k`GHSuVnp5?xJCWh> zY;Pu&)&oMenFB4(VVnkQj*4s~BA+0U^Zp}pdk#b(qH?+NRrRS#gQiq4)qsgZ4jdF> zg2`bqbE3CIi=Cl|_d%`1A6uj^6JvQLOv4t6J^0piL)G&S~-Bx#)&ggw!}C)N|AMEWrr0(p}^%5N8VT-=3v`lGaE=0wJ%!A|ZPuKl&TFFYa(sg!x?C?rws<5R>^Fs=Nu zXp0Q$t<-Nx0ss!L_0rK%pCM|3QrX}@_;gq3ouf^^-+6R|8;PKo|C7|Vqj{vSra)6j zH`z_WB$Lh7m0y5UZ)|WM)XTsA6FHT+0r~W*O~8o^;9@K?z!mhkKaTdm=#^ZU`J6Kc z!1QE$3uT>fkO9OYdPIlQW3YEP{ay0SNof`-J-a9jNz$l5pu3=h8`W**iqib+EnGj?Q8E8_uXZ!{r{k zfC@0Y4i0ucki+EP#B`GIxzwCf6q8T3qZ0%fH`yj^o)MVDJjUCXX(~2zXOc(4;5-O83`T{fHlIPIK7Y zW6x=4lhMwmo3Oc7v8mslq?hmHV@M?AYk}eLId5O)+QE`v8-R~+sB}0i5Wh5+9`4nupE zXOs3MPf@tFdl0k=M$QGY9li%UO1C7l5;j&V5Jl!TxAV5U^ROn-4$Fqnr{4>k^Bp#g zI81F@zOX4)Y)13ELWj*tf(-vyoDu(DKtQN-$p*8a9Ea&&&NILgW*-prNIz-Mq+$9g z#zt+d*{3Zeyp-G;#kH(FhX%bohlIW}ngYuvrT7$2J@OsxMZ~`d8jzQx;7hfKaiCK2 zr_wV}C^;96*z-pxhpyxR>#+p5(S3>dy90G8>%*~|@8RMto3Lug+yx7w<5mqRyQM5T zdexAtOXfujRt=dw?|N|R!Eu$HxN69p8?KA?Up3^0+1Ez<@PcLSz^7DT3fFRIM7#NF zIc)Tj3@rmM8izS*y^A1ciA_xs(gI%uPVW@-1j0kJx%9IM1DdYTchL-GO|4)R#KihS zMO~VKjPM({ zf+t%p_Ouw5Cw$HEQt5;?b)f~*8 zqcgtOE2Xmy`_G0Up)ses?H8Osx{qGD2x(C+Sc^t$wKf=x$PPUv^C9Aj4(=3UpgB=- zAN!l4GjWK07&%M!kCPaPur#Yz{+T{6u{=9MXqgjbdDbXcr37T0VqY&P&vPL7d12U1 zF*MfJ?ex_B;u*D9uWUnh?>40*#y)3%;-%~5cOfP9KQ4zd@QoZ#uviBF%CCq*x$Vo9 z6qRRilaIYYc@5r%S9iU9nubASr*Xtil!tvY zh)cD;@t~-vjga(xBM6$Qf(}DMa%T+VXvv-H-Bf#w4MFm!((kxmL0&r?X3|CP4g2tN1w^y{pJOz2X<1%<|35o+p9Bo;mw} zlf7P}!FqQCpTlM|%OwHJW^j?u5+FUYbRPbhJ5R(H6&m&@97rxsr3h~q28p5O4dURO zCAaa&Aakh}6I#{D_KIzi8(ll3=VDMPgzG^dJySYT$-{xlnM1?OTqyjO6{q^N{Xlx; zARmCCT`InfNnx&uWD{2;*^8V`qAh`(L^nvbRUF_cyW7LQ10k`o-4(HAW4l(RZwvIQ z2VN>E=8kG^;FWVX!++*dc#-gRIsXTSmoH7Pn72I^d);Ht=7lo2gk!{T@JNwJY0Zob z`}^a|CmqG5pgAN$kq8K*w#klu1)@x{Hf-{sz%>`z|^(=_;KCjDD!P zXf6V<3PNt0S*Z|^#!KE*ie&6ZFlk}K!5D|-NRIGek)R}|;QaJRgU6S3EtuT@Mf+i7 zeUth}7wkZF*k49HiQZ;^0Q>(Orpd zU8Wm!w(Zjm;$2I;dduVI5Ig*PN!hKf5gn+WVp&Kuo&G6l+4#D4 zV%yJsqbdp`>30#|>h``A7-qh9-EDK!YnXIwdb}XS1#Hp=xz#AEo z#7FoiiCi~ApLCrbJc)T6jao05qWLT&^~$IeTjuaMzjS*N{4n=Spd_N4eC7*}hjw!k zv8g1Hh-M(Gw-Wz)hup)8+>Ya&RHxIDenw=Ez5Cxn_B@a%&!-gu>zMV_+%^V*l}H(G zOVX=u2awEJD0JUlFHw3qbjK^YOXGA??Z=_V-MqN@_Dh9D>G7uaDDGG@rOGtA#3=4o zzYRlaZ%#>fv!hW?nCV|2Pwi|XV2UzQ*DtTB%6~C_N7bNVQh)OOMfe*B>UW_L)RZ*s zQYhX^tJNc(8J$cm9|TA@*8h?+FedBew1*h-WfuRDu&2VyRb`qNw767eLCXLfAJzXt z9n0G-SbPue;#B=Fb;?>rNlGyvOH*;5e)O)Nf@}R{78Rv@>0EkNBl8JJiS31zR4!-0 z%A}F{uFiQgUs)9EE_=>Z*I$1_FnjjZ z*`=ZDv*%r(J^q{-+1K4L_v#^OT|}Ew{k4nwx%J#`KD2|Y`{B<-_^vA@al3J_05fLV zrF!Lez>%hY6x-RIBK66U?QM~ICS{&`eE!j7haMR}Cq6f;EmF~{F6_fx{~idbILu@) z66qJteiSB=;wv*9V7{j&P(+ z%>lauda3^6PrYjDM6GR{==GE^IT63q64WkuqatjvhHp$%k6vI-%-{e^ z{2d!C%ZI!E1T6CuaDjk|wPy`BUcx@BpMRJ!*px zZ4A(UAQ3MzaGyXe+B>|Y3*^F}CT$arxz9CeAMlp#2HL6$y+Rp1LP1Qg7)@gFJC^-s zfl#zsQ5U>=bQoiyi!laTj&6G-SR8GpvAIU*>gAvDwM19pz8H6kUcOG;D{xQ7-BmAt z9e0a1N|52FSGp+FXf@%vc%|y)_YrP~V${vr!I^k<=I{hwC6R4spkRI?KD4A=N;^l= zT8^XXK{y(%3E;;Ux+-6VU_wVMBZn>Wu5fu2Pe8V1tNtoriFqMvhZvL$PLPGclE}f% z`aQQ0QbLzpl823OSuHdg>Z5(ahvw>$D+n40UDxWlNZqm>%P=dCn@-=$vH#si3!LeI#vg z3Z+>~-lHaHBk+iJxB9IU$B8(M%p9Jw7tQ*Wknqy~;X`6o3Mt4?Zwf3itb2gAjLojS za-zc=yfKTy`8k-uIulUvqm>vL;BRrsN?d3$8+w+!IupaU0v~<5F?w%yPN54PQTOD@rS$ z?Eh3&u|IKzKNY1F^={F=hqbCQse%0Bk&!RuAYimB@UXzKQ%2%w(bj?@UtOr{n;i5V zE8;{`-sEuasenaDxB>(*{&CbW)0)1K`tVi9!C}DQ(4jF+8oQZH%I}cHhiim*nHC67 z>79-95}YZ@d8Ig~;OwfLy~OFmnd*eP?br6usBNQtalQmL+zbYd>Mn|-xY8md6Hf~) zI}3AN=bfLQnS!(MlN(P8EW31bIPH2|@phcS^*5_UQ{HJl;}zQo5LcV^GEshs9v@@QiPa&!ubTd&5J0Z-L019CG2d3^ViZefc_CvGS5X zE|r`QglA%cqH#hBxxDolvZY0vBroJa0SJGxyaA7*7HudmRccxBQd4osp)3Mir6&ls zE7~tnjET?~3|*z1bR@LBFenE`iE?Xw-yq{4yJZt8R2HF)FI%*AL{Xg5165Pk-W+He zzxH-oG&UXsRd=neMz%mx#oD`gi!WAeE04W0(Kv}NFpK_k=ptz6+86!RB5(@5#N~_~ zxr%Zm@9KJ`Wr5+L%5ga;Df58@QpV+|y=^mV7DAYr*Y=U@BC|3=I!PUZr$%B>$Z3%2 zDQi0*aI|Idt)pZqv6R)9$MA^^e3+*TE1&uEIchLvbZkAtgFN}Vh?bsb8TD%TXlg0o z68!KQ1SmgHdi2lp?nda)r=h`6RM2zab#$T|CazT~ifk|WB42xeUgKIdX6 zI5?vZlDUQm!gvadr@(kkFJWAbZ#-Y}rSce4*WPY7vk@4`kJlaJE>(BzSH)9JvrdG* z)5~R(uoi7RG*s(TWW7R?UlnUZk}PR(wvNhr7LaL=xi=R3dyCdP!El6`=|cqhI;7#W zk0%LM<{ILQp`jLn;_>G>@kNouO!KNJV`=)%9SPC!+lXR}&9%S#I3Zp2B?;-uk+Vhn zCoxnC=UJPO&dgkwDLGd>izEy}8Ax=@DY0|gqn$-G>luampo2O$;47Ym7C!;@ZNjLj zc&^l6G~#B(*TmBPN;xC;WlbLZ++Z-J?o@A`?PN<(uX+khy?pbB#Pp3_s8`*K+g^{eV+Yit{T0TN z#$Za=-$l|J>=yRB0mLTNHMPi=wHy?uC6kZe%&LZ0OuH7}NQ36fN&(O#X&2IeW?iSm z7KrAxwRB>Bq@wlqA{=oTKU!FHHC^h^&f!s}ort@w$>^ppYRazrd&4SH6puNmv zLE?YV)%UZsPTfna#JFt9=ISh6w@Nlr30E?%puP+_k!roYCa zRq}DOSx#7BX^9&<2<)4C>b7|}1%?4(**n*Eykulb9vN9ngil;kT-yaRFt-s8uaRhW&RD$ra3H)1wcqcQaSpPkG}})kXUtkS(Sx!S&SzC7^{$m#6WNxW$K}n|LPhTh$s25RExRyP?Mql`%3G8y z(PvH%xEX|8m=UoVP2pl$-=}?mkb2d|8Pw`+=ZH*|a0r;a0?8L*xnLq#XESyj>5kO1 z+7UrDCzw&VM~_@7SS67{8dE}|KRLmL@zAk<2xVgau@H}prPKEnG^b0K)ej^Y1)-7M zq;hIfx=$+H-pmvjfJRyGeJOyD|CzQBF2K zHMLw3uOwEK$~GE?Z0{5CBaa{&M^}_^YTQAaz{gq;)stPdG8a}-q7msx8S2R}d}31J z<~zF-Zd}yKSlfZoXO4BD;7P*lEvO4Kib|N}DrUnvFpEB97W@rgxr5j|yN%QOdWFoJ zor>qEL&%kV#=-o|>m_#W&i-Pp6MAIuX2fF|_1t&{KLn7-VBSVA}hE1~@gN9@pC`XECe>X|tVQPMR@tg>1ym+P(dZc)c7>JbANnu%M zgX>7#D^X%;lvs+f_J2tdeXT?JIikc1Z@v~k?-s_j+rg<#Iw?qgUO3{;!@RzQy}~$x2k#>hvMDQvPnrk?SWLu zw8yC>v^Pnt2Fqa!w8&z~k+n(DtrTRUOn1DLNH6778j*?nH$+~MjKVG%j<#P$j!5Qd z-?aEW(jWqk69La^bH|ToA<*Icf~SZYsA9uReZ@VL6vrTiv0G`fr6x))!9CL8-SKYW zr=`!gQ~$;I-N}eSIVfakJ|UPtnF09Z)Ie3YfZ3f^I&TUT57Mll{^RpM-<7mhy*7>V zeeX;HNI@2{DC1!2YUzFQ;!~mcVL$S>@R!mD6Unv~#UokJF|;3eHdt54$T{<)E-*KW zr(4HD+{}E}akBXScaUUBr_=npTylZ=!Lsq*KFM08_^Zj7v(Uka?))HwlWq9NhOdvT zy}3m@6IhL;C<>ZJ&jt!7D-gMTgC`cs44C~kIFm7tyy*eQZ}1$h4`ZJBU(CXCT_Ls? zdP9M2gFNj-1k!5@4)b!A6^7Gp5jN3biHcSxwL}4&;4leE5kyyzcMRoSyEDCB|Ad&)gd$4M{tGc3WoFYH*oiUd(oUIiR6c zNVEpbD)_X4B2Xl6Dy5(q1X6*jIWI593U2dqtr#=YnpsR$CM$_Gc8Xow@XRo>X5b^X zF3u2QTP%AGHJ7vR3-li4`jj15_!g(IMfwPc!Z66lv^a$& zp12C)MWj&e3wK;E87*I1c+6eg5fL8KSFe1Eh_Zu6dM}2K3+pDG^{ReE?YJ(G!I1%p zm@+OSS`X@ALDeI_A+$u6d6o_A4C}uovQxS&3Y}I%xyBFTCKQ|2f*^`bwY>eVY$#Q| z1gO8gF}AjTM+R1xGXhoP(m|;l1y^NXMor`O%FpWI(lkz#3#e2BpC-SM<6ZGxd=@qw zhPmulaF|&uBqv+3WbDn`NakUSw@ORLudp?w`!bV&LY<8-SQW?!GuQtLcXDvHNbM+0 zdU9H{33#gM?+G=X!v0!Z4D;`WF&BT}Ks{h9QXj6f!}!&>!~Xm6^#nsTNsN01J9ur_ zA8{~WR+!OC68VDcc4zq@x|>xi?lY#8{IL)jzon#J^>dTq{x*j=G8jP%G@nl`$S5vzmU(vv%XF-v6Tq~=& z;$w_!qZ4RfAZoDcY3i{9N0?l_s7(bhwAqkp$oJ3TW%#e+X}P5q`=^M4QA>ZE-vu#ZVKw*gLP%u;e+9_DPnNv zYnq20d_%orbz*G7IQzIrV|KLJ@m<=B01U@_X>!>L4d2?;6?`FJo|l2XXkFQpJj11r z#Ok7d?|=?be5%Z>!6HrMwp3T>iirOt9IoI6#ui`Ja0Ci@BU&n6*<4qg%n6Otuq&ry z5vUXPA-usMlvVU|X+EW=QdSq5vB9v{Bgw<~LZ~+2n~piR=qr(i?C1+IZ384_wJp{7 zJ?|?gg9haUma&>y@C-q|f_I3jSNw^BaZZG!BIW41(jOQsMz>3Z#Bn*!+>V-v{i zMi`5v(XOHZwu*)9pgL%LWX05+$dVgomd%N*Yfs8qA@*xf^3K;ThMC*KFT>253T$Rh z5uZ=pJLy3hQRy0rGdRtWWa8*>X$qnglEu;QX!e*aJw&)(_2fjpTu~lp0T;Sl?pkk2 zV@E5-x|)7qUz6YJy@ zb`h49#UMq7#pbW?!tubT+7kUcnsD_2qZ|Ez>=3fkCzpe@=K&UaN{n-|ODfl+HwW?j ztjm+B^;wtlj5Oui5g8k07U43pCh~ND6)>*#CTE>0Sl`gmrp{lF7TyuPUj_v$&4PUd z`wCKc>J=9{Wk&t*Q9lM!S2!z_8r^2yB>{{8xf4Nl6&lB-qp6i0Y3LDs&l1bX;)4YZ z7BPE7U$L$bA4-g~>Pgfh$xl_UhEcB`6dzTujt?xI+||oO=U-%3i*_XvsKzA|>yW{| zc4xjgL)!zoT|9}VfP1Mc_W=Y<#y8=@aPTsoEcJXNekJCaA{r-P^*1Iv_p`Ko8SqUe z&K@b65njF8QbjB+jkhL=9-=PTtxPg62Od-@n2wP1iqpMg~5^ zlL~tWFYEI&WTJlYcqzl%@krDOcUrjwk1dkmLW1qCn-krdI<+oe&^l5m&w+c#j@ltg4Cv$zC+V0xv3iLSUsq{p(LRQ)l!sm!<;nh?j6a+v^%{co$ii`n zCbcPP(S)fJS+w-HX^v$BO*YedFJF#xNN%I%B~Q79r#PJ%}+NnG{4xYFp zV_b$agkq$!{`EhMRQ3^BrLCg$3n@_WE?MI=?ydU_F7A`q$QsI->-F|D)luytw&)ol)pP=z~#Otl(i44QRgEGa%RYXj0F zE|uEI+X5Bi7>o^I|2*JjF!oVm_;syNQmd+SNs3b) z8Gfz$=aK$1G5i__f(*ZWyc6TBjnwey;`ktI;VJ^+gRB;9Ok8$ss*1lVud{(#v>ZZc za;U1CI`A~J9zUGK7|9?sIXE-y4+C@#p6|%y;q<@_cxb^vSp6be4TFNML~!aw0Y!k? zD+p-o<>IL6Y7gMmqP>~Gsk~ZZrPy8YmH`kYF#{hn>vb>^3@5EKFT6U}3P z%8PQJ4>IL`9mmeBkA4%T+r>wQJeL3%+6})axf+ZE`Dxb!w0s%a-nm5^L5Rp1Le(Z& z?OY|kdutEUm<7jyVERWA12rQVqcZYo(b{mU()X$zP8kg;ZEWeCX}DO;Nsaz&>@$9& zZ6CgV_$FV$UJU1R5st#@O}EgEZb6g5YLVc6Bi-m0Mz>Y;lhA)SPCw+Q3*+>YV{z;Z zl=qvtqMfd_B(@e4pR{zwM)V(QlG#DaC<>;AKZvQ2MTBtn&U&9u!l58kjD6CNX9W;N zubfAa!kr;hGN-`NEEvYqS1?f!D(;oON6FhAd3#`eB_da;iMaoUPV@_>V=4fdYFejP zu7*%RtoJKRSmV(yXgNff+~pNIHL!F>SB7zCGCZQw8HE4~S?&~*e=XXJkWhtiZ1^B! z;fo{yqg36Z{f(^C3A0Vw?C?RljnVO-PEnMW_7GhTskLa=B?yd@9ki5%xJaRChEfHHkwtqyM`8H9Tyk@(dr*n zN{?J7rs!e4c4fSPY8ZEPqDYngNkYhGGDD@Zrz#QY%U7;a?c>U5?>Hbd_*Y?qm7o_^ z^iu6vbcV)3GwZ2?NiJ}oi!`MNjPvL}(_6G_;`Gr6Y48?)8oaJWyCA`G2&v=-3>j~v zxmFD+y?O!ZKb-e@plSqh>Gy_7zel$vM5AlL)-ZYkwwA!IxeA@qM2tSs4^}B9iIpX* zf|T&e=sf}B))X@<1G!`&#KU{|`n>uUZ4;16^z)?BF=D1X2 z;mK&32-Lz$9Y0l5WZ0Ytm9aE6*lDCtt>Sj9 z5>Wes8XvIDUM1~Ai#9SY1KGjZ*hrJ7p>P*TV4(wf`C1|tpQoNcN)oF@En2KKE_mlv zoJeqSPDR>9xn0m&0bT1!9)^{#bq3G+8xE$Ud6spTK-vyGse2HLQ9E8skV=cwkm88; zjBjJf*HF{Pxwg<(P}3sK)({z+$5)8?4)Dv{Y-o@3R$E6c+EsCqL2Y%eh~@Tlb&7o@ zow>;95gB7bMw>@8>sJ|In#JyX?QC&=uR?rKVd}`*>cBYEqSB)ZtX){H()+K%)}$af z%>&&22081`?JT1E>AAE$JgwUu&lI-R-PR2_RAH}VyK1&_SeNly6})OTN+HE=4ia6* znxF=pGNde63Y=zSK99sr+CL#De~fp9@Mj}sgnLmTjK{K}%5r9A5dXYS+-YG6Kchgx zPb1v!MmW0;k+dNYa#MYBL#HtQP@|4tPEU+FP&>KpVd+q-!J-V_@R51(<=H@WacAyc zkbp3`jmBbV4C_@&$8H5I99sYANNdz1LTj``>sn|T+GgZxr`TA0ayCm4lGW@ozVe%N z;+xar%K|H5Cxc-n+ z?~%^L7ipdQkfiPku*j*qNOya>R8H-bqnK^Se4E z3n6J}&k)(je41xF`NrZ?N0Ds|eyPq_+Xm7=_uxy)0hH(~nAB3Q7uX};QStWj1jml4q)z0W=zkolZ zyhcbNbMyIrS<$<~VL0RqLwNBuWbEr+)g9k4~kK+uXsP;kIPG zs!m+Ly3yeeCLMk+P%(!SR_99H_s;1PeLE2LxiOwD?vfYGw9h0_-}W~%t-WwwJJOf= z7CvR&0;7)CD+YlTS)0w>*wrT}5!@URn9eC-(h*qP)%AUFu9^h57do^WgI=@t@b`O zP+lyDzt79=a=gp6JodgSoX_{D!jV+G4~TM_$2jQo=YuB(ok=QMXnk=ZMTXm%ZKp>D zb`f%nE4_je91!tK7Pz=$Gwkzl*HsvOlT0J)4vCk{1S>_Jn&i$v*KYK}tXtyMCUGr* z^&V3!EBkk+>I@{_{H>#svqmZDihNmJ@hN2!qnvl5#?a(YW8{0#REm*Q3f2zKW&Coc zREndpg&60JA?<>+TL{`>L(J5E!i|m#Pby1u#NPnq3g!9yuL6WJB59j=gZCaUGjlCZ zs>~W*RGA0FFY7NnWACd%d2*LjnIfq&4**hSyi#Rafsa&~A0)&Wmm9A#*^z-?;3HKA z@kyXmo1BRMQsEJ=HaV)=9A{)r#FGk>i~L+5>;S6r;NjGt7VQ_Pse!==%Oy$7OvA&} zqQbVZxZg-dxW$9&w`uHV)s6IN@8d6kdzD`!zhvmA@$1cR0Ka^G1^mw7cP76X{AThC@cR?L+xS)T`;xdH zl1Cr&%lHW%{1)(gfZwx(y~n%X&qc1u{J#CA$hDK-9)7L-*6k{CeZcQiep~o$=V$TT z#cw~q=XMvlUgo!o-@E+!?JIKS@*Byoh~HFx7xSyuPXAdt?HqZg_2OwQzh7n#hW5@+ zNd))9t6Cc%!CF@Z3z7pHnp^p3>giI?pH(c2Cj(-xuA@dT&933xWi!ju$+A8^wXd5A zaS9hrNw>J$xE%X;Q?Y+1`qZdmj5j^YMs6u`VdMx3a)<$IbzXLk97}a&1B}lP*Kx&B z)hp1}-`F^RQ%W*(j%DW`;|`qOCHQUh-e>tJ#S*dC*5CM7$Ka(W$Ai{-KO1ESy@x*- z^58`T8(h#iX=?a#&Vo*{RV0-;Jw4Z@BH%f@(FCkkTJHRvv2u)>ja;SklEIde+?{hfvT*wqmvkjj#}=T9%cPQvim3ju;PdBQ9{iAFGA>* zCxVs`WFNd7L2eO|5`tW*1ev1*>3q`?1SyXT(nt$umpbgR1hE;XIy+vOCsNL1e>xw>9+aj)eYdiPmrSa0~v?-l?YSOTJA0D&2hGyCR z6LPYB)EK>62{qX0rI+WzfCDlfJ#rin_q_>MF_3ixMRQP+^~fQ*fNJd=LHPv`7I!9H z#&)_~`XsD8r96HL*`*1xJQ(-6QZrB4NNO3Bb_K{>3w!!y!~TEM>{DYyUq zOW3GtQ@I|{?#ZJzB_rEqU)7#Wk^4CO9l0}r{wU1V9fi4Aahk!?Ue}h$sxzUnMO<ayo6KdOy=l|c9OA{7@2^oICN6X>tK zPH@@d1p0(}WsCK|+U>nkUG`8Q3hxge+INS<_f|J2&b|aZ>YMvz>3@FsTr3A#;+tFa zW1=)Q$>T(6{`7;C<}RMJo#&)Qw!2e4(JO8uV*HM|$D~&{<)XCxYiSU!#NS>fKK~)z zM1tbd`2dfSZu)L8ACK?N8hwzDNJy&o;=eTK?d zu5)TXF%-XV@&eEk;ve5G{tAH{@dJkYuy!A^cg)!=V#Raz-i|q|;cu7!*PQ+7z#p>H z?Z_10A9PxIy>cCB33>h^Tvc}VIUwPS{u)VV0y(8BJ&kj-^ts_&UrAg zZ@}58t%4fe3M=YexG-R`?do3Ik2`V(l=V72?P0?7%DK5Rhd|$H8BW$VPQQ%HmWUf$ zYkY2>4B#|H$BP$w;nKUY8{A5g)0{w@nhJEUXlX3gB?_3NE6!ir^gg#%8bfG=9;OmkxZG_tLccc~*ZI{(e#Jwv8A;c5mXgumT}f zH_Fm0^MS(tAUH{K_+UN&*J;=#2oaaK(hCY5yp0~R<41G4!PB76cUj}}DG@ZZ-0Q)x@;zsSK9mpZPeo)S@aJq3?E0;KI zyu`Z&^bTyU6{o}IN3? zBpEYUudD+xUa~^t__9R!~mwH9pJ8svaq^kEJy9qD7Jc>tbec_jP z{48YkimRkRr214|tw=}w&w|IuV?H;^9oF8!VV_Bes?^IcqzO!J9@ZX~kfAEX>_n&S zf4x_*OKtDonJ#-eiLYTBEXkfHd9*a+43|9`h!0F*{@g3nsbuiay@I_;2G2@ICiWuv z5;*p}9q4eK#2l*d`H+6mE8oXg@yr#T58`@RvSx6|^Kw`|H$@dnr5sytO)u*LuD99# z8QGMU-d#doeG9_uPI0NeH3$TmJhpN8t|ECDNW>=ppuCNY?OYq}VX#+*5_3897aoH~cO$_Z4o~94c}p-~sNTWR7WSf# zH0c>w47J{ir~y*@f$OTha&x4+elg7t<+|ifA}`(}5%Hlu>QyUv?$UP zi^2!8%Wf6wGW2#6+i8%i1WNR8 z*MCEudn4-xUV&=U8G_BmaafxvULAVm@At*~jZj*9Z~O^(cm`t2NJV)AYB5ejv#G^G%73z(4GB2kZ&ZG5jL64bg*k7;u z8A!jc-a9p?i(RNnR))ZW^QnU~K#z#o>(Tx7ih9AlzdpBFVRvoEUPw)P+QEk6LxL5j z_+x^r|GM;G-;%+Cd0PTA@+TnsJy61Mch~f{R{__~%jnOJvWi&Z~#AEK@`(8%7sT=uzfwDf!Q%5(?qs)W~d+_Sw$5j$IXNm2*(*2^tC$qp}u zg@Nb{zv4^(L_A+8@%MsX6EOGP;O(+kD}RY9rm2Nh=z8D1p0ctK`F8p7vaY%eb+-UU?hv3)1qTVgMLxq@^)0?h{zr zl{3Hx$~Z}QU2>di+xwlk>d`$$LW>7?UE=*McRQEmp1EFUjhi>V2)ffUAaM=M`*vL&@@(E z1gP(V>6ZT_|2M+^Kt7`4LH<^N4&>*H^9cFN6&mDc2#_GJk~tQiqa+@ta7pG#08TQ) zzCqkYsZ37xz|+W_w}riYGcA=DmS*JEuoDF2*02Bu(UR@;zwqVQnb~@@XKhNa?9MWt z=#`z!c;d`n+3erNXUFS6lU_{v{nfxScF^D0P*T{eN1ny)^aEm-fZfP7chC!Ph!Cgv zdns*3N#&p=Mp`!lGdup*mxz*BF=)b(m>mxl8CBEwI?yVaQq;=yqH?`HVQs+F1Lj5S zb$AbJeWyq}cy2~hak{-YWg|ABkBzB=t)yu_CJ3bCa=7tgSNC0-1F7SOwd{g2}C=v7k) zS(^1{9FYD8uR!(RozCn&9EY{#JnbZq{&z8|ga}Hbb|%3_G?k$&G_$b${*Mn{}IoA3zwOe1IV24Q$q#zaF58OYfWRp{2Xlc!GsWOE$gcjuStWjV|KJ@Z{vMcYe+UG%KCwVeK}ab~mD8!Y8>u z^FP4F>uEpEh`jHDMC0P^FsqAv8;iabN7=EHgsyi*-tSNNKO@^?k#Dy}A0;rC`0EIi z_?;!PA(2~AU&QD=eBAcagf?nF11H&kSMYXVkG)L6p8t%B1Vxt zRbpK9BZiNAccL8SFF662Y2{#Zw{j;o2q_~YZ3%9>uSCf?DoWCkDCdA;W^VsfMNE;1 zRE{0Qok#%tAVT4bWqb&W$Ml)rw@$CDe@=ZBcY4rgu6zxL&)-07Cdz$fi|kk;s7vOU zDB=f#KvY;tZ%*7$0A zcW8Si-YViwkr;aA&3))LwI4`WVi*62vdg+npeU`47YP?(o3zJ)>j$=s7&0fWoCT=0sW2j3H=r}X+q?S@HE!rXIc)-vrZpCeCi*R!^K`t3?%;Yoo|BMGI zu}%c#50~2h|Kbzb%SAWiIebJn;~%`y&1ls6z&hTN zi$cCq4U)`B94}0$_$&PfsE{dSj7nRoq$6>D?&tfMR2d@@=7uP#yMmLX0MVrd4XCeP z`Gtz0)I5I7AmQz59$$*9~`@D{{t(!X1{*LrRyFn$D z6DEt#5?#o!(vC+nw-5G1Kb0`^tbP&Otydo_DQFp|kb=Dei|0^1V~f}uPpxd$D}N%C z<1#2$#7~yWp%to}Q@u9-)}eAy$t1bI8r;Q<2=61CxAlzP5*u3(}Z;k_@`B<;KE2#a^%OhKyo43lOfT(@o2bF zGvF&l?S#9^_IxC9$K@nZOlDRSNcQjlmXwb~UUngCNO0JH5)QKA6dWzu-5@#Ha6B(F z>qSU#*km)5v*kqephz8`zA5)CU(6RE6$=DOv-zgSMi8Q(e2({#WRJA9L{I)`VPa%_?Yjz>l>IrdToceuO zg+HajO|26mu3W{Z6hmEi<#X*)?)@NWQH>Z%9 z;3o@y=7&73N4*_nFf&);C7J=M%esV-A;(t3;tj;kpOH=SrR~Iu4_{EhE`0S!OR6M)p=Td@|Ia0Ivmuef z>We&pN`C4|s?^O%8II%)X2C$AYu-p6oJy;9thi{3ut;!zavwRuD~(O3vb;b`aZWY@ zV)reXJc!)p*nKOd7bzPQS(_`TcR?)ug2qhD-u`zAMI9+PHsKV7VSk{Yn!`WJaGb~x z77Db%luLebdWUE`V4M?(y!8|aa$#0UWKJ)~I4!O8#o}r2Tf>N^iSA)H_n)noj9b%H z20ga|8`@Jmv1!>XaH@iTQ1Ehr3l0nHZ{sP${~8tJMfIGjo>z2$pHr}dbE<+{c~)!3 zkh#@brh0bg*{G%P^jf|<85+d2KSP|uHcRE@(-!m6E3QMp_8a)_#A`eXKTcaRI>#DH zwWotn?y;(oY7ZW7Y9r$43}f`rh4J$cE^}sE<<{Vk$#b@vQy*z7Yz~eNEKLtA9WEox zdiSW$L!Bx%g?@^jXuU?3agHI<;0|pfQY7j&X0}<6I=+qwo}3G;5ATS@W|lo<-huY0 z?}D~F&oP7d(NVwA#MaIpEK>YuJIpvlf8*>Jqn2B+7H zH{=$*OpP|~a7{LTiukVrgZm?5+9d#qG2?hzON@ulhMx$9qB55aGKB3M4*nW2i&CTe z%(MvvqTDzto>8tM*HQWCBqnZCh>Yt6dV5A{X;<#t+QR}t7T^#9MP3UI8Mwxf|`>>tbR+^B4(4J=-fc(0{zn|;C#xDh(bX4N0|c$C#?&4VG}D#W+Oj!+!mpMep=(^$5VDtJ z3nw|RY+mLBk5B6i@{N7WJJR!7jXOM=94s^@WKbgZ9(EchFT2_k@i&5_ie?SKABv`F zUA$-}N8U?qfMj4<5!p8qOg%E%%Pfjf);~bZSxrWnIWqvB~u@>B;(3Zn`CImY#r=DALSx3jrj*ctEA>(4uxTLm? zlcKGKUzd%dmB3CCAG3LWH@C7YO9$YU>KE+uH~J^~zsy~*qW{At(!Qtu2G7E;OPi74 ze7uj4(jzrcck*jc&O15|Mf*SL-sXJSe^*qWfNH=P8d$a<4;eT?JP9-WZ(!-3fdSLH zds)G)i_~>zJS_u+Bs1;nwQ$wnJeU5^P4mSe^kq|G_1m@NwD%;$H+FQX#pGo)(BxA3 zu(6|~o7vPTF)r%H0l>nq_42D}(9O7=p$0Q;nMC{lZ?~=hy}hlW-BOJew(YLuuxKM; zdgLPxO<4z8+Z!v`#oA;1p$9qQMCl}ax=tNgtI4O@QZJt>_Q_{Z6oI8lEGKp6&J{0L zbyOC~2eY;lmjtDa6yc?{(ko9EME%WT_v$ct@BfWKQfX&aXuFcn#xx9`cvV7Gdt^-b z^#bc=rouBHGpDusrtythL^3nKgKd1-NT&9Q>ThcAOMugu`6m3TSG-JU)g27Au1xo3 zO(9T^Jb;%mjh^PBY|d#YuZCn6!e#1LvHs@%wFu~HsrT{>^-v}UTk5lM1hraee#{BK z28`aS0yIq$B&S+q={%&ZmZ+5BIjQC}xu&7L^s^JCkGB+k^bbY9^+?epZQ{FqG}`$B z>y{fyz8JhAY?g)0dJ&62fhzBdd=@sVOV%)GG=U+LN0C(rC(nhhP3ClA0KHAOccbR35X z=dv=-(=e>u8fu8X6ZYRuQkkj`y+zi=z9oV*NqR+p-1c>qZkM~eJJ~zX+uhy6o!-gi z8hhTf8%JedRaSQOb+Z>-U79`ThSICEZyY{kT>vym=36jFrReE3E<#dfMYHlRxBOt zzW;}k&YKFjQs*$La3V^BC!G;w&w%co-e_@a#-?b zx#JPH|L#Sc((5kuo-WDIZ*Z>;@2)v$|MfYCcJ@;RDgzcGhMvCN z9!kd4x^^#g+o5o2e ztNRPI@e3y*Me*{;maGeJv%mk7uwP5oT(Mao^1(h|LGJ;*sh~QbL6ULbz~KYoJWDvt z61pb|2k*OJB$4N{oXa=of)>fxZ(cO`t6TbrEQzKwSlD6evZYw*~SD^ol^8 z1X>|bXMr9SNE7H@fszDTDp0aOVS(HN-3U}mrBAhwbE;H&o1Ni6)7$JWaVXVxInZ)1 znX%lmvu<^wdF`HYD20G@+x9rl7m^tFRZ_yM9Cl83zTkX#o?NL38 zM*Tcpf*&W?P4ILHPH(l}B)Cyq8uwj@Z#R7VL$gr};_I#5NL>|Dmi>B__+FtHJf<&~ zYK8A()Q?7OvZC;qzR|t<9DSo@8_M?-Md2~M#=Uxx3*YA`I4ry1n^gOlzT3U}O2M58 z?uqVp5r40h;2KVOz;;-xJ-u2Y{TTNhhHp1~`>OB56&`iwd6KSXg5AifBBdX&k5!Rg ziTkQZ_R>WUlq;WaZU&9A5;SGi2FL64%jadsZk5yEBQK1vS@m%-NrYxT9*pf z`7_Dk?073hd+4^`VhQI&SI+;V?M=X=s^?RF^Ip;1wT0}`Anq6wlX(qiLWICVC0hzXqpNR#`% zYn{UG?|%1xpZh(}pGT{H?^duKX=++Zq`yaZxMTYgm$;nuCDTGQ#Vywz#-I*TK=-9mKRArDXuDWQ+A&UEY7J+ zbNVqCiyf^(b+_7nHz1#3k<88Coj^O59sB-cT9pXb4MfFK_AmEqX<|Y*y3942vVZ!m zw9d_DX4~wU&q0%fZPG)?;_ zJz2NwvT8U*jkVuVmgCA23%9$|x{tFmp-6UPxV?U-{Y?X8y-Ik;QbfOkES?(Y;L|MB zvIN78wY-oC>Q$nazo9HqiR{KxR;b*F<4@VHGP%?4M_H~iwbKS6M`arG(NNBc3XTio zws%|iHH5hwaah}T*`FSTOj2To@3LP}hK*r6BfD%Kk3}rSj7mdSjsArb819PUG`e_vX>|?r!3d{M0eQ*tUv{2xE*pPrExZJ+TLO9(<;yC zvCBN-v<R3ZSJ)i?6-XtO5TFouF}o5--9@}y*<&> z&+EC{aMKg*v2V`y+`1>a9d7Q4qI8=c`zYMa&H~RG;|U+ueB{~e#9;MfFc?maXsca@ zL(}a1Mhd78xg4pmjzBjwJ4Z+k^`WG%F&av?+Mrm6N)Gj*gs-u}!1~N;#`Yc482v_Pw9SL&WfijDNx(wmv+Z=N-R$^>C`(1>Q|HCVY*iLm0)9((p&T>zur zby<{EPi(a}&XC?y*(Pwzh&)!Q=0?M|avE<$&{? z>b6IA+Amc$P@0|g1ISTki0SY0lCZ)&NBfyOt?xz2=P$R-Vdod{- zD$j0=azS3V9I{@eyVEvOmZ(hZv`;}YyD8r3A;qO4*=hf_j&}c^(?bbQ4-LEQxgSX8 z71@n3W`2!kE)tnvteJ~M=4Vh=ghXPR97ox%GP%=^p)6OK+G!({=zG%`Gbt<*H|RoL zjD>oPw@@c|Na6bvd{{sd=>^1BYb?95oOONUuPh)W5_N5$ zEK!NNE~BhaiMrlJ*{%|Gt)?tjiMqxq!|g6tzlvRYoWq9FK;HKhy(Y!A!|k-;6_6z% zk%>QquodQC9tn?t0F;r*N31aX$dJoT0}~b;v`cwI%uyZMM*JIgmfM$ zMw+B?NO7XZfyQYZs957bBS>ylGH3^rlB6&xLCPkjNWB|DrfOZ#c95c^R#JrYB`HSw zNaK)Vy~cr(8V6dXaiA3>*JpzE()U40(z&Dr>2y+xbOOov{6Tv(DM~6LMMwvbVx)aE z4kL`Xl8Vx(_L zhABQJMM)bq4%Do1pjSz5)yANGo|GglCnZP^lTxI6NTzB_&@LrKNiHcuT0n}CW@{W$ zT&{7T3p5TiS>r$xNa0`VgZ3tlu<$Ri%~xs&+N+e>aTIj?A#N|GNLGRTqy%XX$mPt zI*nv}%Y*iKQj~NgDMC7g6eA7SIHcHH<3It817&I)Xvcb_2>Zf8dmU>~PMSk1AzewT zAWbFJbLQ>Gv>QqNNe!f2QahF*kc6dN=Sv{vIljT#4f zj^z64gZ4~Pl5{dDK^jj=k;amY@BW}YkQ62DM~aa8lVYS?&~#JoUW)%i#T7j3GkM25 zk_gmFiqQ5YDMtE;2!MM{xYkc@A2(Ef!KCEZVokbX~!k!my!DQ?g> zP=&^UW@sGfVu`E54Zs7~!N!OCEBgplfkJA7SNAs=pjRbDMmS(6vB@T*zQCSHa;swK zLZ(QPP9`Nt<4GyfSjn$y7P^oWCCR~#kmO*;NOG_ZQ^>)NlH_1VNOG`aBsth_Rk?St zlO#FV36dP_6iE)Ysk*>B*iq8staF6)XHtyx2Wb&g+(wF$Zqhi=e2oKLMRKdcSiDF{ z(z&Dr>2y+xbOOm#4ZmKWI-SMM-6(21|Sk^a?3PTB&hJ@mGxlJ*07o5~R_j z6lo~Q_|^sO08*5cM~aXPDMspgTjG%72U3)2za~XUTSzg|`y|&F3);6xNzxipg494t zk)9wK->jg0kQ61|MT(G?kYc1o8iy2djRRe+aiEySfzBhjzH)5dNJ-L(qy%XkDMczK z8Q%riypf`$!K4T&Op1}RH4Z6y-;y{`2Pwi_T1hd|m!vT1F{KiWXOio4vHp>gq*bH@ zX$2`o`U}bUmSFuOMM=LWMMyQI80iL$Ly8KG1I^Gl(8U@DI-BHHp$2t4Zb?!VDM4CD zN|Am`GF9V(_6kyzbRj81I+GM5ovd+4F<#?9V>J$RpvHmrBe}i`Y~I#_lB8x*g7hjW zMS7lOeAi*~Mv9UiCPhg1kYc2z8iy3F#(@@S9B8)2fi5Sxz7lNSNJ-LUQi3#rlp-BV zGQM#^TSAJGMv)?U^CeFumx-n zZEh8ghr=BRN?r3L5h<8Mv9Q$A;m~<3Ob(w<>`Th*^Uq=^9dkbQvi{I-g{!mSYP|ijqzuMM%exVx%z| zhZG|<4z#bvf%<72D2L=$rLcwOcuA5vNePlArAS}NXsT)r+RdaW>0MHU)I^GrUe-9I zct+zuk7^v~0gVIQNecU-7|%(e2*xwXI2gMpNKHvc3uS?dNQQKP)S2FMNeR;FLi9>n zmn3QHoiNVH^fr)Y31xw%k?Kk3kRn+IJL0WPF?uhO{IWqZ z4or55w>F^+%msQQq{D^S%7Y{YX&5O%dV!_6q$j0Z(j%l8>0VNb)Iv&a8!Zm#G(YzIs7R#LKveS_Y2C?LCqfbU!JaAHmAX6ybc>rYhlhe87Edn7#Ir z+QOK%O63LiFz)ojd7vki;O!G{UOUDb)1uDUZE9(tgQc`Ql+mhjD5F)Lb^5d7#U9+>-gLvER^R1ZrShl5y8FF3C8#wUT6Az7a3$vV>&vu@`t-#{uX= z_PCF>7U}yu?iAGP7T6cm3wlz$pijliIN47|+4o;@E<`zECkf@hjviuPMe{(X8 zs|_hG)BHekYbBch3RY3g4EWNQv3B3_lLT_BH zgx-iLp*PMW;WJ{aj!LM@ZAz$%-Uj9M`D)sv*E&h%Z21`WWI0OYLpcKPZhf)QuIyg2Ad;AwAOi} zjQL#b($rRhU78Zg#V=MczXorejB&ioRa?0?w_?6}Z*Cd(+9)0)!y25*IO8k9PD=^i z!zNMamlTF^MPp)~mbC(3e1sLkE;0S+jvwv_h)PSgkL zWxqsC4C8=39`%9vw=l3JFb>oP`iM3hnF4ze+kr7uV4r6VWPLeRZSa$0XOcI>T%CMv^wkBjcro*Gmhp zmlj@0YnZl*xfss)BiNJmzwCu`qte;fQ!Cwtb0aCqasRPW3?Kd|CGg>o67t)wRF1Q_ zQawI6BDp+*lGgPhg``c8BrT2>R%*s!wZK_ih~wZfr3ReEm6Evks)U?xCApksa(6mG znnzoLZJVVO!TDFI1lM^=QQUh~D#yK7r5NtLDpdsSp`-}cjs2DCu@_KE;DaNj27GX& zl*9)|9AOdPMtpFjl)`yXsU7D*lHvT_q=dM2q@+RG*OidsMJ0HjQbLM^QUmTikP=*} zZ&#|vy$7WP?mZ|WZjKUizEWu;cBM)vqg<&S_Z~Ir_1ovJ^Db{MV5>gB$CE2zC zq;O8S!?tkNhI1kvR@U}#j_J^~9o|m+r04Clk0_Z=doRg2_4uNR%upxMVSP$&hwYY? z)v52aKPvJ20803xz$Ze1NT)TDf;HG8`LPDF{u$QbEw!Nrvi_MIq-ao^>9kKMp$4^* zUk++;vl41hse~F_<9R#nWuCXwp0Cu{*_h-7(PTNbWxmvD{qh-dW@D$_%}-KI=E_dH zofHnD$g`L%97HuvRf6p|Y=YRL(wKnhXf)g_Yo>m*P1Zl-N836$!i>M9L)Sk%Z=%C~ zDYh)s`6j7G7Fsl4DbZoC(z7mXk4k$DY!4_Q#hprMxrE*?Xe*)jZ|V)>Tgdc= zeI=bXLkS($BV)~nWBC&aU%^5*Iq2uJSy0#??rbzZ8~{15hW!yrc(Ww~zoEpTkn<|i zb~d_M@D7x;nc4^3CvlpKM>q$_fiMi>-R!1ka$kfI;yZneCP1i(v0~gfo%z@m@%$J(6UyUi1d0$y)6VOq12nY0G4cON+9Rvu-M-MHwhp z(@Kjn;2kAdNsBU2?%pa9CFxrpvAtR@|UFe^Ekr{zD06d?A#9 zw0~1V+IN(Y_6^V5X(KX{|u_ktFWnP3gFM zNQQAsN#Z?kbJ{zJB;FHA;_dhMv^R$&-hX{e;_aQ!J`t+NMS~J-S)bAtLOTkjH?q;n zALV94Hd^_O61<-%p@%;3yckHH7XwKsgcKjJyw4sr9^=x}F!` z;}X*K*^qkqpj*jo}b7 zo%J~-?-&-5!hYCpWL9AV`kqu01RWzb68~rn*@tllQc~oXR0k@f_*2|5QTS zHlYw~yGdc@@^>ZVvOx*Cto6J&UwYn7`<&;+X^e#VR$w<6O?waY~r0#iS&?Bb4ABtOReE6s0#?3Eo~V zEm6+%4wB3MyOI;fW&cf8LjRS^G|k5@GK#9%PZ(_Sv73vcYIZ#(K7hjZHz^ds_E)K- zLqE8|2VWif!42ZD-SXnF-SXnFWm3XuI)qf7i}h+e7q@csvmL91(hgL@dbOYD?X>+p zZ>P-_^26K5R+i(`VgIR=z&Iu0W3i6LFptb628XlI_hBBHGLlV=tW(I zsYD+jExOZ7ONpF)UfNEkMR#gJSS*ni7iS`Q5?Lm3Jb&Crs?SF79cn{dwGdl=f}~)} zk5)qcij)v{famSB`*_|?8xms69VL{uOO6cAm-ZJS?t(VF&PHcMFdLOhu)k6=9rih; zFlM6{*J=Ok#dX?0cyXQfHj>Fg?MKPj$U!S=1pE!sX+!bsex1aGsD5AATI20pZ7*K3j=a{fgrjQyWd1p7bF zi&KIS$LTvtNc)Bo`rsucT-$~*J(?=xK4YR7uRV=lMF}aDe}P=$8M<- zj_+Y|EO~oE_M%}2rM0kr^$tpVjTClJ+6yFu`DV|5RVdP7&rm8sE0qjdsf6P;#*6E; zBfYpzyRR45Y5NIfV&&4^S0+}jDN@r+tZS!9?YXZr4AH7_UuPI6+t6^{5=sP1)v!^* zc80-^Nu9BU(BOMjE}=y5ts)KD8&*Plvq|;bR`hby5jJRVhZ6d#RSA9dB?)nz_9HJ2 z*Umyb(id{4ALfxhQwcerEX3P8^CiwfE>}q|4sy9vZ5S`-3h@TS4N6E`A#vQH%upN3 zxY&!sPR5Jtv=hC!PJ5ge*J+Os;!HkR3FSs4j`Mt=+E8u*DQe7i`v}K@OS+eY(YW2# z$tWT5hoUr2zWOI|`qe*r^{aoRsO-K-M|szD+wGwwDMP+yDrx0wriO9<;Qq?+V^qBy z&T|XA%VFAnk_+PimUa15b%ZQ8xCLT2H8L6Qe%N(NC76Cn2GdU{8(lX=Qt;Z~G$nNG z@j{&J*RNqNyiS>`gcQ@2&~+DiUfebCytr#1#L1~PPEOB;v}K+bzha?;Za+u~-9Ajn zU=Y45gWuoKX;*N7L`i=kxdsFH8G2oVf&QoxQanJy%^%$VTP+m9{XZpx`+p?kL)vR4 zXCKneR6^QIBo}(8D8YN061>Ng!UZ@tn!E%);MpQldK_{bWTVLk-A%&Q1)rh_<>88@ zLA<0V)C;;sY`mVi3^Xd0`N+reH|%rdk3aAH5?eUhGtz%>SHZuDHEycgzDc_=(ez*U z;?M8S{e*wm_wDuk!@frf>V1vR@pltO&ZYHzSbeZ=^flf|Ye=lCVa0DO6tw#q@uLi_ zcE=pX{zY>LB8Q)8{YI>}YYsu=@BytG#JWIp2qK5CXnk3%FWYYgj7 zbVIY#ejVFfA4Co*TCbDXPhs`JiX4)(UM|+RV8!2129d)?S|^G1Sy=tBCVY+U{CmrZ zpQ6S-llW*F{&*UHn005joThLjJW~cu^7|#3X;UUmzehrR3*n93SV3{7T0ovveyX|gqn_D`AuRIl^`J{48McNExM+!}+eS_!s0NG8w4 z&tmdw>Mlr30e83Uq9dw~h_(YW0*)`#@d^sh#^m}+Wd19=?QrRmyftv-z|pLZHM^}} z9gV1c797v0qj9(WS+iOVhXaS)(ZG$p-S%U3yd1U#AfbHFFty-?dNI(eFGY0 zqRGK8l;F=$u*z@6pAO=$7RMv~C^KP?J+c+Qo&fs+VxPFj9^HyxVSt_GjWXqFdxqqL zKZfj-{Lk5AmwaI7EwoYQf<1Q02llnFuZd=2J-rq=;(jb>CMijht%ggItwxeJbY-jI za$9k{#(|C`MX@H@%ayS1UZ8|^S9&vAP=Z?rURrShlMB&yuBI*uwYtxBl!(`tXJg0vby6-cXWs$g36oC&q3*4wD|)cSL( zP&)E`D)iFfj~$P;C)0|5hiso$b^OPzRFA0|rs|KXB68laOH@UV4V{R{8$5M`sM(^j z+`*gZo2EW@s;F{N1N3*N?1^6F)Cngc@(59rl7IRLquh=Xb+M-gi8Ais-!U?eDwXrd z;1pHwWU9$0G7}s$n=O{S`~RU8Fv<`Ece^A*%PQCC8J=Hm$nkecNQSQx4o~3V` z`YzRU2YX7>4e^ww3yLz)(Q{8jI+Io>oeI@~9}wlaeO3rR)?~j`<&JBd0`;+|g6O#E z=RmDXt0&HdT0`Z7Pt*$aCCByB_ptgrRj)pG+zt30AbX3btmwFA<{3{b$z_J5gHO~2 z>T@;E->A=1rD>n!SuDzU{Spy%qt`Ecc}n{w%TwAfU6a^${7#b0_f}E(i6l{*{moB`$<&@YG(S{^F^#McpIH^>VotioYo|^^i-D?m92B=Nzi5 zRbBe=0r*uLd$A~g^3yE*?uMN#sv!C4VydVp{7jA1^Ds?k`t!%-?1;3InL1EaRa zSLW6)syFiIxl}t(XWL!R_k*Y#qksO6?fX(x?;|?0HhM~X@J&x?556eMjVyWf6r_7X zeP+obs{1|VA3(L#QxiqqD9RWek#o{YMr2G>fzeTSc3R1pm_X%&Pt;N3%Q8BaMyHkd z21_J-q6)-kyn62b4cmUBSI>4&X+6L8l-BbjRnfb@WuG;RGXBliTn4pT)#%M_R8Ofg zM_+t7)PtTnO4RQ?wRt+{yX&bba>VAPl^n4vRVDO@ohPa{p+{_@DA)5HE9%Ci9Vnae2Tq6DB5Iy4M`P8nJ%F!q3SMGF;z99ZjTgS!pH@pN+Us0vqT-?si~eSK79rv zCwY;ojuUl%r1)X_N<=M>1V!yH>h?%b(hU%GK_u9JCL*&%;Y3zK)iaT8$InNeGz)4Q z)O7PvViEo?eu9=QVo64Znw~^3d=)IsV)-Gm$ovq|m>1Q8R6lsB{vwvqNcB-9DEZWj zWlITijufBFd=|li^G#&vO;iv>IrqvHrrXVtO;5G1lDJr`E z&@-tvLQOa8hEK!)!H;Np-Lou$r8qttmKBoXy5T|dTd0RUHF-a(dWl|*^s9#lmoR#f zXITVG@q@I?mK3vw2ajcnX`Y&VK2^CyFGu?2!-EZsKF+f&f~EK^S`JmqGQ=zkZlPtc zXF<%e;vZ=7i)Geji_EOcisQ_=>lC(n)@5_ zEwK#3(e3p{!1I!aF~bJY|CsnE!oS@+`ge(C7A$Xh7FR6mFdp9W#={)RV_nIdvzbRs z{5|k*_xzK^-{bkC;=h1pBy@xoi{(0&;aP@=WnBZxNa&c$gJqOi*Pvzep3JuPz`xz| zZ-ZqNEb9MU{9*hdd)N&vV6E1RAJgT!3aD2_xn8TEm1sZ8|2$Isz_su{D3;GLia*Cn zGY^)fVu=ptY$}%7be-g3BHD9Ti*h}6v8W}Hq4St_vZURDBeP|h&csr&^dkRWuU8M2 z6g|tP-N_U~#2+0s)GQgUrR9kwdEiiU|1!1oOkf{GN5V2(bNyZ|BbZ7pABiPNi&yfS z8pC|NoEtQT`FJr8i)G6)%to)Q+r`qGKz+RmWL9xPm;%nGz= zy20;WnMkr=#e6hyyttCd!2AW`N@0_qEI1m%M%0xGe7lgY2vWgyI$e&qQprG%x-`|L zbZt9{Wu;Pq0{p@w7AF(x^kB?QzoX@XNHG`DQRcyjtmO!f1iuwmDl)nMjdVpL#d6Ad zNHU8?=Ey1MPEog;(1{4LRh~NY6{`87VqUuGp3-#Zi@Grq{F0HUi7Jl-hus7<-cyrL zr798?_acXhs_-KFc}gQQMa_x?=Q7H^XfN_zQR7O24NUi%sBk3s z3)OR;n!L{YpdD{pXm_Tg>GjqQ(s` zKA{Tg6Hm=~mg-$mHQq6N%~N^|pA$90%X68ibIcgY^KMaBdcMV?9`n>fQOiqo^Kq4^ z*`DtrQ7b%khDLhZl;ffJ!+?`b#GHB5Eo{G75|N;Z=}!gPeLc%$STrVA@;KB4<4mzD z$~=Jc~_&*a>5D8}0Ky8rddgNbXLd$4*#j{L?<;+dAJSmn2#8h}O z_j#7duxJc_UVgfH5iv;<+Raq+#j+8W1~1iRo@FvDn(9ngShHfO*$G}A#b%?I#~ATn z?A3L+s0U5x$;HUOzo+y_IihYiW5m~eJoCNX%$1pFp{AQjs7W08GVR~Rf2A2S`ZlO{ zMBU@%`--PD-)BVCc=J+qrt>1Zk7N5EGoh1Ny7knVzoq(2 z6jnjWWrL^zo_a%6#9K91dP-M~M@5x*E5p5>(v{&hD6HZxR&iHX@k+HMutK}KcwZrw z2x4H7HTx{JXpAh?$HOwp#JuhOSWoHp{s2+qyir^z3N5^sZOZY~nXggpz(Z4batVG% z)g~(JsV_v0Ho-$`;rl?;EKfCwx-n8LtMUt?$|J?HDnIV2IkGC>Co1km){3g|B7f&8 zjr^^sS&?E{l`j=#yvVaWrI9Cz8tp|MDQa9vv8>7miV8=HWmVqCQ*&fh&WGZvj8pRP z;z?ZXc9gRHSzhhhM2+y&7ox88)CZy-^Hh_l($@GG#*`DulQ7b%kpGJ<=$XY0_ zT63^!&6QPap;!`;Vysc}yLooHXTe7@Ud$B9qtxJw^{Dg7;!h%vgy%n8`~{I>S*J#d zy4X{Di+a$TmARhMS-ESx&h}!=_AxTsEi9wVJzn%@p3>+Iq7L=)eM8hlZ=SC7l+M#f zMXg&FT*Q%cuc!fDf7~YOoQPh;T`y{cH;1qB(iKa(OGF*v`OXwI!Ap07sK?A0nYD*| zYOc)Mk)pD^bbE^$=dGK$q6T=rUB|Mu5pRtB=qVjzUx_O5#?gnK(s8s_6iSyF^^&LN z%8dG}s6pO5c|g(bB1 zc;o(-6HROHm%IDY&()ZJNcB%X{MRu0sdP~5wr}9qCw*njbjJ;^%;;-wIOwUi#Ehrg z9_)MnDSQ7HyZajcAjMr%dQ*HZio3Y%T--Dv-S@eD^ z`mU#JA>Q%q4n8IiPrzZ-x8pe_7hcSV(BL7V;FCSh0+$JAjc9SkfcUT3=^^nctCcx; z+%H5{>-%`7R9zqpUi?mcLTz9bDE&k`SVq(awqJw-&^LJK*LQ+=dOUb5n04^)Sc~{N zJh;?TUhHfC7W<6Hex!TSOIOgd_BA|8q`SK8E?DpwnA*Va0d;{Pc&!aA5)KRRk2b=|iKg<^Iwu6%Onr9ElbOh=@!dP&c(keL86@#nmu16m;>Xto{s?_cU^!&v*csJj zS3>$099UKMJ>wob5syTwD*F^%e-F5zs_cF6!-1&5Q+qb>DMolgi#-g_ovm{ogy(-N zGPL+mK1ZdD#YlOh0LKKzrOVrXp;z7l*wf`*4NjLg4g6ord$WIEU&*(n{VK;aJM1|; zdi0rF-)eS#LaguDk^jJ3ygwfQj&~DU{KP}M`<9H{1hKZ+VUL;8iz>G_J4xc&>DL-F zXSxYrG2cY4xWbhD_9_#tm~F}z%r~(GSD1=fR~dKqd{aMjx=GBAn}(Tjlbk)>Y`ko? zNzFo<*>kbel&uL~B=oKcta`n0)tcIu4r z+3`SiGiKj$rt+7*586Iw>fV_X>T>wRBrF*@ix%NYGpA%~t{8=QxdDx8=9RtX#JwrIZyA#bJH(p zPt;m>M|femYkl)hpIJ9#!=xiAQ(xP2c&gFR znM+T}sBX@zJ@V}fGR#!p->P=Ko_B(oH*BUmepGy4yj~eE#Ow5UsLMGVgC!bT{I4T? zrth0BX9Q(ssCq3PZ2!CN=@^k~v--Y~B*Eo)I@DkA94SdU3{Um-)vm9?AI_KvJSVR& z#ay}ypFH7_U=EVNJ+p3#L+cc^=JtIPG`E^ttE-Wws>);pGg>F`z@AX&RG*)LXR8%f zr$RHAy4PKMg2B>!P+h=g0D6(mvO1WvCi3mv2VBH(?&Djhh@Y$mxg!B z`e0ZPaNqVdB{STAh3EaWV{PubTIXnZd)B5O)3cbxFE(aR@xAB$Tk+j{iuWPae-z)& zI2Qjd;6IB0mlbgV>{o4v;rV}f1aQvZl6W**TXAhu zlMT-}W?kj}_{I#jzr9#`_{&h{))YC2&x|q6Rwc)6h-aVy8*7~f$R9`EnS=M*rtVKd zr!_rk+WYz{`?1V|(5o8{`mlP3e_lqz4`xKl*ilxVTWRuZRb$f6BmjEOz&;=CNA4+Tm-L^9nKy zhib;-nVD_JbU7;^qm{W`&Z7W-Ja>6kXz_XYAOn$qU}R-si*qKbHTCfmO^b7aM_7F3 zGrq;S0v6V|#VG^vUyCzEY&kf0orNG@i?jQjw5w+ib$HZvN1d}55>)q?%DiSLletuX z_Xr+*wgVA(FkJ42HD(xWJ4}4Q8efDIiRV@Ch~l|pK010L3;T`RI4>}+ePM2OYFJY$ zC-?2ORXdre@yNTd(hsTH$#jjw?|}$G(9?T2L`EpT^^hHSdMKLkzx^}#x5wB~U3NNa z99oRwYeFwOr?7Ud*>e(~LkGJae*d{=QvKCeu{rx&c2Rqiu*A=$isdTmLSnl@QNsagqS$w6?13 zB@g2RTQ5S6^MhT^2MnvsZ;hacwT+D1fxsod1`hH9|LO&Hqk_K%UYZWfX*~L!lT6$2 zJz1RgtLG?say-vc=S+A;w9oAFWmN8qS6}79rS0=iE=|n~h#JqDV-ATp7SByP8?tg_ zYZ+_U?R*CbGL`+S%RU#^z|z$GY()Fx=(qJW;a^X>j}BhRVHr)-DZ8uG7O;*5rE?NVnr-bS=nm$je8ZaA?t6+g7g84RPp@_^Fz`0#Eg1i|6a z_~#cfMlWy!yAYb;2L8#np0#eE4d8PF-|?;Or@F!?0Nrm&CpMJgk)RjhGpH`-ZCJD7 zfyRP2PlT64xw63hx_#Wn_%pJ#+JT;U3^6P!e*98r33y~XB#z!erK!rC)?$eHLt32U zB+8foA23y0HXafW^UJAjL2Vk}PI8DzU3XyBn1;&x;+JdxCZ&{y;tWR1R z*bi~;j?9JQ>YQ)NrRR%h)D?CBo4yWLtxut(m%^KV46WLbyS~<02m8$0aEtQ-fd9DK zV(f@Q^-r&J9tY$2oq+urt(8YDEm{TOfh_vZ135JG>UwOG_fGzl<$mwm^nK`s_5O~& zcS29EpSdL5v$n-KPqH;=R+m$Us{8S9`hVgPtbvo^u+K;Ze(u{L?|j*f-o8TP`XR2x z*~iPEwza8sP!anSn}Ei0 z@gu6sstJ{c;HvEu(2PTz6Zlr$lf7_n?6XnpnM)`3xm*27o8i9WpXs02*P6KtkHb6} z4?PUs@;P$taxO)Zta!NfCOAUXkHTixii25Zz;TB-9-`wZyi}L+j*EYW9+jwqk9{oexid(nr1Z1?0tP9+MkkHFTzh~q-l>^%LsS7Ls z*A-o-mZG-9T8DL_+xMw+9)c;o{m1g?U2&u^=*PUqW6)OAy1hd~=l%DgO&jnG^f9mT z)Z1p3I%C*pz9D$B^+=HKXSDkaRA;mc0*|npf$Ty$xueKfC&0S(Qgsm;IShl|^07vw+OX z5qNBC?+o+-$&9fj^m@i7AN5OTAW>zyr@6mDVD7lhHz+)uWlPOb17~o z)ZunQ9d0MoT~n~cagcXyU?ak73*YB!(R+Bs2K=Nj?jmdgw zhw+TQukkGNoBcRF_ts-e=vlefP=RYuW{Q1}i@#2RkkKPG&&RitoCCzIeVw1Y2eBKF|2o*@| z4^7xs>zoB|-{#QWYgc1ajxS7Nl6E;~sk>>hb0XaFy{gJa;T_KvF`>Jfl3O$V@1n?V zY%%+Lshc)#Roj+Yr|)#l5rG;0cX@4u%kXV5vO>7~GHhncsT^EpX7i~5JX&;s{dDVY zeY`em+k`;YHeLJEJngly)=9unTX>k4UvDiQ9{So!oH2(;k}S03*Y3!X?x-AH>s-xL zPVaBD7Lw|=|41b*@G8663&VX4seF-FSe88wE8mQ&U0v74bMUtITHe?=1byIJTUr#V z+4?RH=^@zL;@x(?4RI$PoBR9F;`J~zI~fe@YsP9C>}!_x;fk{L!}or@Rn+W!iK6gm z+XcHrx7>?F)y)|*p0;(McrG#vmi|6|>{>i$+iwec(Px0ZW?XcqW|U^yBL{YRaSyj zedOD4hC?nRptqvwp~WF+?3JLoX?OAgZTYRSUwE$hiYZn(KTo8yAop$Xx5DAvx9gk~ z5Vkcx?qeVM5ev#{EZm4_`nTv+>1f!WmT((KDAb>!N<*QVw@3T-y|jd5Bv5NzEUY;m0M328dPB_GANu+ld5_3$A&poD zdY^O#=`B#}>ZyHwPWp)dzYUa9EQC*>1M31WpUTrKb{gpZdtm8)+n6Z4OTb;uJ@EP} zZ|-s)N5%Z{ahy**wY*D%E%b0)<$81XTEy+yO3y#D>N})vmrVwqOn9lTl9CQ<&&i18 z+S3~QHT~HCNFQo(3=F6U{x%<}>k4xrbx5u<9F#jw!TD$g&i}11T-eu_{Xgr3oQOB0 zO0z?^Y{NBk)jzR1`>KwtL+(n~3!Uk+y}c;wRFswZYgxZeNN=)YMrn?CXWssxUuWI`sH}{-!h$_k zZG7*^wA-1i(u)`L_4(2j=}VW7W$-fuWtRHp52!1A5BO`YuS3-puHIwQJeNZ^WZM4B zGlo3>hvTZQ@KR)im7})sJb+z`ZB}def1Y2Lb0`{*_2anVKCBD_ktdb}tS@D+)m+VY+&6zK)PYdVzxW;u)$B_<${mFF zP=0k8_F}k7nBZ7f&wDn!b`z*R@vo24ui}G6! z_KNaao`IGhh^TbShY0H#p&z&=d3_FUva*%cJ*d{R`}2Hbo4;p;V_34<@cBf{E&JvK zsr40bv;9!ge$=qr`3y>`bO&6oK%}d*H>zYSF)EoA{;2M1V6$^Sv#N7m!W*u0GM#$B zK|R&2{#s`-&`!W|X^-bi0bUww?!!rG4C>S6{0E|`!{3J=h#0K#d7S=;XB4Yc20ezS(qcd5Y2CWa0-{| zA)IaamovntgHqC$8$rEZV27-N9by<1ydr} zn`{l|Zm@5Bi>sYfMpJ44_86}QK0cl|ptj((Hn0h=&CXinpH*wCwxT*dT!7&3j(BBI zwS(0QO?Yz+@BC8X0um}a?W3w~s@|GayT1EV?h9N*udfZ%AXilTdc5Hl7oxFuY*=ft5vNs8PmEL-@A)#=@r74BkP< z{E_WRo^`*$_?^rl1-H+TX)xJlZOZ7;$7pVsB&|LtC&)bPa8g1}!l z0gX(Cztmu|Ynd!JD=#mPJuTpXx}23L%pcG5?i`J3+pF8T7wPm4(@!}0wC&&RRKvp2 z6spPM>KN{Ju4RmmmOF7^u(VBrp(({3@G9pNVUE;Q&XK~p2|id@m%L$M2^cI!Y^QC1 zESRn9&csa4&GVKM0UjQK13ZvZH!VCV)1@b2fS!Z}coOb%HX--_(!5or>E?yJ<~;_B zHg6=BQ8w=`#z^xT&|oY93%DHBq6@GL48$@p1E=7tOY!*)PQO!e{WFc%IFpbHdu(j7 zKgDa)$m5|i+U7MoC4f-tM9af{Dwu~`kM({~*#EGWp?j0KNNY-ER420zYN`!nz$L@i z*EYs2`*A$72-Vy_#OE2S%Th3z_~(p?V8Fbq5epE3et#7zeLPkQ>oIsjSWdXhfI59f zH1%X)!E#Nmt$nlmQ`|#4&4wnvDIe#_SicS|QkBi37vt3zPXj$eT#j~%}cW2EDc#-TtvwjcXzJAMLJ_v9>`hz|i} z>}-L7YgX7)=E_O)`h9=Bn0r-H>S$XDmJ}<*$kF!rHZ)`n8*)3SwfqcD-}L6b%Xt75 z!9wsDYOGgFam@xx}K7*mU1{gPkH`SuvB{3E}@D^L6V_QQGoQ8>Ds_hG_E#D!=~ zi}Nr9KR4)h)`7IscVYOo4Q_F6fh8rr72;!azJhOMU+dBMQ_s*Xn>bF3X2Oa7kK-*p zj;<2cCQSoNOU@G`>RMZL1hB=~AFuppmm;6mp3}Krr7vF6{fiUDehkC1Rj||v1D7}j zcrQt3q6GEu_Nq@~VM*p`l5%-4X6*KtkQU}G|k+Zw9*Gv4j^FHoJ)s7^-C zVOU)FFK1vH4)=iD71@eo&A|EdC}gxIf*SICK4JZu;ex|}_y99>%NrQ4)mwdC&cSFr zntdzW-Od0c3WGv5L$y^uAMLg3L}V=+$fm6Wu`77;bKc4bd8T&|1#e`V+vBC~oFtmR!7LJZX zF%|2I&Vz1oCg64J@)J2UE(A(nFT<9+x(C-3_XA|GG;JM_yP>w|07=phul#4Phr8Q3 zN+nvm5Nj*)p0yRG`WQ1#Yu_1BRuC!Z~fAJX()7?;#dU-!%1kh@t< z?j0EOtDL_b<$Y*{k5n+V@A}NE&%}Y~uJ8O!TXD4-;$-xaMch#Ia1W%n2#2RF+>X{_p*qxu34`?L>eG-@V=lOQXCyS?!^V9ChZFH< z(y;DNk;u=!&hdc02nb2R-m3F|qLxSnlSgt$XEeKofsF((9zF z(I&L<*-ts?JCOjXoxM02zCehk{s)HZuc_rElF@oTmWj|UOYjMGe$f*MwbvjE86)*j zi#LT9mm`}stg5{hW4p__m$_GdjuAEo5xIeL@LIitqi9FJ`TKM`v!Qhqxmf(hzO#l? zvF)I4XNovDm{$Co17qq~ad1p+fupV{1DdxW(M%ki7U%mT_KdDxpp1%>@EMtmu44hR zqSh9zhqJ|5jaUA&5qQvkmFSP57{chY#&i}(VX=@bj>ZhZ2zvyM|1!d!L{0wt5fIyRvTJ?3i z+z_ZYQGBHipZ_v>l#9SRj0H}}e;uA-B8U&wOv18(N^OBby66xzD}7!07L4d6u^$J! ztalCR$P3bzN79ySB`r=sxMaKyMxIs%VVUW6?tqdSEIwfiPCbEZ=*6P=AVwe;#e48> zN5O?T4Oa|RW5v&7G7LoAYQVQiS@8*C;Zgq@7My23$V4k{xf?-cz%+!y*k-t*aWniAkmC;?_okbSEH?;XJ+x11EzqFKYDJ6Qql zWJ~kr?N=B0$5@;w*Ed=JZd?_73NdbdXz`0UfQROFJ6}TcWEiTs4cmvMfi=)wP1q95 zK!Cdgw|drN?zi34<-CRtLXT`b4n1#ouQL`V%{CYR% zwEpNw=QCJ%S_v;0`XHfTD9&D#mB34cOX7?qixz2-V?t6p725c7GAI?oZo-h+7I9E zY;j&J&M?P4d7_y&u*F#peh7OLen09#F!w3=a$@0QV7=ekw5@Q-N6pRytSZ0icfH$- z(dVMtZZ9@&8*!7w?d6Ro?CITJ+-W)h6Uyy%;=gr!v*VR+FK)CxAwhncaGQ08DBNeg z3u~I&n;*a0?ZsWz+a*hEi6-OsQruolzT3ot<5dIT7#@I1^vzgtFJU2kM}hOLh;tF`{LsPt z^v4JDX7b-@LnF8I9XFE`=)X{Yi*qbe4qnOYj2Os8JK_skoDpCj`X2W-Ku`Mpetg@c zF7Oh>%&rsqGAf6X&Ge^Uj5d9pox2g=0$2|}_5gV0zm*Gd{K0zFvq`Kx2RYod%l*Pzc4D_& zS9m8}7}yWujayZGAS^cVQUTtAH?D#GeUir^H zfjn0p-r^L&phcfAE*8BMKK*POpQD8~qwoU#U>)CuJOnco*PfwUrX#5Jjb3ierUL5< ze})Tn>cv~Se!mE#e)#?$@ZYOd=X?eWmm7m0^x;~wzP4#3Z$iL=vD>sYl>4Sv`*3aH zT?lS*T)ax{Td`4Q$IXR7YyW__So`fD}wek@tBW)ZDQ*W zyV#`L;IAtjf_Q8qi}6a9bXQrS&g^H@tX+o9JxEISV->tXpBEbYhp zzqen$0gc1b2z!h3SG-EYLMYef;RUy6_UB;E%H&|iz=azpk*o0W^mGp7@39BwK)x0! zbs*mdauF3jsm@s_xt@#HeecI`E}RRh+R5HsI1=A=h2j9ks<3e2l8x?rqcJLvkRk1D8%WOOdurh;F>^0ZWm#Og_tS!z%c;!FbI$VIYddbESe)sE~WGc(QG5LL_ zzx~CNQQsN~o%d@fu5a0E2ea4S_i3*^g7L|EZe)E?&mZ}Y-dm1sFh4UokI6%eI}z66 zjDpavoCI=F0en0IPn|Ow8sCA%E4z)8I<%NW->dzMHMzJL(8>MdXoh}}Cv{$inyo!aSV%CqhbXzjKBtLQqLy{~n$>mtU*_I8^?E9H0Q>%Xm z$VKU)nrx)0eX~w{Se$0@^D}(q1xI60Jh!^+d<5n!IJ?C;1i+E<(zv?9lfa8NU7ywc z=}RR#WS3mViI{6Mp^AZNQa> z^AIHVFj?JOR+_S2G;`s8dP{I1?xE+dLl##^7H4@`%&01h0YgE4C+s4SukysYqVWwztsiYfS5~)`;LKNc1fxSWUqaLt^@niFhT}C5TKx7-EIyewi8nVe6t*lkFoSN`LlXF^^IsUz=t&`U$SEQey`g>K^=t`?^hj`ZjYEzW}N-$x+E&VdMM zaSHJ&8Gnse%zsE3f%tF&9ltN6Hv(N5fuY;5C(;|!p~cSu(L}FRQU$RtL2>XTa)ZweOy+638kFM~hR8SN^LjI#l%jsykZW-oWYbc@d|> zNEk64K7gn#%7Spq_QETs!>VqX4lD6i=j{GpyuAl_R7Dr?zbQA_0L!JV2!aG50%8y} zAeLxE6dU&b+6!1;6*gjbVY8$xC@P9w>|H?t38H30S%`uJ!~zOQ0NqPO!IA}3_WPZg zJDY&`em>9td;a?*_ntX(&Y3f3dcD19)FlfJtqx?8;6rsM>YgSm4Rd7%`ZihXAW19k z5iDE{P$%8rw*k(dC7rQVKr$9AzA|P_1J+sXBcLGoz?hgd9$4a{D*W$hM`M_GFe30mvSJmu%?V8eHXbrQ~syx}~d5I@y#y}U^oE;G=h$?6A^ zU9>SP4WQ_KNvl3UqE+$XF{`nsQMEl-kf=J1rSveq4+F&x`NF ze&?~hniL5$3$F>becU5h-^>%@iEZTc2@ivf`1^>|IaUEL)1f;ESUPdNc<-$f_gk(+ zu7RigoKuh!v%bQqlkYE}ARczf%|ts`_#N(y;!dGLAtCEr0Cuqz6G!~*PtjzK^&t)x zw&W5{I>XE~Faj=;LK z9|0sR#a@|eIT0@E!0tMQhc27VUTWjPJOJ5vkQpqTE1}Dtg4!MSgaZ*3v+lrGHb%s(8(b*j4*-pC zF#FR;-ICMbn~^zwN089$r>jFdg7!0ubARc(f*mE93I#x4yctV*gHSe{Y;TDT8f?&D z+0PTYf)=tO&quKCvG5Q(i`_HG?mpDhYA9YUk8*|DNIlP_O&L0|LVsFvsjSHy3^p0n z+T3?*aw$i*8aO!V2`;Z=LgcY-Vz&~W@=Hb&)@#5);Nsyi>n31H*v6qj-(=vNvYN8* z<$Ta`<{SJMgNa!u@suC?zkq^3#mqJx3M`yK-}yi}gI1O`L>oGkFUgajbE*M6+hvO0 z(y&JcZJ92d37qZ1UTADfan5K?I4$L158%o@a_@D}A37(KH3Iq7Kmoz#@P5i1cU?kzAB#>@E@X z6anYBa1fe|oa*R~9*J6JBKmqfgV@pA5qZv7s^*HkTtN5CUfymSj;~&_M?$MJd;Mx9 zE0KF97r?GyHV5_vj#)FiYWvLNo}#Vdl}je85}=MuwlKG@xJSaOQbck#ekENsz#6d|tNM03IdtOy_8M8)Euz&9&DZYWH{G1U460^R* zDas_Qoj^f6*mgrcr|*Z`JGL`60GROdFoLW@TCN?w1%K*)&~mCOSokK8FW_T`ld#y~ zGw^q3f%`KzGa0P?qVGOlV>>iiPl;xnlkfxvJM8a~x%q<~78Rwyg;`FZQuSS|Sxyxe z+n(~J9hS|W!NQ|(F>-mBh(!Foa5PsaK@>{^BZ}GK#gJF{e7NcV?CW;7cF^{| zjYq`)BdA2RY^#Y`p8*f35~hdnD_b61UL~99#%2VUdnurmcrypYQ+~?lrilMd+{v0= z{ug-{UlOxIymdqPwxX1Vu#P-8FSGTT+u1m`V!Qp3?{>V7^xeVJ9=;-4-$v%9eAnZY znN~9LDS$C+C{Ou0)8U_y9<%y@(6Y}`ULv~$ztNLV%l8a&5>bfL*!Pa7ihRjvJTdYy zvIg=cp4hpS)M9e3pB+WMb)6-IT|KK+Soookvq5CL)Eh72KnjMt|4)dsSsPB7 zlQKUY{KX3Y5qR1pQYN$m|4Y?4!6#$EEcfu8K-2W zG5v!(Iq7~fPMvRMOYErEJ)gv^!QiH-Y`L8|q}j6?j}Pvo8@+#uv>r61_s6VO;4W9B zGTk(LKKpyXNcdvlF2ESLqr6HsGWqOXRwgq;b$&7Fa-Q;Y9)>kx{fsk+lbzy!i51?( zt!62$r9ke?NcQ4na@Kl8JOeIfMR>~3`FRnQ*QI@_yv)XiWc=s_vRe8)fqMhTB&-L8 zHcjNejr@o;R!OBCj_b^R(K?$2E*$Ra79TcYF{u6tQn)Qp!a7U1`Lj!ADec(OG?$7q-AB-(A^skA#wwELtF8;8tx%4DjJZL*RGpqKUlqzTIr9;IbA;ZT&a z*j90o-8y2e$49LV&I3?ugRev9DL%B2XZpQ8<+bacu1qd)5HGlNCuV}^gT>o@gt*B5(LF=KzrV{G}-#u7AHNmL{z3P?C|G2Yj?z~&pYZ)nrioG0|z2b z!L)(Bff@TlA-{PP-hXTZ=PROI1oz)AOn2axonTHkoC)h0@y?ZS+bHjgaDVU~-hVN& zj#;PUe0ip{LIEM@XY@RIX~x4sG0l1sSJ7p z&iL2Z-IHZnQ1*Xe0dL?a_CF{t3SW4^2cliFgV~IG6s4R^9P2=g-?SCM(M|hGeK9@F zc^uMFSOYI9nNP`^U&4wih#8R{ct3!n>coWg7VjY5($%>YSSkei!9vP+T$uY1h+o2* zpdjgZ&90U>9D`dbdgm3K@lFzl)E>7c>rzzr298cxrwW_Oo!9Raovi~wC_~-(i@1HA z#VtF%r{Y$t!eqWxb0ogD@TzST*O9Yl9u|MH0b5TPOn}VswO5tzSG>&N`ZHiUT(VwL z?tcRZb6-5==XgZR|MuSNPCT~YwdXvrNUHaiIpw|yfb4%HcyHjWgjFg+G9|GCIu2KX zP;rQCb9E+SryJz$Ak~(WLW8+Rk;x+W&e;;NAtI1`W|w?H6T|p3$~i!L!X;83^0&29 z5!=N}A|^YCe+5=Rqe3Ex{Xc-r{qa=s%Y`@oKrfXFZaOqsVjOQ^RKi*$WGV*lshnd? z2ccr{E4fECUIa7AAahI%?lzcSDh67c(FS>hLbC7C>7}A|IUYJ%e=)9Plgs8hiB`Bu zqSX~o!sx@xM5~*E_5PLiz$%J43aK_z{$NWKSMyX+EJRNH%>#Ci;%|^s6+Zc`*ma$d zs%U;nqfcm+AXGHlsAwV;ER$DeM90omAd_J!x>v*m3a@x*>LTQD&YK6Vf7~L-X+12g0wr(tL zGnfqq69J>l=}dngJtp_WIysry*=mn_ll3Ly_Sk|v4^~~MI+B@X-{Wh7VQz?BM+q?O zR(eb@MS?j)t92U)lWI2tW4mz|M(Z+_>CV##yJXi-&86WugY2X<)QOxAk{!K^bod7{ z5a0rteL#veU!nXv9l%xI^%B*}j*p}*_Dclpk{?hxK7(;emN{gTG{@Hf^r|Cea)D<_Tq9=nKdNgJg`XsNf{Hy=1Noe)b$cBP?TvLf!Oa)trM zM-fExn61fr7me9kMEeJeOb)W{$ry&Rat8dI-X(jQ5mBWFssy19qp76wcY30w6kb}OF@`~i=@<58yJ?b zt`mBtU{4f0I<2@P=l`_maa|;TxHa3s;8^LWy8P{3qxJ@%psyD`sM%d!tbexBEvw`m z*%yFT*qp&pd+!^#Nu#E5Cu)0Gvx9jDOlq)$gvo zo2*Vm-8+LJ_j(#|>e3&eF3a1%Q_l>h#icVc8@HZaTr1Lol3T7MLpp!5-#R`HndvPz z_?d&R?txV*1GFpdPyQEfY-*QWPyT7L9z#QK@d=^AapGZzM{XoryaEO1|HO;7m5SsF zF11KlS1MkzddU{r1*s{{5KNKi;sp~bJX8zuB82kL9hWLtw>r($W{yElR7mME#NH-n z>ri?y|K$}8gUIYfW(yUr6E`~`H|QY0Ro*h_9!%eSX2Evo<4M3T@iN=* zo=`BsM65>vS^MWHD}b+O{0U=t>0EaCvJ6h)xJdbr;3+@nU3}u*_mks?W@KV+Twq_P zivrM>FmUdhmeAJ^ZmwDB#VfI>2r+@vIds^KbZrM}BJ-10Hb7|8C!xG}cDiSM# zQV*R6R#%X}(yGzHtNTil;coiok^FXeMyvyQ$|$nM{+~r^o4bXFX=`_839Li<8CcSx zmUqnhgs1$RKFEwe+U0-sKi-EH%f8Kv_#)T^N)|H-0IRo=9IllD{9GgwdCmiClLDYl$6zC33%6 z61fJR@^emsH$HdY-K&H&6@$yQqUe$H>wWxcAiWEs=0c@3b>-}z|< z?t@y5%WA2vWX>Psld1f&YKD>N`WSx8{mu9<&aWu zz9zx`pyY5Kprk+A1btuNra4_MFGk6;gnU!R_+@9(;$h^exH$vHQ-03((s4dl0;jgp z25GXMAx!$6wM#{QsgM>)Y>QC9=>js|YY&E-G((3K!f<|y!4`&dW%=(H|6YseVym+d zyCa1hU`lERuO_RD7CBPsASkWFeCdZh%A9BXIYefd4oR}JY?7B>>gEow@jE(w47XLi znXa}Uw5}s*IPRRrT^&u97{?nJkg#6BR|oJP0?1hwvE;r4Do)kW8uqH`u?zxY{zIr$ zS?_?!cT4HJ*GWqEhd_?Abmpx)1cS9WyR`T{-P`hlh*{j0h$NzP8R+}4*3F^Yki2n{exD~65oNX#S2wJrg zo}IHgw5-VKiCf*W8S$S9U1%o_P8K+>T+LbSWB}=qD{q|6iql!o4C6}(HO|JDrT8X2 z?20@rKA**Yd%^|uu!)i27*D8({H9=(Y-Sc=K@m~z(jT|XzFW?cg zrtp-XMDusL$`$?>!ALaEQPFHiG@17SC-;Fy{F8u)tF7X(5C-YT=6cFkNQ2d&Hmo+Z z%2|}Nx;+0lNV%t*r~I605XY=soO0)A#6Jv3Nx2V?#*gEhJ4i`0Da`%9Sj!t2ldyV< zgd$1QHS~Qj!JkR@4uCW2niDl{kPm^BL|q4B&qTGywNi=dL|#hS{aCU4j;FQVZxX!q zF048ek0cvK^2gyO9ST-RI($yg93=#2(%~irOFE>4wMd6S_%aUU*_;lxU0RA9Nr$d@ z#4ImQ`8l_Oj<0Jk9aGaY6~LU2(LGbfzZivV{~Rop?@t{@hi}U+B-r6MUeqzuea}sT zgp|`6*iKr$Re~uJYfhqLLZ$f*2-WhXt#5Amo;1kLAXO7pZZLxs8O=w9H5Ob&-hbuk zyPhYj^d;2|Y{RQ#M*wf9H_FUBJpPC54w&%RJCXr+JoSjK)pjQx1Z&kjfF*0TQ{_l9?dkqxc|QVPAMJO<&+ zlH%?=1IVa03BTHU$^6~H#;n#n<>!pWBVOND#tvDk$)eG6?|5VE;G)dXA$f56*ftfu zpZ-Yml=&QCe=M>ad(0G+4!KIXsybeHfNK?Ug&UdI?1SUP?72mT`f z^=9=mWxx3^B8U7pmD>!nyfxw~^03HNRiEvxne!eCxZ8J%p}yxSKkjG*(qry)3Be=j zI+)(JoMNAkpY9xLddb*b@S_U5O{S72w80U{e;zU{^A0bQ<}U*4bS?pkSz~z0&klb> z*EeQegGX0=Pq;Uw633TS2O7s=;6?6d9AV&U4Qa*dz(8 z#aha0#CZc;O|t+7T|=I+5zWRx%>Bm-DR#>y`_TR=H{L7h&c=(7m1ZhubyiW`@6*H~ zE)jZG#CI|D%zLyAZb=)ujNNyV=eXTOP8|NWmi!yW5l;sHq^+9#jZu=zU4TmgU8WZ zv?p{xf7X6L$+^;qZzd2Lmh7az9LawW7p8uiml@kWq+mV2KT*MI;BYM<_n7mPpYtK? z@qVpU4d~8L(q-0AlXX2RdIP6Ke8)qNS-O-jVRv5e$F!jf?QnbSf!pzxEh~#QEy6-? zkaEGlu+WuXiG|w2v}=(lx$YZ+>bpaXR_X4$x9*Fcli7l`D)MWMI>}d1NO3Q(IYm)P&W}&>>fWWk zOSI9B->nezHx;JIT1YV7z}?*c0Hdx?&#b3Z&aozgP&Lo9tEJ}AYejb&WI0HgCA&o- zdQ{dwPX%Av`$_3$a1~Nz=NF~3dmg@QWlLLOPsqVb?maE_03?^F)N=lKLUQ%tQ0cM! zlsfu#hvA5Sg3&qurp5z5bH)&b{^Vtb^V<|muH*a%poGr(4@qn{1;()i>Xm(Dl&;gD#b8W>8;VHi+D@Qc9ONP+d4%PitZq3EViM+Kd$vi=ODpg$*^KMJ%C?#Lc@@u+!e^H(;|(X%0qS$}OM5PprvjY>p0(s-oH)s{I>yav8G z%rn&CJ64;cn{!5uZ}50Wjju_oTG`YCXpNv zD!dGeKa2C|>JZD>I+mS@Lx_7yveOMH(3>M<_4}||1*S%*~0Q) zAb#nA)7k$FEY+T*BN`pe90-^pETu&JM+(Q9MD+&57aw5HVO}=FyCm9>$tiB1X9+WY z9w=hgPd{lxDFgM$RIAH8oeOxF)H+q8JwfO{hTcs{nPd(BNPFL8)gvp{E};cQ#ZR?J z^8F^V}pOSvcvSb+&J1LvtiTmWI+!&W?c)HM5ZZ9o&T6ZoegS?ESvgo0!mbe z#8lzC@T+a$g!t&mQ(JjHmHAbF0sh>9#Z!LH1udkXszhbum6ASGp?>2`>WfNxTO~b1 zN$<9s^v}qwY(umk(I?V#a%u=H1|#c#a->xP+f3n(S+C&K8Td1xARe3~#D^?8g?vj5 z0t!cwGIRt7V<0G-)6Wi1SCTFPE7?PCI_?yz&thuFQ+s1=kHpHb{~G-4@Ey=e`Ro*G z$mTNkhtK=+I4b?tG#5wXug;GY0LVN)$7csBFss&C70;*=0jDHu zuy8BhnQS*!=oO${4JAflnHZt`gOy2)geCrZ)ovp`DDWW&=|B+fTmj?hW!3T}j+{K% zzo5b|10S<)=P5tuP2MJ>RfC9G|G~?cMYfK=1-8k$54~~&99}ybZ`tN2*{2Tg$%^Sf zu)2htrX{Bb#x-)}t1T{_E(JhAXakpvLY-*K=Z(a0qmN7vv`JQv-ziocvyJ_~n*|+h z$l*M|nJQA>H@a3`2cWDc9BSAlL>VHbdP z$zdfp8`pe+w087_>uENn*EYF_|NZrpS3^_2eQ z?MKqnYB{N^ds<-r>58L-)lI1+ozmhjNS6GKac(xs9@{zM`w6J5W)~kY@Rl*^U5_&} zd*)&99WFTwhT%2wyDMc3v5$-~6fUqY_ufM{)QMRS@|L*(vfATpH}Y`z1EXp8!l5g< zaHt1Yd7j0=((~-r!NLhpWAwL|>J3i0p2o8lTQ>_b9)47sU}<`97F~l|=}j5a)#qo0$}Vb&xW zmgUKX-fXei3Y{LQIKM??7&uVLl(a6VQxwVH{yh^J?c=jq(6=X?i8=%$I5h^0Sib`* z=`pJsPzTWuG8y@mFEBTrWD^)2MV=enAm!q}4QhzQje*~l=TCt>hi`|HWJli0z0x70ANg>QI`LBxIhsgu*b%)6f zc&Xv&HvmbFDRSYT^969iY6q3BFRrJrsE5gq&k^GshRTurC7Z}1bF9_8%rLn|!D^WN zETA4H&j$)^XFcvu$+~+TCf^2$9wt8mB*Wwt&?>!R0LdCz=(-TEm~|pgWw&?mhn)E>RwI0b{9sf$Ecq>ISR5%$2UCF{3k|nRjflgz18J$K0i%zHT=KK#&rPFjI#oLNb zsoB?rb-MPY^O->kHd!OIj*V5)F8{T`WxZBdSJ47CZy--t9aF4Jhym-ru;z02KCCl) z#UGj_b~_kGwEF@h(PbBs3!xJ0cAurm0Uiub}OM%?8CQl(WCr)64z_A9#Q+`fJ z0^9bx1m=F_hQNe|AAx=Uxy0}w9oPdZu=aQoSZjI3tS=kVJhEgQv9Fb226PF?$3rH2esDv|N7BMX^5^4@S#R)^nbL^01W3)7dPNno>r;xLoTt)c z+e2t_Ihv&RcPsm3Dj%dWFfHVM+>ZedHMks1^O4&|;pBT^JQIs@LG#_;!i$8&4&TY3 zs>!+vwN-r11gkqJhl!3>0d90sGrqrsO?>Ks=>I5MI@l#c8RkUte`NN7xgVZ7KHGs* ze1@X9#OG5*P{~t%PEU!?gTG?gl=e;5*9i3n3it?cy&c?P6|)R7Uo)`kP=<}28&%-1 zDr7o=AI1pIIUi(-=fH$jmf|@V9?pNdfwKPPLX8~sxJtpK$W$4gCB7M7FTK8UUsv$l zf2n+lU&>eZrI!1+?-R@HT2Jh_C$KKl=OO=5fVP5hPMboc=KZpZx##9ZK^Jm2%zO>8_&Y1ReUPTb!$%BqlKRl)XuIi(4U1qJr zHZLomM|jFFqG%G<`^qf^==%qx!+i^G8A9mKkCfJeR86HitrSOa96JL92{|<#HU|Bw@CFn$ORJCNsx&GcF8A{1#0UaAk4;_k^>m$gKGnh2(=YS z3$~J%O{!!0?394}lmKhpcanbeyPS2Cp??H=LUx1hXM#>x%c0XDpP)m2Ss2|dLQg7~ z#c$bb{WJp{v?v9K7G)x}P_*c0)JRz4Q^K~p=`RA@RmzbH7L865-ZXf#`|aCXFOO+} zq}BlU_$xs6d$@onO8_-A5J2q!(EuB}*aMDq6vTonq=xWq{+8*grJ)^}93q@82l*LI zme;VYE7XwAm3PqwzpMa6d~={<%uw!o8^9@Gel0$lFDR$=>ufYrfC}RUNOTxCspwUi zTjp;QA*z$>`!Apy?zUO~7%oNQ7zkw?k}GTGa)4m{e7A_G!J=onI;$EaLfz>nM|^(h zZ(N#z>3z84)jx^(+*QV;0IHk_ARj>xjNZnr0NMN2&m4&8XO4RapmxP2tk_zU4UVCX zi};?yt<3TmfYbdsLOhcY_nLVlDc*E=$s$)NX7;GiLR^pg9Ng%A9^LwQE2Ma`O%b3E zlww{)M+D+L!wlS2Gj@Y<$`lfpU+`ESMf~v}PkeZh{yj&! z?`S{zsLY3on?_F_CRNI6y3Lgzun^_U2Z{%`po#t}0rpB*3*pX$j}IzQkCQ@AfiQ!l zDGH_vbRHDm;hI++BNE=S6z`9^_+8$D_guq^%#(o;a*7B^{wSs}8YHaaQ$k+VLb|pP zVz&^IsfAb~WFA7Y&Brj30;qf-fXWBz8yJ!y6dK869{Ztxet%?F=+V~o%X9U{JI zxK%!Q0KoAxzZ^eF)b8VcCxp09O0jI!h5l;caX)`|p@Q{d;YbDRW@H#Jb{JNUz(k`6 zM53sPz@zZf3Gtj3*g-Ms@9AYLSPT5~YY9jT+y;!mZDk02MFh6$qr{28&G>17r)z;x z#i)hMF+!Z#!h3__?VI9#C&k-A^M(zt6Bha-g}$$w5eVzP6n%p#4Ayxm`tyXom6G3F zWuBg*e^1lrDS92Lt|{Iw!n>TW(_#6PZXHs*w`*SKtL7ZLPQj96zbl3JVd2&1-jtEQ z#9Q0sNX`3p3*Hw}yw3~o`NG?(m8*2ZdNRekOO;vcHV~>IzuqvC)h|=9)c2Q&koH=L z+nRF*ASI+y3pv=(!`suyiCEnML))wF**CQP*!w%G20m1OEBk4raZg8b9P?hOsyISD+1ih$qizw1t6zR~xRiuM~64vD~v{Q=IG8MoW72x3p>L>gG(37oCijRC zpiD|pe+-kzc!fC?b_c^u{g+Z=Htk|b6~_>*LtI7dFdNFTPj(As)}pGDWM-Ie#edNp z-ue;~UgIb6r+yI2x#>Ve*F&f+cNSqRwmuL>XC6Z0w+g9AGDv6PrEPMcBAq0poPpw{ zQ>+B8h`$&&=22;QvS@U(2q&FWMWO z*aMuB@`#esJ|#u&mEiu@RicaZ=j`xDDDB9-67gwDO0zC&p;9y@TZHB#p&1KJMtd3! zWhwyOd1!C?4DC%@k+7bIU7N6Sft01d$u#pPF#OBnZuUaCxB4n5*jf@qCF?HW=8qYj ziHk3TqqcX?j~NZdOV3?KtbV}mTzc|;=F;_rql1~f)IIn9sM)0axa5hY! zdXUv0rv@ngz$PNu!9)^3N3w&7WQXQRet-;}%53MtvJc`mseCoImr*+XUj(LQcXzXw z*8mCY4#>5Q9<9bkoOuiuo(hg`-t+Geanx3MM(vMk`&B2a={%B-f&D@|+u5bxLXcLKwz6zt)sNPw zy#3R>bsSasTUC~`n#y89t+CI7@kHW|jS`9dO(YD!7zjFTgZ|0}A>8CHR)OvCGI z-FZ~UFWS~@Ah_)2BGDE)QBs22yrMb#e~hA>0R^Lj^XcGXAe7jyh*e{1-3yoj{%>kH zFOr4h7pf3V@o9V`K0*-fO^i95HwI>PIPZFZ#`5@q5Ts>yaxJ=#0gje0Seyt6H~1W2 zhf65tGwc-`7>;2$e^ux(n4jq3U2J020=& z&ztSB2H0fUcZh$&ssocN$x-rhl`{VaAWXbzAhhjY1gVUaJHxd-x#mHGJX|5AV^MNH z3LGH{WSbOW4gk6!L8$ZxmK-CkS-w)>axl60vMN=j)8B|KXZUV<+Xoora|)?DLv2Cs zuBwwE3e4q$<|yD6zJ&GXauY<9*#tCS1wuvVz!pJ#Vvt9hAR@jOz}fSqd?jm+pwxXr z3Wc`sZ(*QG`&4@P*sx6Pxp-J5!?|P*Oj|`$2SC_3DsxI8c9tKUxT-h zvLLi1S#JHY3@ARcPMXz&+)US^S^W`jVU`400&H@`(^!Y`KbRtXndm@6YH}-nG5HF! zJ&livwC)R$J0jL((7F~*-SPvw%os@T=eB#Pab=3dxezGcO_XYHlxlC<`o_|Dx>DC5 zIv9QV1|;%>NECIu0Hbai>V>zU-ir7bwz_A4E%WXA3_r^TE`r)F>4QJlC43KBHq?Ij zrpGgDFZ%nI3Ev_KA<#awBW+B7KC?CMz`3~~8e4^Sv>VrZuC)67mYBHfV&P1?hnUIf zBm`mRChZO6oFT%JSU15qq%38?o%EXT#N9YPK18v(Igg&xUBZ?rkvvpua~23u zBK(px8zUvCbm7S}wOhhEF~zg%BW0NGAk5&dgMwu!(O!5LeucQb z3J5P^tx?WwHM6|pE)q{>>zxmP;&&@id9JL4^$Da}^>JF%W3H$Y=Z)t2X#z;4Tg1Ar zh3r5|_J2fn50RZ`^h{V+r)2M^Wglt8kR*pFm?-l7gBButrbK#0_iZ%3(*)6KLqi1p6OQ$paK#=%|QX^p0)yHrYX;Kx${hyTL3i& zb)b(N$m(PHaWcf%>9*ub(Z)Hm@KiZ7$Fn1kW|ID7(cDTeOkyfErdL5ghZ?d0Qc7X69Ucu z7(`dfy03GQ1kzmv;ucXFhAUHnbkTtf1tD>xYEaiDIfI1l`>%+gspMcgNZ9B`F-X#E zX&_X4axN9A^H%_#_k<@e&#lQh1HI7jWNMyeAdE??6|9Z&0kG7%vw6E&oKMF(uOU=t z@drixIa++GwwVUCR_Wyrl+FLEL=q2D?`j1j-nmM6JG-iB=7ja16z}z#_s|x+eGD&h zx&b4ky9inNCA|#dr-hh!a)DA{2zLO9MAhI%Il~WU-Gb)Gu2!&)Yz;6HKP7*21{Q~o zLp@x&6u|pZ3*ILTFZX`{vg2di#i8w_)}r?)L%V*BF-Zl$$`;~!B^$;71(P;&%# zqy_p0ckte7Pgn5?C=e*>TuX|)|angL>2NpgG_5= zqTvUPEOL=dF3hn$2WN8sLIvv#Q3))${{w|1EuD97BO#`;%hGuaD1Px5GORGubpr+r zFuC|qIAnf|510{kbuR{YHxbk|c$mI(%Q@7ME%7bpP=~a@>p4oke@JQeI9GsQ3hgWSdb( zGBy6#i&(dcM63%L8#D*>T6*ya_QxXJOnNrnB4eohOF*S=plqE#7$-9{@pNh@JDg6F zQQ=cK-#}4p8v_IR9z$B@iXXjoPNC?zW+nC70Hc;8bB^)F;L-*d0}L>b(?%Fx$MauV zCt+KJ!h4m62x3nH}h*(eIe81r1P^GlAo|+wby7pfiV-Yeu${4Gdp~DEzfSBlD zhN%EzoPGb|gBeameh4?{dwDtXji~sLe;>-_FzHgWFQGI(9^bj*|EXoUgHyCjWg^ai ze`G>@g()wmm*kP~|LZ{W$s{cUy+Z<3#+)dDz9V_49f3B_`=<&KXFyXLWLpi(6`wUm+?t(#FhHw_lIt?*5sFH;Op@tk3i z^r5GzgXD9-a-|aWZ-a;E)i&g?ACsN;RjuZ=E%#ppakRcYcOBuEvuymbc5SEsLPv0a z&OzfPQw;-Ts-fRJ?BeOCw{kXKOC@nQ-Yv3uJDg63pQ(k_Y(qPV*%!;%ij|64DnhAv z9GzagACk6wxSOQKIGyF2q@nr&P$$Um%y&7{Bth;+sFf1>KkCs`FsT(a4u(ybPYXzx zckUkM**Fi*bjmjp!2Sf_>0q>Vmh1r63S640Nt3AxIN}=&qdo6;&scw=mVPviYM{0B z9g@j08TJR9cmzrYj^gAiwPbXu*F_wpX^ThUk=4?p{T`IX!$Wmxp{;4^iox;})5`DQph88t)x{JgznJm=UONE12j;`o5#Maxvp>^3^=friObB(cX~|c*-At7}+GmZ4 z_=^ZcqU0q?_Pe#^(OO5g=xj?{)xfgG*uJYa6Va{grIas#OC4O2Pz{s^KC0lIbIIVh zfzqMhE}_5vDdrs5b&&2W3ZRCA0w_ZYpn|9UgI!m~5$3^yg)iY|C8jG_cKzaD_h%AE zMP4}$zFzLh#^+D{ji6Qn%146cNxqYB!U{;si{Z$Qy|W z26uFgf6NT@Q6G7SDbT$#7aTl+j(kP7@<-tazYRy_K=5+yN%uBzMmJ>4vq7-jcHBIl z0BM1td{KV;2T09&oii~zIk!~|UuY-&%$oqHd-gf1`#K?*!qqt3zW`G4sysd$4|g@a z9X&(&iagn0`u})H+1PGZzKLMFqz8O@&ZH1XI=MmYQw&*}j$!z(QEZ3XJieg{#m4WH zXJz{Z!nzTU@tcmN(S=|d92<1AJ5=`Q^RP^7p^PFCD$ zl_M1QQHndm+d$9Dm4JdCrxXb)l2kLETw>G#LQK#mDB6#igQ<3=Yb%r{=&i~Yebn8< z7~L0&F}}jTBJTuvus~>Mkv->&aYF)~Q&Il_e;v>EyT$W4@GTX*lt{ObY{osF4QpZ+f9%z}lF;Fg_#SRz8XyYb5p~;7gT)f>bFuC{+q_n@ho~a0Cl|aAexyCvmt%qN4lGS=fEU z{S*r4dn!26BP~d0a0BSXqAIktr!K16lpS1lf3Cxz%FU%0AR?78Ei>hN@U_g8PvahU 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 literal 0 HcmV?d00001 diff --git a/include/apice/coredll.inc b/include/apice/coredll.inc new file mode 100644 index 0000000..6e7056b --- /dev/null +++ b/include/apice/coredll.inc @@ -0,0 +1,1231 @@ + +;Define WinCE ordinals for symbolic OS calls. +;By default this file is included from "WINCEX.INC". + +import coredll,\ + __2_YAPAXI_Z,0x80000447,\ + __3_YAXPAX_Z,0x80000446,\ + __addd,0x80000805,\ + __adds,0x80000803,\ + __C_specific_handler,0x80000057,\ + __cmpd,0x80000802,\ + __cmps,0x80000801,\ + __divd,0x80000800,\ + __divs,0x800007FF,\ + __dtoi,0x800007FE,\ + __dtoi64,0x800007FD,\ + __dtos,0x800007FC,\ + __dtou,0x800007FB,\ + __dtou64,0x800007FA,\ + __eqd,0x800007F9,\ + __eqs,0x800007F8,\ + __ged,0x800007F7,\ + __ges,0x800007F6,\ + __gtd,0x800007F5,\ + __gts,0x800007F4,\ + __i64tod,0x800007F3,\ + __i64tos,0x800007F2,\ + __itod,0x800007F1,\ + __itos,0x800007F0,\ + __led,0x800007EF,\ + __les,0x800007EE,\ + __ltd,0x800007ED,\ + __lts,0x800007EC,\ + __muld,0x800007EB,\ + __muls,0x800007EA,\ + __ned,0x800007E9,\ + __negd,0x800007E8,\ + __negs,0x800007E7,\ + __nes,0x800007E6,\ + __rt_div0,0x800007D4,\ + __rt_divtest,0x800007D7,\ + __rt_sdiv,0x800007D5,\ + __rt_sdiv10,0x800007D6,\ + __rt_sdiv64by64,0x800007D0,\ + __rt_srem64by64,0x800007D1,\ + __rt_srsh,0x800007DA,\ + __rt_udiv,0x800007D8,\ + __rt_udiv10,0x800007D9,\ + __rt_udiv64by64,0x800007D2,\ + __rt_urem64by64,0x800007D3,\ + __rt_ursh,0x800007DB,\ + __stod,0x800007E5,\ + __stoi,0x800007E4,\ + __stoi64,0x800007E3,\ + __stou,0x800007E2,\ + __stou64,0x800007E1,\ + __strgtold12,0x80000441,\ + __subd,0x800007E0,\ + __subs,0x800007DF,\ + __u64tod,0x800007DE,\ + __u64tos,0x800007DD,\ + __utod,0x800007DC,\ + __utos,0x80000804,\ + _atodbl,0x800003E4,\ + _atoflt,0x800003E5,\ + _cabs,0x800003E6,\ + _chgsign,0x800003E8,\ + _clearfp,0x800003E9,\ + _controlfp,0x800003EA,\ + _copysign,0x800003EB,\ + _DefaultImcGet__YAKXZ,0x800004C2,\ + _DefaultImeWndGet__YAPAUHWND____XZ,0x800004C3,\ + _ecvt,0x800003F0,\ + _ExitWindowsEx__YAHIK_Z,0x80000127,\ + _fcloseall,0x8000045F,\ + _fcvt,0x800003F3,\ + _fileno,0x80000464,\ + _finite,0x800003F4,\ + _fltused,0x80000445,\ + _flushall,0x80000463,\ + _fpclass,0x800003F7,\ + _fpieee_flt,0x800003F8,\ + _fpreset,0x800003F9,\ + _frnd,0x800003FC,\ + _fsqrt,0x800003FD,\ + _gcvt,0x800003FE,\ + _getstdfilex,0x8000044C,\ + _getws,0x80000472,\ + _HUGE,0x8000049D,\ + _hypot,0x800003FF,\ + _ImmGetUIClassName__YAXPAG_Z,0x800004C7,\ + _ImmProcessKey__YAKPAUHWND____IJKI_Z,0x800004C4,\ + _ImmSetActiveContext__YAHPAUHWND____KH_Z,0x80000326,\ + _ImmTranslateMessage__YAHPAUHWND____IIJHIIPAH_Z,0x800004C5,\ + _InitStdioLib,0x8000047F,\ + _isnan,0x80000400,\ + _itoa,0x80000401,\ + _itow,0x80000402,\ + _j0,0x80000403,\ + _j1,0x80000404,\ + _jn,0x80000405,\ + _ld12tod,0x8000043F,\ + _ld12tof,0x80000440,\ + _logb,0x8000040B,\ + _lrotl,0x8000040D,\ + _lrotr,0x8000040E,\ + _ltoa,0x8000040F,\ + _ltow,0x80000410,\ + _memccpy,0x80000412,\ + _memicmp,0x80000415,\ + _msize,0x80000419,\ + _nextafter,0x8000041A,\ + _purecall,0x80000444,\ + _putws,0x80000473,\ + _rotl,0x8000041F,\ + _rotr,0x80000420,\ + _scalb,0x80000421,\ + _setmode,0x800004A3,\ + _snprintf,0x800002D9,\ + _snwprintf,0x80000448,\ + _statusfp,0x80000426,\ + _swab,0x80000432,\ + _ultoa,0x80000437,\ + _ultow,0x80000438,\ + _vsnprintf,0x8000047B,\ + _vsnwprintf,0x8000046C,\ + _wcsdup,0x8000004A,\ + _wcsicmp,0x800000E6,\ + _wcslwr,0x800000E7,\ + _wcsnicmp,0x800000E5,\ + _wcsnset,0x80000043,\ + _wcsrev,0x80000046,\ + _wcsset,0x80000047,\ + _wcsupr,0x800000E8,\ + _wfdopen,0x8000045D,\ + _wfopen,0x80000479,\ + _wfreopen,0x800004B1,\ + _wtol,0x8000004E,\ + _wtoll,0x8000004F,\ + _y0,0x8000043C,\ + _y1,0x8000043D,\ + _yn,0x8000043E,\ + AbortDoc,0x800003BB,\ + abs_,0x800003DC,\ + acmDriverAdd,0x8000019E,\ + acmDriverClose,0x8000019F,\ + acmDriverDetails,0x800001A0,\ + acmDriverEnum,0x800001A1,\ + acmDriverID,0x800001A2,\ + acmDriverMessage,0x800001A3,\ + acmDriverOpen,0x800001A4,\ + acmDriverPriority,0x800001A5,\ + acmDriverRemove,0x800001A6,\ + acmFilterChoose,0x800001A7,\ + acmFilterDetails,0x800001A8,\ + acmFilterEnum,0x800001A9,\ + acmFilterTagDetails,0x800001AA,\ + acmFilterTagEnum,0x800001AB,\ + acmFormatChoose,0x800001AC,\ + acmFormatDetails,0x800001AD,\ + acmFormatEnum,0x800001AE,\ + acmFormatSuggest,0x800001AF,\ + acmFormatTagDetails,0x800001B0,\ + acmFormatTagEnum,0x800001B1,\ + acmGetVersion,0x800001BA,\ + acmMetrics,0x800001BB,\ + acmStreamClose,0x800001B2,\ + acmStreamConvert,0x800001B3,\ + acmStreamMessage,0x800001B4,\ + acmStreamOpen,0x800001B5,\ + acmStreamPrepareHeader,0x800001B6,\ + acmStreamReset,0x800001B7,\ + acmStreamSize,0x800001B8,\ + acmStreamUnprepareHeader,0x800001B9,\ + acos,0x800003DD,\ + ActivateDevice,0x8000049B,\ + AddEventAccess,0x8000022E,\ + AddFontResourceW,0x8000037D,\ + AddTrackedItem,0x80000242,\ + AdjustWindowRectEx,0x80000377,\ + AFS_CloseAllFileHandles,0x8000028F,\ + AFS_CreateDirectoryW,0x80000284,\ + AFS_CreateFileW,0x80000288,\ + AFS_DeleteFileW,0x80000289,\ + AFS_FindFirstFileW,0x8000028B,\ + AFS_GetDiskFreeSpace,0x80000290,\ + AFS_GetFileAttributesW,0x80000286,\ + AFS_MoveFileW,0x8000028A,\ + AFS_NotifyMountedFS,0x80000291,\ + AFS_PrestoChangoFileName,0x8000028E,\ + AFS_RegisterFileSystemFunction,0x8000028C,\ + AFS_RemoveDirectoryW,0x80000285,\ + AFS_SetFileAttributesW,0x80000287,\ + AFS_Unmount,0x80000283,\ + AppendMenuW,0x8000034A,\ + asin,0x800003DE,\ + atan,0x800003DF,\ + atan2,0x800003E0,\ + atof,0x800003E3,\ + atoi,0x800003E1,\ + atol,0x800003E2,\ + AttachDebugger,0x8000009D,\ + AudioUpdateFromRegistry,0x80000178,\ + BatteryDrvrGetLevels,0x80000129,\ + BatteryDrvrSupportsChangeNotification,0x8000012A,\ + BatteryGetLifeTimeInfo,0x800002C9,\ + BatteryNotifyOfTimeChange,0x800002CA,\ + BeginDeferWindowPos,0x80000485,\ + BeginPaint,0x80000104,\ + BinaryCompress,0x80000251,\ + BinaryDecompress,0x80000252,\ + BitBlt,0x80000387,\ + BringWindowToTop,0x80000113,\ + CacheSync,0x80000241,\ + CallNextHookEx,0x800004B4,\ + CallWindowProcW,0x8000011D,\ + CeChangeDatabaseLCID,0x80000154,\ + CeClearReplChangeBitsEx,0x80000148,\ + CeClearUserNotification,0x800001DA,\ + CeCreateDatabase,0x8000013B,\ + CeCreateDatabaseEx,0x800004A6,\ + CeDeleteDatabase,0x8000013E,\ + CeDeleteDatabaseEx,0x800004A9,\ + CeDeleteRecord,0x80000140,\ + CeEnumDBVolumes,0x8000048D,\ + CeEventHasOccurred,0x800001DF,\ + CeFindFirstDatabase,0x80000139,\ + CeFindFirstDatabaseEx,0x800004AC,\ + CeFindNextDatabase,0x8000013A,\ + CeFindNextDatabaseEx,0x800004A5,\ + CeFlushDBVol,0x800004C1,\ + CeFreeNotification,0x800004CA,\ + CeGetReplChangeBitsEx,0x80000146,\ + CeGetReplChangeMask,0x80000144,\ + CeGetReplOtherBitsEx,0x80000149,\ + CeGetUserNotificationPreferences,0x800001DE,\ + CeHandleAppNotifications,0x800001DD,\ + ceil,0x800003E7,\ + CeMountDBVol,0x8000048C,\ + CeOidGetInfo,0x80000138,\ + CeOidGetInfoEx,0x800004AB,\ + CeOpenDatabase,0x8000013D,\ + CeOpenDatabaseEx,0x800004A8,\ + CeReadRecordProps,0x80000141,\ + CeReadRecordPropsEx,0x800004AA,\ + CeRegisterFileSystemNotification,0x8000014B,\ + CeRegisterReplNotification,0x8000014C,\ + CeRemoveFontResource,0x8000037E,\ + CeRunAppAtEvent,0x800001DC,\ + CeRunAppAtTime,0x800001DB,\ + CeSeekDatabase,0x8000013F,\ + CeSetDatabaseInfo,0x8000013C,\ + CeSetDatabaseInfoEx,0x800004A7,\ + CeSetReplChangeBitsEx,0x80000147,\ + CeSetReplChangeMask,0x80000145,\ + CeSetReplOtherBitsEx,0x8000014A,\ + CeSetUserNotification,0x800001D9,\ + CeUnmountDBVol,0x800004AD,\ + CeWriteRecordProps,0x80000142,\ + CharLowerBuffW,0x800000DE,\ + CharLowerW,0x800000DD,\ + CharNextW,0x800000E2,\ + CharPrevW,0x800000E1,\ + CharUpperBuffW,0x800000DF,\ + CharUpperW,0x800000E0,\ + CheckMenuItem,0x80000350,\ + CheckMenuRadioItem,0x80000351,\ + CheckPassword,0x800000B6,\ + CheckRadioButton,0x800002AC,\ + ChildWindowFromPoint,0x800000FD,\ + ClearCommBreak,0x8000006B,\ + ClearCommError,0x8000006C,\ + clearerr,0x80000467,\ + ClientToScreen,0x800000FE,\ + ClipCursor,0x800002DB,\ + CloseAllDeviceHandles,0x800000F4,\ + CloseAllFileHandles,0x800000F2,\ + CloseClipboard,0x8000029D,\ + CloseEnhMetaFile,0x800003BC,\ + CloseHandle,0x80000229,\ + CloseProcOE,0x8000024D,\ + CombineRgn,0x800003C8,\ + CompactAllHeaps,0x80000036,\ + CompareFileTime,0x80000012,\ + CompareStringW,0x800000C6,\ + ConnectDebugger,0x80000279,\ + ContinueDebugEvent,0x800001F8,\ + ConvertDefaultLocale,0x800000D2,\ + CopyFileW,0x800000A4,\ + CopyRect,0x80000060,\ + cos,0x800003EC,\ + cosh,0x800003ED,\ + CountClipboardFormats,0x800002A2,\ + CreateAcceleratorTableW,0x8000005C,\ + CreateAPIHandle,0x8000027C,\ + CreateAPISet,0x8000022F,\ + CreateBitmap,0x80000385,\ + CreateCaret,0x80000292,\ + CreateCompatibleBitmap,0x80000386,\ + CreateCompatibleDC,0x8000038E,\ + CreateCrit,0x80000268,\ + CreateDCW,0x8000038D,\ + CreateDeviceHandle,0x800000F5,\ + CreateDialogIndirectParamW,0x800002B0,\ + CreateDIBPatternBrushPt,0x800003A1,\ + CreateDIBSection,0x8000005A,\ + CreateDirectoryW,0x800000A0,\ + CreateEnhMetaFileW,0x800003BD,\ + CreateEventW,0x800001EF,\ + CreateFileForMapping,0x80000228,\ + CreateFileForMappingW,0x8000048F,\ + CreateFileMappingW,0x80000224,\ + CreateFileW,0x800000A8,\ + CreateFontIndirectW,0x8000037F,\ + CreateIconIndirect,0x800002D3,\ + CreateMenu,0x80000353,\ + CreateMutexW,0x8000022B,\ + CreatePalette,0x800003B3,\ + CreatePatternBrush,0x8000039D,\ + CreatePen,0x8000039E,\ + CreatePenIndirect,0x800003A2,\ + CreatePopupMenu,0x80000354,\ + CreateProcessW,0x800001ED,\ + CreateRectRgn,0x800003D4,\ + CreateRectRgnIndirect,0x800003C9,\ + CreateSolidBrush,0x800003A3,\ + CreateThread,0x800001EC,\ + CreateWindowExW,0x800000F6,\ + DBCanonicalize,0x800000E9,\ + DeactivateDevice,0x8000049C,\ + DebugActiveProcess,0x800001F9,\ + DebugNotify,0x80000282,\ + DefDlgProcW,0x800002B1,\ + DeferWindowPos,0x80000486,\ + DefWindowProcW,0x80000108,\ + DeleteAndRenameFile,0x800000B7,\ + DeleteCriticalSection,0x80000003,\ + DeleteDC,0x8000038F,\ + DeleteEnhMetaFile,0x800003BE,\ + DeleteFileW,0x800000A5,\ + DeleteMenu,0x80000352,\ + DeleteObject,0x80000390,\ + DeleteTrackedItem,0x80000243,\ + DeregisterAFS,0x8000014F,\ + DeregisterAFSName,0x80000153,\ + DeregisterDevice,0x800000EC,\ + DestroyAcceleratorTable,0x8000005D,\ + DestroyCaret,0x80000293,\ + DestroyIcon,0x800002D5,\ + DestroyMenu,0x8000034C,\ + DestroyWindow,0x80000109,\ + DeviceIoControl,0x800000B3,\ + DialogBoxIndirectParamW,0x800002B2,\ + difftime,0x800003EE,\ + DisableCaretSystemWide,0x8000029A,\ + DispatchMessageW,0x8000035B,\ + div,0x800003EF,\ + DrawEdge,0x800003A4,\ + DrawFocusRect,0x800003A5,\ + DrawFrameControl,0x800003DB,\ + DrawIconEx,0x800002D6,\ + DrawMenuBar,0x80000358,\ + DrawTextW,0x800003B1,\ + DumpFileSystemHeap,0x80000155,\ + DumpKCallProfile,0x800001FE,\ + Ellipse,0x800003A6,\ + EmptyClipboard,0x800002A5,\ + EnableCaretSystemWide,0x8000029B,\ + EnableEUDC,0x800003DA,\ + EnableHardwareKeyboard,0x80000339,\ + EnableMenuItem,0x8000034F,\ + EnableWindow,0x8000011F,\ + EndDeferWindowPos,0x80000487,\ + EndDialog,0x800002B3,\ + EndDoc,0x800003BF,\ + EndPage,0x800003C0,\ + EndPaint,0x80000105,\ + EnterCriticalSection,0x80000004,\ + EnumCalendarInfoW,0x800000CE,\ + EnumClipboardFormats,0x800002A3,\ + EnumDateFormatsW,0x800000D0,\ + EnumDevices,0x8000007C,\ + EnumFontFamiliesW,0x800003C5,\ + EnumFontsW,0x800003C6,\ + EnumPnpIds,0x8000007B,\ + EnumSystemCodePagesW,0x800000DC,\ + EnumSystemLocalesW,0x800000DB,\ + EnumTimeFormatsW,0x800000CF,\ + EnumWindows,0x80000123,\ + EqualRect,0x80000061,\ + EqualRgn,0x8000005B,\ + EscapeCommFunction,0x8000006D,\ + EventModify,0x800001EE,\ + ExcludeClipRect,0x800003CA,\ + ExitThread,0x80000006,\ + exp,0x800003F1,\ + ExtEscape,0x8000049E,\ + ExtractIconExW,0x800002D7,\ + ExtractResource,0x8000023D,\ + ExtTextOutW,0x80000380,\ + fabs_,0x800003F2,\ + fclose,0x8000045E,\ + feof,0x80000465,\ + ferror,0x80000466,\ + fflush,0x80000462,\ + fgetc,0x80000454,\ + fgetpos,0x80000468,\ + fgets,0x80000455,\ + fgetwc,0x80000474,\ + fgetws,0x80000477,\ + FileSystemPowerFunction,0x800000F1,\ + FileTimeToLocalFileTime,0x80000015,\ + FileTimeToSystemTime,0x80000014,\ + FillRect,0x800003A7,\ + FillRgn,0x8000039F,\ + FilterTrackedItem,0x80000249,\ + FindClose,0x800000B4,\ + FindFirstFileW,0x800000A7,\ + FindNextFileW,0x800000B5,\ + FindResource,0x80000213,\ + FindResourceW,0x80000214,\ + FindWindowW,0x8000011E,\ + floor,0x800003F5,\ + FlushFileBuffers,0x800000AF,\ + FlushInstructionCache,0x800001FC,\ + FlushViewOfFile,0x80000227,\ + FlushViewOfFileMaybe,0x800004BF,\ + fmod,0x800003F6,\ + FoldStringW,0x800000DA,\ + fopen,0x80000459,\ + ForcePageout,0x8000021C,\ + FormatMessageW,0x800000EA,\ + fprintf,0x8000045B,\ + fputc,0x80000456,\ + fputs,0x80000457,\ + fputwc,0x80000475,\ + fputws,0x80000478,\ + fread,0x80000460,\ + free,0x800003FA,\ + FreeLibrary,0x80000211,\ + FreeLibraryAndExitThread,0x800004C0,\ + frexp,0x800003FB,\ + fscanf,0x8000045A,\ + fseek,0x8000046A,\ + fsetpos,0x80000469,\ + ftell,0x8000046B,\ + fwprintf,0x80000363,\ + fwrite,0x80000461,\ + fwscanf,0x800002DF,\ + GetACP,0x800000BA,\ + GetActiveWindow,0x800002C2,\ + GetAPIAddress,0x80000020,\ + GetAssociatedMenu,0x8000012C,\ + GetAsyncKeyState,0x8000033A,\ + GetAsyncShiftFlags,0x80000342,\ + GetBkColor,0x80000391,\ + GetBkMode,0x80000392,\ + GetCallerProcess,0x8000025F,\ + GetCallerProcessIndex,0x80000281,\ + GetCapture,0x800002C3,\ + GetCaretBlinkTime,0x80000299,\ + GetCaretPos,0x80000297,\ + getchar,0x80000450,\ + GetClassInfoW,0x8000036E,\ + GetClassLong,0x80000371,\ + GetClassLongW,0x8000036F,\ + GetClassNameW,0x8000011B,\ + GetClientRect,0x800000F9,\ + GetClipboardData,0x800002A0,\ + GetClipboardDataAlloc,0x800002A9,\ + GetClipboardFormatNameW,0x800002A4,\ + GetClipboardOwner,0x8000029E,\ + GetClipBox,0x800003CB,\ + GetClipCursor,0x800002DC,\ + GetClipRgn,0x800003CC,\ + GetCommMask,0x8000006E,\ + GetCommModemStatus,0x8000006F,\ + GetCommProperties,0x80000070,\ + GetCommState,0x80000071,\ + GetCommTimeouts,0x80000072,\ + GetCPInfo,0x800000BC,\ + GetCRTFlags,0x800004CC,\ + GetCRTStorageEx,0x800004CB,\ + GetCurrencyFormatW,0x800000CD,\ + GetCurrentFT,0x8000001D,\ + GetCurrentObject,0x80000393,\ + GetCurrentPermissions,0x80000264,\ + GetCursor,0x800002DD,\ + GetCursorPos,0x800002DE,\ + GetDateFormatW,0x800000CB,\ + GetDC,0x80000106,\ + GetDCEx,0x800004A1,\ + GetDeviceCaps,0x80000394,\ + GetDeviceKeys,0x8000007D,\ + GetDialogBaseUnits,0x800002B6,\ + GetDiskFreeSpaceExW,0x800000B8,\ + GetDlgCtrlID,0x800002B5,\ + GetDlgItem,0x800002B4,\ + GetDlgItemInt,0x800002B7,\ + GetDlgItemTextW,0x800002AF,\ + GetDoubleClickTime,0x80000378,\ + GetExitCodeProcess,0x80000207,\ + GetExitCodeThread,0x80000206,\ + GetFileAttributesW,0x800000A6,\ + GetFileInformationByHandle,0x800000AE,\ + GetFileSize,0x800000AC,\ + GetFileTime,0x800000B0,\ + GetFocus,0x800002C1,\ + GetForegroundInfo,0x800004C8,\ + GetForegroundKeyboardTarget,0x800004C9,\ + GetForegroundWindow,0x800002BD,\ + GetFSHeapInfo,0x8000025B,\ + GetHeapSnapshot,0x80000034,\ + GetIdleTime,0x80000260,\ + GetKeyboardLayout,0x800004CD,\ + GetKeyboardLayoutNameW,0x80000488,\ + GetKeyboardStatus,0x8000033B,\ + GetKeyboardTarget,0x800002C7,\ + GetKeyState,0x8000035C,\ + GetKPhys,0x80000245,\ + GetLastError,0x80000204,\ + GetLocaleInfoW,0x800000C8,\ + GetLocalTime,0x80000017,\ + GetMenuItemInfoW,0x80000356,\ + GetMessagePos,0x8000035E,\ + GetMessageSource,0x80000368,\ + GetMessageW,0x8000035D,\ + GetMessageWNoWait,0x8000035F,\ + GetModuleFileNameW,0x80000219,\ + GetModuleHandleW,0x80000499,\ + GetMouseMovePoints,0x80000334,\ + GetNearestColor,0x800003B8,\ + GetNearestPaletteIndex,0x800003B4,\ + GetNextDlgGroupItem,0x800002B9,\ + GetNextDlgTabItem,0x800002B8,\ + GetNumberFormatW,0x800000CC,\ + GetObjectType,0x80000395,\ + GetObjectW,0x80000396,\ + GetOEMCP,0x800000BB,\ + GetOpenClipboardWindow,0x800002A8,\ + GetOpenFileNameW,0x800001E8,\ + GetOwnerProcess,0x8000025E,\ + GetPaletteEntries,0x800003B5,\ + GetParent,0x8000010D,\ + GetPasswordActive,0x800000EF,\ + GetPixel,0x800003A8,\ + GetPriorityClipboardFormat,0x800002A7,\ + GetProcAddrBits,0x8000025A,\ + GetProcAddressW,0x80000212,\ + GetProcessHeap,0x80000032,\ + GetProcessIndexFromID,0x80000280,\ + GetProcessVersion,0x80000218,\ + GetProcFromPtr,0x80000258,\ + GetProcName,0x80000270,\ + GetRealTime,0x8000023A,\ + GetRegionData,0x800003CD,\ + GetRgnBox,0x800003CE,\ + GetRomFileBytes,0x80000240,\ + GetRomFileInfo,0x8000023F,\ + gets,0x80000452,\ + GetSaveFileNameW,0x800001E9,\ + GetScrollInfo,0x8000011A,\ + GetStdioPathW,0x8000047D,\ + GetStockObject,0x80000397,\ + GetStoreInformation,0x80000143,\ + GetStringTypeExW,0x800000D9,\ + GetStringTypeW,0x800000D8,\ + GetSubMenu,0x80000357,\ + GetSysColor,0x80000379,\ + GetSysColorBrush,0x800003A9,\ + GetSystemDefaultLangID,0x800000D3,\ + GetSystemDefaultLCID,0x800000D5,\ + GetSystemInfo,0x8000021E,\ + GetSystemMemoryDivision,0x80000150,\ + GetSystemMetrics,0x80000375,\ + GetSystemPaletteEntries,0x800003B6,\ + GetSystemPowerStatusEx,0x800002CB,\ + GetSystemTime,0x80000019,\ + GetTempPathW,0x800000A2,\ + GetTextColor,0x80000398,\ + GetTextExtentExPointW,0x80000381,\ + GetTextFaceW,0x800003C7,\ + GetTextMetricsW,0x80000382,\ + GetThreadContext,0x8000047C,\ + GetThreadPriority,0x80000203,\ + GetThreadTimes,0x800004A2,\ + GetTickCount,0x80000217,\ + GetTimeFormatW,0x800000CA,\ + GetTimeZoneInformation,0x8000001B,\ + GetUpdateRect,0x80000112,\ + GetUpdateRgn,0x80000111,\ + GetUserDefaultLangID,0x800000D4,\ + GetUserDefaultLCID,0x800000D7,\ + GetVersionEx,0x80000011,\ + GetVersionExW,0x800002CD,\ + getwchar,0x80000470,\ + GetWindow,0x800000FB,\ + GetWindowDC,0x8000010E,\ + GetWindowLongW,0x80000103,\ + GetWindowRect,0x800000F8,\ + GetWindowTextLengthW,0x80000114,\ + GetWindowTextW,0x80000101,\ + GetWindowThreadProcessId,0x80000124,\ + GiveKPhys,0x80000246,\ + GlobalMemoryStatus,0x80000058,\ + GwesPowerOffSystem,0x80000128,\ + HeapAlloc,0x8000002E,\ + HeapCreate,0x8000002C,\ + HeapDestroy,0x8000002D,\ + HeapFree,0x80000031,\ + HeapReAlloc,0x8000002F,\ + HeapSize,0x80000030,\ + HeapValidate,0x80000033,\ + HideCaret,0x80000294,\ + ImageList_Add,0x800002E2,\ + ImageList_AddMasked,0x800002E3,\ + ImageList_BeginDrag,0x800002E4,\ + ImageList_Copy,0x800002FF,\ + ImageList_CopyDitherImage,0x800002E5,\ + ImageList_Create,0x800002E6,\ + ImageList_Destroy,0x800002E7,\ + ImageList_DragEnter,0x800002E8,\ + ImageList_DragLeave,0x800002E9,\ + ImageList_DragMove,0x800002EA,\ + ImageList_DragShowNolock,0x800002EB,\ + ImageList_Draw,0x800002EC,\ + ImageList_DrawEx,0x800002ED,\ + ImageList_DrawIndirect,0x800002EE,\ + ImageList_Duplicate,0x80000300,\ + ImageList_EndDrag,0x800002EF,\ + ImageList_GetBkColor,0x800002F0,\ + ImageList_GetDragImage,0x800002F1,\ + ImageList_GetIcon,0x800002F2,\ + ImageList_GetIconSize,0x800002F3,\ + ImageList_GetImageCount,0x800002F4,\ + ImageList_GetImageInfo,0x800002F5,\ + ImageList_LoadImage,0x800002F6,\ + ImageList_Merge,0x800002F7,\ + ImageList_Remove,0x800002F8,\ + ImageList_Replace,0x800002F9,\ + ImageList_ReplaceIcon,0x800002FA,\ + ImageList_SetBkColor,0x800002FB,\ + ImageList_SetDragCursorImage,0x800002FC,\ + ImageList_SetIconSize,0x800002FD,\ + ImageList_SetImageCount,0x80000301,\ + ImageList_SetOverlayImage,0x800002FE,\ + ImmAssociateContext,0x80000302,\ + ImmAssociateContextEx,0x800004B5,\ + ImmConfigureIMEW,0x80000303,\ + ImmCreateContext,0x800004AE,\ + ImmCreateIMCC,0x80000304,\ + ImmDestroyContext,0x800004AF,\ + ImmDestroyIMCC,0x80000305,\ + ImmDisableIME,0x800004B6,\ + ImmEnumRegisterWordW,0x80000306,\ + ImmEscapeW,0x80000307,\ + ImmGenerateMessage,0x80000308,\ + ImmGetCandidateListCountW,0x8000030A,\ + ImmGetCandidateListW,0x80000309,\ + ImmGetCandidateWindow,0x8000030B,\ + ImmGetCompositionFontW,0x8000030C,\ + ImmGetCompositionStringW,0x8000030D,\ + ImmGetCompositionWindow,0x8000030E,\ + ImmGetContext,0x8000030F,\ + ImmGetConversionListW,0x80000310,\ + ImmGetConversionStatus,0x80000311,\ + ImmGetDefaultIMEWnd,0x80000312,\ + ImmGetDescriptionW,0x80000313,\ + ImmGetGuideLineW,0x80000314,\ + ImmGetHotKey,0x8000032D,\ + ImmGetIMCCLockCount,0x80000315,\ + ImmGetIMCCSize,0x80000316,\ + ImmGetIMCLockCount,0x80000317,\ + ImmGetIMEFileNameW,0x800004B7,\ + ImmGetImeMenuItemsW,0x800004BB,\ + ImmGetOpenStatus,0x80000318,\ + ImmGetProperty,0x80000319,\ + ImmGetRegisterWordStyleW,0x8000031A,\ + ImmGetStatusWindowPos,0x800004B0,\ + ImmGetVirtualKey,0x800004BA,\ + ImmIsIME,0x800004B9,\ + ImmIsUIMessageW,0x8000031C,\ + ImmLockIMC,0x8000031D,\ + ImmLockIMCC,0x8000031E,\ + ImmNotifyIME,0x80000320,\ + ImmRegisterWordW,0x80000322,\ + ImmReleaseContext,0x80000323,\ + ImmRequestMessageW,0x800004DA,\ + ImmReSizeIMCC,0x80000321,\ + ImmSetCandidateWindow,0x80000327,\ + ImmSetCompositionFontW,0x80000328,\ + ImmSetCompositionStringW,0x80000329,\ + ImmSetCompositionWindow,0x8000032A,\ + ImmSetConversionStatus,0x8000032B,\ + ImmSetHotKey,0x8000032C,\ + ImmSetImeWndIMC,0x800004C6,\ + ImmSetOpenStatus,0x8000032E,\ + ImmSetStatusWindowPos,0x8000032F,\ + ImmSimulateHotKey,0x80000330,\ + ImmSIPanelState,0x80000324,\ + ImmUnlockIMC,0x80000331,\ + ImmUnlockIMCC,0x80000332,\ + ImmUnregisterWordW,0x80000333,\ + InflateRect,0x80000062,\ + InitializeCriticalSection,0x80000002,\ + InitLocale,0x80000008,\ + InputDebugCharW,0x80000253,\ + InsertMenuW,0x80000349,\ + InterlockedDecrement,0x8000000B,\ + InterlockedExchange,0x8000000C,\ + InterlockedIncrement,0x8000000A,\ + InterlockedTestExchange,0x80000009,\ + InterruptDisable,0x80000275,\ + InterruptDone,0x80000274,\ + InterruptInitialize,0x80000273,\ + IntersectClipRect,0x800003CF,\ + IntersectRect,0x80000063,\ + InvalidateRect,0x800000FA,\ + IsAPIReady,0x8000001E,\ + IsBadCodePtr,0x80000209,\ + IsBadPtr,0x80000259,\ + IsBadReadPtr,0x8000020A,\ + IsBadWritePtr,0x8000020B,\ + IsChild,0x80000115,\ + IsClipboardFormatAvailable,0x800002A6,\ + IsDBCSLeadByte,0x800000BF,\ + IsDBCSLeadByteEx,0x800000C0,\ + IsDialogMessageW,0x800002BA,\ + IsExiting,0x8000009F,\ + IsPrimaryThread,0x80000262,\ + IsProcessDying,0x800004BD,\ + IsRectEmpty,0x80000064,\ + IsValidCodePage,0x800000B9,\ + IsValidLocale,0x800000D1,\ + iswctype,0x800000C1,\ + IsWindow,0x8000010F,\ + IsWindowEnabled,0x80000120,\ + IsWindowVisible,0x80000376,\ + KernelIoControl,0x8000022D,\ + KernExtractIcons,0x8000023E,\ + keybd_event,0x80000341,\ + KeybdGetDeviceInfo,0x8000033C,\ + KeybdInitStates,0x8000033D,\ + KeybdVKeyToUnicode,0x8000033E,\ + KillAllOtherThreads,0x8000025D,\ + KillTimer,0x8000036C,\ + labs,0x80000406,\ + LCMapStringW,0x800000C7,\ + ldexp,0x80000407,\ + ldiv,0x80000408,\ + LeaveCriticalSection,0x80000005,\ + LeaveCritSec,0x80000255,\ + lineAddProvider,0x80000177,\ + lineClose,0x80000166,\ + lineConfigDialogEdit,0x80000176,\ + lineDeallocateCall,0x80000167,\ + lineDrop,0x80000168,\ + lineGetDevCaps,0x80000169,\ + lineGetDevConfig,0x8000016A,\ + lineGetID,0x80000174,\ + lineGetTranslateCaps,0x8000016B,\ + lineInitialize,0x8000016C,\ + lineMakeCall,0x8000016D,\ + lineNegotiateAPIVersion,0x8000016E,\ + lineOpen,0x8000016F,\ + lineSetCurrentLocation,0x80000490,\ + lineSetDevConfig,0x80000170,\ + lineSetStatusMessages,0x80000171,\ + lineShutdown,0x80000172,\ + lineTranslateAddress,0x80000173,\ + lineTranslateDialog,0x80000175,\ + LoadAcceleratorsW,0x8000005E,\ + LoadBitmapW,0x80000369,\ + LoadCursorW,0x800002AB,\ + LoadDriver,0x80000272,\ + LoadFSD,0x800000ED,\ + LoadIconW,0x800002D8,\ + LoadImageW,0x800002DA,\ + LoadLibraryW,0x80000210,\ + LoadMenuW,0x8000034E,\ + LoadResource,0x80000215,\ + LoadStringW,0x8000036A,\ + LocalAlloc,0x80000021,\ + LocalAllocInProcess,0x80000029,\ + LocalFileTimeToFileTime,0x80000016,\ + LocalFree,0x80000024,\ + LocalFreeInProcess,0x8000002A,\ + LocalReAlloc,0x80000022,\ + LocalSize,0x80000023,\ + LocalSizeInProcess,0x8000002B,\ + LockPages,0x80000489,\ + log,0x80000409,\ + log10,0x8000040A,\ + longjmp,0x8000040C,\ + lstrcmpiW,0x800000E4,\ + lstrcmpW,0x800000E3,\ + MainThreadBaseFunc,0x8000000E,\ + malloc,0x80000411,\ + MapDialogRect,0x800002BB,\ + MapPtrToProcess,0x80000256,\ + MapPtrUnsecure,0x80000257,\ + MapUncompressedFileW,0x8000022A,\ + MapViewOfFile,0x80000225,\ + MapVirtualKeyW,0x8000033F,\ + MapWindowPoints,0x8000011C,\ + MaskBlt,0x80000388,\ + mbstowcs,0x8000004C,\ + memchr,0x8000001F,\ + memcmp,0x80000413,\ + memcpy,0x80000414,\ + memmove,0x80000416,\ + memset,0x80000417,\ + MessageBeep,0x80000359,\ + MessageBoxW,0x8000035A,\ + modf,0x80000418,\ + mouse_event,0x80000338,\ + MoveFileW,0x800000A3,\ + MoveWindow,0x80000110,\ + MsgWaitForMultipleObjectsEx,0x80000367,\ + MultiByteToWideChar,0x800000C4,\ + NKDbgPrintfW,0x80000221,\ + NKTerminateThread,0x8000026F,\ + NKvDbgPrintfW,0x80000238,\ + NLedGetDeviceInfo,0x80000347,\ + NLedSetDevice,0x80000348,\ + NotifyForceCleanboot,0x80000201,\ + NotifyWinUserSystem,0x800002CC,\ + OffsetRect,0x80000065,\ + OffsetRgn,0x800003D0,\ + OpenClipboard,0x8000029C,\ + OpenProcess,0x800001FD,\ + OtherThreadsRunning,0x8000025C,\ + OutputDebugStringW,0x8000021D,\ + PatBlt,0x800003AA,\ + PeekMessageW,0x80000360,\ + PegClearUserNotification,0x800001D4,\ + PegCreateDatabase,0x80000130,\ + PegDeleteDatabase,0x80000133,\ + PegDeleteRecord,0x80000135,\ + PegFindFirstDatabase,0x8000012E,\ + PegFindNextDatabase,0x8000012F,\ + PegGetUserNotificationPreferences,0x800001D8,\ + PegHandleAppNotifications,0x800001D7,\ + PegOidGetInfo,0x8000012D,\ + PegOpenDatabase,0x80000132,\ + PegReadRecordProps,0x80000136,\ + PegRemoveFontResource,0x80000383,\ + PegRunAppAtEvent,0x800001D6,\ + PegRunAppAtTime,0x800001D5,\ + PegSeekDatabase,0x80000134,\ + PegSetDatabaseInfo,0x80000131,\ + PegSetUserNotification,0x800001D3,\ + PegWriteRecordProps,0x80000137,\ + PlayEnhMetaFile,0x800003C1,\ + PlaySoundW,0x8000017A,\ + Polygon,0x800003AB,\ + Polyline,0x800003AC,\ + PostKeybdMessage,0x80000340,\ + PostMessageW,0x80000361,\ + PostQuitMessage,0x80000362,\ + PostThreadMessageW,0x80000122,\ + pow,0x8000041B,\ + PowerOffSystem,0x80000269,\ + PPSHRestart,0x8000027E,\ + printf,0x8000044E,\ + PrintTrackedItem,0x80000244,\ + ProcessDetachAllDLLs,0x8000023C,\ + ProfileStart,0x80000052,\ + ProfileStop,0x80000053,\ + ProfileSyscall,0x80000239,\ + PSLNotify,0x80000007,\ + PtInRect,0x80000066,\ + PtInRegion,0x800003D1,\ + PurgeComm,0x80000073,\ + putchar,0x80000451,\ + puts,0x80000453,\ + putwchar,0x80000471,\ + QASetWindowsJournalHook,0x80000335,\ + QAUnhookWindowsJournalHook,0x80000336,\ + qsort,0x8000041C,\ + QueryAPISetID,0x800001EA,\ + QueryPerformanceCounter,0x8000021A,\ + QueryPerformanceFrequency,0x8000021B,\ + RaiseException,0x8000021F,\ + rand,0x8000041D,\ + Random,0x80000050,\ + RasDeleteEntry,0x8000015F,\ + RasDial,0x80000156,\ + RasEnumConnections,0x80000161,\ + RasEnumEntries,0x80000159,\ + RasGetConnectStatus,0x80000162,\ + RasGetEntryDevConfig,0x80000163,\ + RasGetEntryDialParams,0x8000015A,\ + RasGetEntryProperties,0x8000015C,\ + RasHangup,0x80000157,\ + RasHangUp,0x80000158,\ + RasIOControl,0x80000165,\ + RasRenameEntry,0x80000160,\ + RasSetEntryDevConfig,0x80000164,\ + RasSetEntryDialParams,0x8000015B,\ + RasSetEntryProperties,0x8000015D,\ + RasValidateEntryName,0x8000015E,\ + ReadFile,0x800000AA,\ + ReadFileWithSeek,0x800000F3,\ + ReadProcessMemory,0x800001FA,\ + ReadRegistryFromOEM,0x80000481,\ + RealizePalette,0x800003B9,\ + realloc,0x8000041E,\ + Rectangle,0x800003AD,\ + RectangleAnimation,0x80000126,\ + RectInRegion,0x800003D2,\ + RectVisible,0x800003D5,\ + RefreshKernelAlarm,0x8000024B,\ + RegCloseKey,0x800001C7,\ + RegCopyFile,0x800001D1,\ + RegCreateKeyExW,0x800001C8,\ + RegDeleteKeyW,0x800001C9,\ + RegDeleteValueW,0x800001CA,\ + RegEnumKeyExW,0x800001CC,\ + RegEnumValueW,0x800001CB,\ + RegFlushKey,0x80000480,\ + RegisterAFS,0x8000014D,\ + RegisterAFSName,0x80000152,\ + RegisterAPISet,0x8000027B,\ + RegisterClassW,0x8000005F,\ + RegisterClassWStub,0x80000373,\ + RegisterClipboardFormatW,0x800002A1,\ + RegisterDbgZones,0x80000222,\ + RegisterDevice,0x800000EB,\ + RegisterHiddenAFS,0x8000014E,\ + RegisterHotKey,0x80000343,\ + RegisterSIPanel,0x80000125,\ + RegisterTaskBar,0x8000037C,\ + RegisterTrackedItem,0x80000248,\ + RegisterWindowMessageW,0x8000037B,\ + RegOpenKeyExW,0x800001CD,\ + RegQueryInfoKeyW,0x800001CE,\ + RegQueryValueExW,0x800001CF,\ + RegRestoreFile,0x800001D2,\ + RegSetValueExW,0x800001D0,\ + ReleaseCapture,0x800002C5,\ + ReleaseDC,0x80000107,\ + ReleaseMutex,0x8000022C,\ + RemoteLocalAlloc,0x80000025,\ + RemoteLocalFree,0x80000028,\ + RemoteLocalReAlloc,0x80000026,\ + RemoteLocalSize,0x80000027,\ + RemoveDirectoryW,0x800000A1,\ + RemoveFontResourceW,0x80000384,\ + RemoveMenu,0x8000034B,\ + RestoreDC,0x8000038B,\ + ResumeThread,0x800001F4,\ + RoundRect,0x800003AE,\ + SaveDC,0x8000038C,\ + scanf,0x8000044D,\ + ScreenToClient,0x800000FF,\ + ScrollDC,0x800003D9,\ + ScrollWindowEx,0x80000121,\ + SelectClipRgn,0x800003D3,\ + SelectObject,0x80000399,\ + SelectPalette,0x800003BA,\ + SendDlgItemMessageW,0x800002AD,\ + SendInput,0x80000337,\ + SendMessageW,0x80000364,\ + SendNotifyMessageW,0x80000365,\ + SetAbortProc,0x800003C2,\ + SetACP,0x800000BD,\ + SetActiveWindow,0x800002BF,\ + SetAssociatedMenu,0x8000012B,\ + SetBkColor,0x8000039A,\ + SetBkMode,0x8000039B,\ + SetBrushOrgEx,0x800003AF,\ + SetCapture,0x800002C4,\ + SetCaretBlinkTime,0x80000298,\ + SetCaretPos,0x80000296,\ + SetClassLong,0x80000372,\ + SetClassLongW,0x80000370,\ + SetCleanRebootFlag,0x80000267,\ + SetClipboardData,0x8000029F,\ + SetCommBreak,0x80000074,\ + SetCommMask,0x80000075,\ + SetCommState,0x80000076,\ + SetCommTimeouts,0x80000077,\ + SetCursor,0x800002AA,\ + SetCursorPos,0x800002E0,\ + SetDaylightTime,0x80000223,\ + SetDbgZone,0x8000026A,\ + SetDlgItemInt,0x800002BC,\ + SetDlgItemTextW,0x800002AE,\ + SetEndOfFile,0x800000B2,\ + SetExceptionHandler,0x80000247,\ + SetFileAttributesW,0x800000A9,\ + SetFilePointer,0x800000AD,\ + SetFileTime,0x800000B1,\ + SetFocus,0x800002C0,\ + SetForegroundWindow,0x800002BE,\ + SetGwesHeapMark,0x80000265,\ + SetGwesOOMEvent,0x8000024E,\ + SetGwesPowerHandler,0x80000278,\ + SetHandleOwner,0x80000271,\ + SetHardwareWatch,0x8000027A,\ + SetInterruptEvent,0x8000009E,\ + setjmp,0x80000806,\ + SetKernelAlarm,0x8000024A,\ + SetKeyboardTarget,0x800002C6,\ + SetKMode,0x80000276,\ + SetLastError,0x80000205,\ + SetLocaleInfoW,0x800000C9,\ + SetLocalTime,0x80000018,\ + SetLowestScheduledPriority,0x80000261,\ + SetMenuItemInfoW,0x80000355,\ + SetObjectOwner,0x800003D8,\ + SetOEMCP,0x800000BE,\ + SetPaletteEntries,0x800003B7,\ + SetParent,0x8000010C,\ + SetPassword,0x800000EE,\ + SetPasswordActive,0x800000F0,\ + SetPFHandle,0x8000024C,\ + SetPixel,0x800003B0,\ + SetPowerOffHandler,0x80000277,\ + SetProcPermissions,0x80000263,\ + SetRealTime,0x8000023B,\ + SetRect,0x80000067,\ + SetRectEmpty,0x80000068,\ + SetRectRgn,0x800003D6,\ + SetROP2,0x800003A0,\ + SetScrollInfo,0x80000117,\ + SetScrollPos,0x80000118,\ + SetScrollRange,0x80000119,\ + SetStdioPathW,0x8000047E,\ + SetSysColors,0x8000037A,\ + SetSystemDefaultLCID,0x800000D6,\ + SetSystemMemoryDivision,0x80000151,\ + SetSystemTime,0x8000001A,\ + SetTextColor,0x8000039C,\ + SetThreadContext,0x800001F6,\ + SetThreadPriority,0x80000202,\ + SetTimer,0x8000036B,\ + SetTimeZoneBias,0x80000266,\ + SetTimeZoneInformation,0x8000001C,\ + SetupComm,0x80000078,\ + SetViewportOrgEx,0x800003D7,\ + SetWDevicePowerHandler,0x8000049A,\ + SetWindowLongW,0x80000102,\ + SetWindowPos,0x800000F7,\ + SetWindowsHookExW,0x800004B2,\ + SetWindowTextW,0x80000100,\ + SHAddToRecentDocs,0x800001E3,\ + SHCreateExplorerInstance,0x8000048B,\ + SHCreateShortcut,0x800001E4,\ + Shell_NotifyIcon,0x800001E1,\ + ShellExecuteEx,0x800001E0,\ + ShellModalEnd,0x800002C8,\ + SHGetFileInfo,0x800001E2,\ + SHGetShortcutTarget,0x800001E5,\ + SHLoadDIBitmap,0x800001E7,\ + ShowCaret,0x80000295,\ + ShowCursor,0x800002E1,\ + ShowWindow,0x8000010A,\ + SHShowOutOfMemory,0x800001E6,\ + SignalStarted,0x8000027F,\ + sin,0x80000422,\ + sinh,0x80000423,\ + SizeofResource,0x80000216,\ + Sleep,0x800001F0,\ + sndPlaySoundW,0x80000179,\ + sprintf,0x800002CF,\ + sqrt,0x80000424,\ + srand,0x80000425,\ + sscanf,0x8000028D,\ + StartDocW,0x800003C3,\ + StartPage,0x800003C4,\ + strcat,0x80000427,\ + strchr,0x80000428,\ + strcmp,0x80000429,\ + strcpy,0x8000042A,\ + strcspn,0x8000042B,\ + StretchBlt,0x80000389,\ + StringCompress,0x8000024F,\ + StringDecompress,0x80000250,\ + strlen,0x8000042C,\ + strncat,0x8000042D,\ + strncmp,0x8000042E,\ + strncpy,0x8000042F,\ + strstr,0x80000430,\ + strtok,0x80000431,\ + SubtractRect,0x80000069,\ + SuspendThread,0x800001F3,\ + swprintf,0x80000449,\ + swscanf,0x8000044A,\ + SystemIdleTimerReset,0x80000345,\ + SystemMemoryLow,0x800002D0,\ + SystemParametersInfoW,0x80000059,\ + SystemStarted,0x80000001,\ + SystemTimeToFileTime,0x80000013,\ + TakeCritSec,0x80000254,\ + tan,0x80000433,\ + tanh,0x80000434,\ + TerminateProcess,0x80000220,\ + TerminateThread,0x800001EB,\ + THCreateSnapshot,0x800001FF,\ + THGrow,0x80000200,\ + ThisIsGwes,0x80000035,\ + ThreadAttachAllDLLs,0x80000231,\ + ThreadBaseFunc,0x8000000D,\ + ThreadDetachAllDLLs,0x80000232,\ + TlsCall,0x80000208,\ + TlsGetValue,0x8000000F,\ + TlsSetValue,0x80000010,\ + tolower,0x80000442,\ + TouchCalibrate,0x8000036D,\ + toupper,0x80000443,\ + towlower,0x800000C2,\ + towupper,0x800000C3,\ + TrackPopupMenuEx,0x8000034D,\ + TranslateAcceleratorW,0x80000346,\ + TranslateCharsetInfo,0x8000048E,\ + TranslateMessage,0x80000366,\ + TransmitCommChar,0x80000079,\ + TransparentImage,0x8000038A,\ + TurnOffProfiling,0x8000026C,\ + TurnOffSyscallProfiling,0x8000026E,\ + TurnOnProfiling,0x8000026B,\ + TurnOnSyscallProfiling,0x8000026D,\ + U_rclose,0x80000237,\ + U_rlseek,0x80000236,\ + U_ropen,0x80000233,\ + U_rread,0x80000234,\ + U_rwrite,0x80000235,\ + ungetc,0x80000458,\ + ungetwc,0x80000476,\ + UnhookWindowsHookEx,0x800004B3,\ + UnionRect,0x8000006A,\ + UnlockPages,0x8000048A,\ + UnmapViewOfFile,0x80000226,\ + UnregisterClassW,0x80000374,\ + UnregisterFunc1,0x80000484,\ + UnregisterHotKey,0x80000344,\ + UpdateWindow,0x8000010B,\ + ValidateRect,0x80000116,\ + VerifyAPIHandle,0x8000027D,\ + vfprintf,0x8000045C,\ + vfwprintf,0x800002D1,\ + VirtualAlloc,0x8000020C,\ + VirtualCopy,0x80000230,\ + VirtualFree,0x8000020D,\ + VirtualProtect,0x8000020E,\ + VirtualQuery,0x8000020F,\ + vprintf,0x8000044F,\ + vsprintf,0x8000047A,\ + vswprintf,0x8000044B,\ + vwprintf,0x8000046F,\ + WaitCommEvent,0x8000007A,\ + WaitForDebugEvent,0x800001F7,\ + WaitForMultipleObjects,0x800001F2,\ + WaitForSingleObject,0x800001F1,\ + waveInAddBuffer,0x80000196,\ + waveInClose,0x80000193,\ + waveInGetDevCaps,0x80000191,\ + waveInGetErrorText,0x80000192,\ + waveInGetID,0x8000019B,\ + waveInGetNumDevs,0x80000190,\ + waveInGetPosition,0x8000019A,\ + waveInMessage,0x8000019C,\ + waveInOpen,0x8000019D,\ + waveInPrepareHeader,0x80000194,\ + waveInReset,0x80000199,\ + waveInStart,0x80000197,\ + waveInStop,0x80000198,\ + waveInUnprepareHeader,0x80000195,\ + waveOutBreakLoop,0x80000187,\ + waveOutClose,0x80000180,\ + waveOutGetDevCaps,0x8000017C,\ + waveOutGetErrorText,0x8000017F,\ + waveOutGetID,0x8000018D,\ + waveOutGetNumDevs,0x8000017B,\ + waveOutGetPitch,0x80000189,\ + waveOutGetPlaybackRate,0x8000018B,\ + waveOutGetPosition,0x80000188,\ + waveOutGetVolume,0x8000017D,\ + waveOutMessage,0x8000018E,\ + waveOutOpen,0x8000018F,\ + waveOutPause,0x80000184,\ + waveOutPrepareHeader,0x80000181,\ + waveOutReset,0x80000186,\ + waveOutRestart,0x80000185,\ + waveOutSetPitch,0x8000018A,\ + waveOutSetPlaybackRate,0x8000018C,\ + waveOutSetVolume,0x8000017E,\ + waveOutUnprepareHeader,0x80000182,\ + waveOutWrite,0x80000183,\ + wcscat,0x8000003A,\ + wcschr,0x8000003B,\ + wcscmp,0x8000003C,\ + wcscpy,0x8000003D,\ + wcscspn,0x8000003E,\ + wcslen,0x8000003F,\ + wcsncat,0x80000040,\ + wcsncmp,0x80000041,\ + wcsncpy,0x80000042,\ + wcspbrk,0x80000044,\ + wcsrchr,0x80000045,\ + wcsspn,0x80000048,\ + wcsstr,0x80000049,\ + wcstod,0x80000439,\ + wcstok,0x8000004D,\ + wcstol,0x8000043A,\ + wcstombs,0x8000004B,\ + wcstoul,0x8000043B,\ + WideCharToMultiByte,0x800000C5,\ + WindowFromPoint,0x800000FC,\ + WNetAddConnection3W,0x800001BC,\ + WNetCancelConnection2W,0x800001BD,\ + WNetCloseEnum,0x800001C5,\ + WNetConnectionDialog1W,0x800001BE,\ + WNetDisconnectDialog,0x800001BF,\ + WNetDisconnectDialog1W,0x800001C0,\ + WNetEnumResourceW,0x800001C6,\ + WNetGetConnectionW,0x800001C1,\ + WNetGetUniversalNameW,0x800001C2,\ + WNetGetUserW,0x800001C3,\ + WNetOpenEnumW,0x800001C4,\ + wprintf,0x8000046E,\ + WriteDebugLED,0x80000483,\ + WriteFile,0x800000AB,\ + WriteFileWithSeek,0x800002CE,\ + WriteProcessMemory,0x800001FB,\ + WriteRegistryToOEM,0x80000482,\ + wscanf,0x8000046D,\ + wsprintfW,0x80000038,\ + wvsprintfW,0x80000039 diff --git a/include/macro/armlitrl.inc b/include/macro/armlitrl.inc new file mode 100644 index 0000000..7ed58c2 --- /dev/null +++ b/include/macro/armlitrl.inc @@ -0,0 +1,223 @@ +;FASMARM extension macros: +; +;Macros for using large constants directly with data processing and memory instructions +; +;Access to the macros is always with the first three characters as uppercase. +;This is necessary to prevent excess memory usage with normal instructions not requiring this functionality. +; +;NOTE: these macro use R12 (ip) for intermediate values. Don't rely on R12 being preserved. +; +;These macros are NOT compatible with thumb mode +; +;These macros allow you to do things like this: +; +;ADDne r11,r2,0x12345678 ;compiles to "ldrne r11,[pc,..lit?0]" and "addne r11,r2,r11" with "..lit?0 dw 0x12345678" +;ADD r11,r11,0x12345678 ;compiles to "ldr r12,[pc,..lit?0]" and "add r11,r11,r12" +;LDRhi r0,[r0,-0x12345678] ;compiles to "ldrhi r12,[pc,..lit?0]" and "ldrhi r0,[r0,-r12]" +;STRb r0,[r3,0xcc000000] ;compiles to "mov r12,0xcc000000" and "strb r0,[r3,r12]" +;CMP r2,0x101 ;compiles to "ldr r12,[pc,..lit?1]" and "cmp r2,r12" with "..lit?1 dw 0x101" +;CMP r2,0x100 ;compiles to "cmp r2,0x100" +; +;Notice that the allocation of literals is optimised to reuse values where possible and only allocated when necessary. +; +;You will need to periodically dump the literals to the output before the labels get more than 4Kbytes distant +;from the source instruction. Generally you can do this after an unconditional branch, and usually at the +;end of a procedure. Simply dump at an appropriate place with "literals". +; +;These macros will correctly handle any ARM format the assembler can handle, so you could do all your code by using +;these macros, but this can create excessive demands on memory and increases compilation time. These macros are +;especially useful where you might use symbolic constants and not be sure of the required size. Just put the base +;instruction in uppercase and let the macros decide the best encoding for you. +; +;The PROCAPS.INC macros have ben designed to use these macros also. When you include this file along with PROCAPS.INC +;then they will cooperate to produce easy to program and also optimised output for your project. +; +;By default this file is included from "WINCEX.INC". + +macro make_dp_instr instr,suffix,regs,flag { + irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo \{ + match inst,instr\#cond\#suffix\\{ + macro inst regs,[arg] \\\{ + \\\common + \\\local encoding,..lit,z,c,..pc,arg_pc + if ~ defined encoding | encoding <> 0xf7ffffff + inst regs,arg + load encoding word from $-4 + else + ..pc=$ + match billg =$ lots,:arg: \\\\{match :a:,billg\\\\#..pc\\\\#lots \\\\\{arg_pc equ a\\\\\}\\\\} + match =arg_pc,arg_pc \\\\{arg_pc equ arg\\\\} + match ra=,rb:ld,regs:ldr\#cond \\\\{ + match =pc,rb\\\\\{arg_pc equ arg_pc-4\\\\\} + match =r15,rb\\\\\{arg_pc equ arg_pc-4\\\\\} + if ra eq rb + if ra eq ip + halt ;cannot use ip,ip,large constant + end if + ld ip,[pc,..lit-$-8] + inst regs,ip + else + ld ra,[pc,..lit-$-8] + inst regs,ra + end if + \\\\} + match =0:ld,flag:ldr\#cond \\\\{ + ld ip,[pc,..lit-$-8] + instr regs,ip + \\\\} + match =1:ld,flag:ldr\#cond \\\\{ + ld regs,[pc,..lit-$-8] + \\\\} + if arg eqtype 0 + virtual + dW arg_pc + load c word from $-4 + end virtual + repeat 17 + if %=17 + encoding=0xf7ffffff + break + end if + if (c shl(%*2-2))or(c shr(34-%*2))and 0xffffff00=0 + encoding=0 + break + end if + end repeat + end if + macro z \\\\{ + if defined encoding & encoding = 0xf7ffffff + literal@found=0 + repeat ($-literals@start)/4 + load literal@value word from literals@start+(%-1)*4 + if literal@value=c + label ..lit word at literals@start+(%-1)*4 + literal@found=1 + break + end if + end repeat + if ~ literal@found + ..lit dW arg_pc + end if + end if + \\\\} + literal@words equ literal@words,z + end if + \\\} + \\} + \} +} + +irps instr,ADC ADD AND BIC EOR ORR RSB RSC SBC SUB { + make_dp_instr instr,, + make_dp_instr instr,s, +} +irps instr,CMN CMP TST TEQ { + make_dp_instr instr,,rn,0 +} +irps instr,MOV MVN { + make_dp_instr instr,,rd,1 + make_dp_instr instr,s,rd,1 +} +purge make_dp_instr + +macro make_mem_instr instr,suffix,limit { + irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo \{ + match inst,instr\#cond\#suffix\\{ + macro inst reg,[arg] \\\{ + \\\common + \\\local off,pre,rn,bru,minus + minus equ + off equ + match [r=,o],arg \\\\{ + rn equ r + bru equ + off equ o + pre equ 1 + \\\\} + match [r=,o]=!,arg \\\\{ + rn equ r + bru equ ! + off equ o + pre equ 1 + \\\\} + match [r]=,o,arg \\\\{ + rn equ r + off equ o + pre equ 0 + \\\\} + match ,off \\\\{ + inst reg,arg + \\\\} + match val:mv,off:MOV\#cond \\\\{ + if off eqtype 0 + if off>=limit | off<=-limit + match -o,off\\\\\{ + off equ o + minus equ - + \\\\\} + mv ip,off + match =1,pre\\\\\{inst reg,[rn,minus ip]bru\\\\\} + match =0,pre\\\\\{inst reg,[rn],minus ip\\\\\} + else + inst reg,arg + end if + else + inst reg,arg + end if + \\\\} + \\\} + \\} + \} +} +irps instr,LDR STR { + make_mem_instr instr,,4096 + make_mem_instr instr,b,4096 + make_mem_instr instr,bt,4096 + make_mem_instr instr,t,4096 + make_mem_instr instr,h,256 + make_mem_instr instr,d,256 +} +make_mem_instr LDR,sh,256 +make_mem_instr LDR,sb,256 + +purge make_mem_instr + +macro def_astring labl,[string] { + common + local ..db,z + labl=..db + macro z \{ + if defined labl + ..db dB string + end if + \} + literal@astrings equ literal@astrings,z +} + +macro def_ustring labl,[string] { + common + local ..du,z + labl=..du + macro z \{ + if defined labl + align 2 + ..du dU string + end if + \} + literal@ustrings equ literal@ustrings,z +} + +literal@words equ align 4,literals@start=$ +literal@ustrings equ align 2 +literal@astrings equ align 1 + +macro literals { + match j,literal@words,literal@ustrings,literal@astrings\{ + irp i,j\\{ + i + \\} + \} + literal@words equ align 4,literals@start=$ + literal@ustrings equ align 2 + literal@astrings equ align 1 +} diff --git a/include/macro/armresrc.inc b/include/macro/armresrc.inc new file mode 100644 index 0000000..2c5028c --- /dev/null +++ b/include/macro/armresrc.inc @@ -0,0 +1,19 @@ + +;Macroinstructions for making resources for WinCE with FASMARM +;By default this file is included from "WINCE.INC". + + dq fix dd + dd fix dw + dw fix dh + rq fix rd + rd fix rw + rw fix rh + + include 'macro\resource.inc' + + rw fix rw + rd fix rd + rq fix rq + dw fix dw + dd fix dd + dq fix dq diff --git a/include/macro/armstruc.inc b/include/macro/armstruc.inc new file mode 100644 index 0000000..b98956f --- /dev/null +++ b/include/macro/armstruc.inc @@ -0,0 +1,199 @@ + +;Macroinstructions for defining data structures with FASMARM +;By default this file is included from "WINCE.INC". + +macro struct name + { fields@struct equ name + match child parent, name \{ fields@struct equ child,fields@\#parent \} + sub@struct equ + struc db [val] \{ \common define field@struct .,db, + fields@struct equ fields@struct,field@struct \} + struc dh [val] \{ \common define field@struct .,dh, + fields@struct equ fields@struct,field@struct \} + struc du [val] \{ \common define field@struct .,du, + fields@struct equ fields@struct,field@struct \} + struc dw [val] \{ \common define field@struct .,dw, + fields@struct equ fields@struct,field@struct \} + struc dd [val] \{ \common define field@struct .,dd, + fields@struct equ fields@struct,field@struct \} + struc rb count \{ define field@struct .,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rh count \{ define field@struct .,dh,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rw count \{ define field@struct .,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + struc rd count \{ define field@struct .,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro db [val] \{ \common \local anonymous + define field@struct anonymous,db, + fields@struct equ fields@struct,field@struct \} + macro dh [val] \{ \common \local anonymous + define field@struct anonymous,dh, + fields@struct equ fields@struct,field@struct \} + macro du [val] \{ \common \local anonymous + define field@struct anonymous,du, + fields@struct equ fields@struct,field@struct \} + macro dw [val] \{ \common \local anonymous + define field@struct anonymous,dw, + fields@struct equ fields@struct,field@struct \} + macro dd [val] \{ \common \local anonymous + define field@struct anonymous,dd, + fields@struct equ fields@struct,field@struct \} + macro rb count \{ \local anonymous + define field@struct anonymous,db,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rh count \{ \local anonymous + define field@struct anonymous,dh,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rw count \{ \local anonymous + define field@struct anonymous,dw,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro rd count \{ \local anonymous + define field@struct anonymous,dd,count dup (?) + fields@struct equ fields@struct,field@struct \} + macro union \{ fields@struct equ fields@struct,,union,< + sub@struct equ union \} + macro struct \{ fields@struct equ fields@struct,,substruct,< + sub@struct equ substruct \} + virtual at 0 } + +macro ends + { match , sub@struct \{ restruc db,dh,du,dw,dd + restruc rb,rh,rw,rd + purge db,dh,du,dw,dd + purge rb,rh,rw,rd + purge union,struct + match name=,fields,fields@struct \\{ fields@struct equ + make@struct name,fields + define fields@\\#name fields \\} + end virtual \} + match any, sub@struct \{ fields@struct equ fields@struct> \} + restore sub@struct } + +macro make@struct name,[field,type,def] + { common + if $ + display 'Error: definition of ',`name,' contains illegal instructions.',0Dh,0Ah + err + end if + local define + define equ name + forward + local sub + match , field \{ make@substruct type,name,sub def + define equ define,.,sub, \} + match any, field \{ define equ define,.#field,type, \} + common + match fields, define \{ define@struct fields \} } + +macro define@struct name,[field,type,def] + { common + local list + list equ + forward + if ~ field eq . + name#field type def + sizeof.#name#field = $ - name#field + else + label name#.#type + rb sizeof.#type + end if + local value + match any, list \{ list equ list, \} + list equ list + common + sizeof.#name = $ + restruc name + match values, list \{ + struc name value \\{ + match any, fields@struct \\\{ fields@struct equ fields@struct,.,name, \\\} + match , fields@struct \\\{ label . + forward + match , value \\\\{ field type def \\\\} + match any, value \\\\{ field type value + if ~ field eq . + rb sizeof.#name#field - ($-field) + end if \\\\} + common \\\} \\} + macro name value \\{ + forward + match , value \\\{ type def \\\} + match any, value \\\{ \\\local ..field + ..field: type value + if ~ field eq . + rb sizeof.#name#field - ($-..field) + end if \\\} + common \\} \} } +macro enable@substruct + { macro make@substruct substruct,parent,name,[field,type,def] + \{ \common + \local define + define equ parent,name + \forward + \local sub + match , field \\{ match any, type \\\{ enable@substruct + make@substruct type,name,sub def + purge make@substruct + define equ define,.,sub, \\\} \\} + match any, field \\{ define equ define,.\#field,type, \\} + \common + match fields, define \\{ define@\#substruct fields \\} \} } + +enable@substruct + +macro define@union parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + virtual at parent#.#name + parent#field type def + sizeof.#parent#field = $ - parent#field + end virtual + if sizeof.#parent#field > $ - parent#.#name + rb sizeof.#parent#field - ($ - parent#.#name) + end if + else + label name#.#type at parent#.#name + if sizeof.#type > $ - parent#.#name + rb sizeof.#type - ($ - parent#.#name) + end if + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name [value] \{ \common + label .\#name + last@union equ + forward + match any, last@union \\{ virtual at .\#name + field type def + end virtual \\} + match , last@union \\{ match , value \\\{ field type def \\\} + match any, value \\\{ field type value \\\} \\} + last@union equ field + common rb sizeof.#name - ($ - .\#name) \} } + +macro define@substruct parent,name,[field,type,def] + { common + virtual at parent#.#name + forward + if ~ field eq . + parent#field type def + sizeof.#parent#field = $ - parent#field + else + label name#.#type + rb sizeof.#type + end if + common + sizeof.#name = $ - parent#.#name + end virtual + struc name value \{ + label .\#name + forward + match , value \\{ field type def \\} + match any, value \\{ field type value + if ~ field eq . + rb sizeof.#parent#field - ($-field) + end if \\} + common \} } diff --git a/include/macro/importce.inc b/include/macro/importce.inc new file mode 100644 index 0000000..e681daf --- /dev/null +++ b/include/macro/importce.inc @@ -0,0 +1,67 @@ +;FASMARM extension macros: +; +;Macros for imports section in PE file generation +; +;LIBRARY: +; +; Usage: library name1,string1,name2,string2,... +; +; name - a prefix for program labels identifying data structures +; string - a text ascii string identifying the DLL filename +; +; +;IMPORT: +; +; Usage: import name,function1,ordinal1,function2,ordinal2,... +; +; name - a prefix for program labels identifying data structures +; function - program label for the import +; ordinal - the DLL exported ordinal +; +;By default this file is included from "WINCE.INC". + + +macro library [name,string] { + common + align 4 + ;; data import + forward + if defined name#_required + dw RVA name,0,0,RVA name#_name,RVA name + end if + common + rw 5 + ;; end data + forward + if defined name#_required + name#_name: db string,0 + end if + common + align 4 +} + +macro import name,[function,ordinal] { + common + align 4 + name: + forward + if used _#function + _#function dw ordinal + end if + common + if $-name>0 + name#_required=1 + dw 0 + end if + forward + if used function + function: + if $+8-_#function<4096 + ldr pc,[pc,_#function-$-8] + else + ldr r12,[pc] + ldr pc,[r12] + dw _#function + end if + end if +} diff --git a/include/macro/procaps.inc b/include/macro/procaps.inc new file mode 100644 index 0000000..f71443c --- /dev/null +++ b/include/macro/procaps.inc @@ -0,0 +1,690 @@ +;FASMARM extension macros: +; +;High level procedure macros for APS (ARM Procedure Standard) calling +; +;The APS call standard requires the first four parameters to be passed in registers r0-r3, any remaining +;parameters are placed on the stack and pushed in reverse order. The stack is always full descending. +;Caller always restores the stack. Any return values are in r0-r3. +; +;r4-r11 must always be preserved by procedures. +;r12 is always a scratch register and considered corruptable. +;r13 is always the stack register and is always used in full descending mode. +;r14 is always the return address and considered corruptable. +; +;These macros are NOT compatible with thumb mode +; +; +;APSCALL: +; +; Usage: apscall name, arg1, size[arg2], addr arg3, [arg4], 'string', *'string', 'A'+0, ... +; +; name - required - specifies the name of the target procedure +; args - optional - any arguments required by the target procedure +; addr - refers to a PC relative address or a frame pointer relative address +; size - size override operator, can be byte, sbyte, hword, shword or word +; byte - zero extended byte value to 32 bit +; sbyte - sign extended byte value to 32 bit +; hword - zero extended half word value to 32 bit +; shword - sign extended half word value to 32 bit +; word - 32 bit value +; [arg] - value stored at address arg +; 'string' - literal ascii string placed directly in the code stream. For convenience +; *'string' - literal unicode string placed directly in the code stream. For convenience +; 'A'+0 - immediate value zero extended to 32 bit, can be 1 through 4 characters in length +; +; NOTE: "apscall" is safe to use inside an SP frame based procedure. The macro properly allocates the stack. +; +; +;PROC: +; +; Usage: proc name base reg uses [reg, reg-reg, reg] nospill ,arg1, arg2, arg3, ... +; +; paramters: +; +; name - required - specifies the name of the procedure +; base reg - optional - specifies the base register to use for the stack frame, default is R11 (fp) +; uses [.] - optional - lists registers to be saved upon entry and restored upon exit. Square brackets are required. +; NOTE: if you specify LR to be saved it will be automatically restored to PC upon exit +; nospill - optional - specifies the first four parameters are not to be spilled to the stack upon entry +; See the "To spill or not to spill?" note +; args - optional - input arguments from calling procedure, must be started with and separated by commas +; +; "name" must be first. +; "base reg", "uses [.]" and "nospill" can be specified in any order after "name". +; "args" must be placed last. +; +; To spill or not to spill? +; +; By omitting the "nospill" optional the proc macro will spill the first four arguments to the stack upon entry. +; This creates the most reliable way to access input parameters at the small cost of extra object code. +; By using the "nospill" option the first four arguments are aliased to the registers r0-r3 directly. +; "nospill" mode is best suited for leaf and "register light" procedures where using the stack is unneccesary. +; Accessing the first four parameters is different between the two cases: +; +; eg1. proc foo nospill, bar1, bar2, bar3, bar4, bar5 +; mov r3,bar2 ;mov r3,r1 - from here on bar4 (r3) has been lost! +; mov r0,bar2 ;mov r0,r1 - from here on bar1 (r0) has been lost! +; mov r5,bar1 ;ERROR: bar1 (r0) was destroyed above +; lea r4,[bar3] ;invalid: bar3 (r2) is not in memory +; ldr r4,[bar3] ;invalid: bar3 (r2) is not in memory +; ldr r4,[bar5] ;okay: ldr r0,[fp] +; endp +; +; compare to this: +; +; eg2. proc foo, bar1, bar2, bar3, bar4, bar5 +; mov r3,bar2 ;add r3,fp,4 +; lea r3,[bar2] ;add r3,fp,4 +; ldr r0,[bar2] ;ldr r0,[fp,4] +; ldr r5,[bar1] ;ldr r5,[fp] +; lea r4,[bar3] ;add r4,fp,8 +; ldr r4,[bar5] ;ldr r4,[fp,10h] +; endp +; +; and also compare to this: +; +; eg3. proc foo uses[r4-r6, lr], bar1, bar2, bar3, bar4, bar5 +; mov r3,bar2 ;add r3,fp,4 +; ldr r0,[bar2] ;ldr r0,[fp,4] +; ldr r5,[bar1] ;ldr r5,[fp] +; lea r4,[bar3] ;add r4,fp,8 +; ldr r4,[bar5] ;ldr r4,[fp,20h] ;note the different offset from above +; endp +; +; +; The stack frame: +; +; eg4. Assume the calling procedure does this: "apscall MyFunc, arg1, arg2, arg3, arg4, arg5, arg6", +; then: "proc MyFunc uses [fp, r4, lr], arg1, ..." creates a stack frame that looks like this: +; +; arg6 - pushed by calling procedure higher addresses up here +; arg5 - pushed by calling procedure <---------------^------------- FP points here +; saved reg lr - pushed by proc | +; saved reg fp - pushed by proc | +; saved reg r4 - pushed by proc | +; arg4 (reg r3) - pushed by proc | +; arg3 (reg r2) - pushed by proc | +; arg2 (reg r1) - pushed by proc v +; arg1 (reg r0) - pushed by proc lower addresses down here +; locals data - uninitialised data <-- SP points here +; +; NOTE: the order of register saving is always highest (r15) to lowest (r0) regardless of the +; order they are specified in the "uses" statement. +; +; +; eg5. Assume the calling procedure does this: "apscall MyFunc, arg1, arg2, arg3, arg4, arg5, arg6", +; then: "proc MyFunc base r4 uses [r4, lr] nospill, arg1, ..." creates a stack frame that looks like this: +; +; arg6 - pushed by calling procedure higher addresses up here +; arg5 - pushed by calling procedure <---------------^------------- R4 points here +; saved reg lr - pushed by proc v +; saved reg r4 - pushed by proc lower addresses down here +; locals data - uninitialised data <-- SP points here +; +; NOTE: The first four arguments are still in registers r0-r3 and have not been spilled to the stack +; +; +; eg6. Assume the calling procedure does this: "apscall MyFunc, arg1, arg2, arg3, arg4, arg5, arg6", +; then: "proc MyFunc base sp uses [lr] nospill, arg1, ..." creates a stack frame that looks like this: +; +; arg6 - pushed by calling procedure higher addresses up here +; arg5 - pushed by calling procedure | +; saved reg lr - pushed by proc lower addresses down here +; locals data - uninitialised data <-- SP points here +; +; NOTE: Using sp based addressing requires special attention. The "apscall" macro has been +; designed to properly issue parameters when using sp based variables but your code must +; always restore sp before executing "apscall" or "ret". +; +; +;LOCALS/ENDL: +; +; Usage: locals | endl +; +; Valid inside a proc/endp pair only. Declares uninitialised locally addressable variables. +; You can use any number of locals/endl pairs, they are all concatenated together on the stack at runtime. +; +; eg7. proc foo +; locals +; varw dw ? +; varh dh ? +; varb db 100 dup (?) +; endl +; mov r1,'x' +; strb r1,[varb+2] +; lea r2,[varw] +; ... +; endp +; +; +;LOCAL: +; +; Usage: local name definition | local name:type | local name[count]:type +; +; Valid inside a proc/endp pair only. Declares uninitialised locally addressable variables. +; You can use any number of local definitions, they are all concatenated together on the stack at runtime. +; +; name - the symbolic name of the variable +; count - must be numeric +; type - one of BYTE, HWORD, WORD, DWORD or a structure name +; definition - the variable's definition statement +; +; eg8. local MyVar1 db ? +; local MyVar2 rb 8 +; local MyVar3:HWORD +; local MyVar4[0x100]:BYTE +; +; +;RET: +; +; Usage: ret(cond) +; +; Valid inside a proc/endp pair only. Restores the state and returns to the calling procedure. +; +; The worst case generated code by ret is three instructions for non-sp based procedures, and four +; instructions plus one literal for sp based precedures. +; +; +;ENDP: +; +; Usage: endp +; +; Ends the current "proc", freeing all local scope equates. +; +; +;POP/PUSH: +; +; Usage: push reg, reg-reg, reg, ... | pop reg, reg-reg, reg, ... +; +; At least one reg required in the list. Convience macros for optimal full descending stack operations. +; +; +;LEA: +; +; Usage: lea(cond) reg, [address] +; +; Convienience macro to access locations that are PC or local frame based. +; The macro automatically determines whether the address is a local variable or external variable +; and generates the appropriate code. +; +; +; General note: You may notice that some instructions below use uppercase, this is to integrate with the +; literals macros in ARMLIRTL.INC. +; +;By default this file is included from "WINCE.INC". + +macro def_ustring labl,[string] {common labl dU string} +macro def_astring labl,[string] {common labl dB string} + +macro apscall function,[parameter] { + common + local pcount,tempcount,found,.skip,.size,param,last_value,temp,size,instr,i_s,msize + virtual + nop + temp=$-$$ + end virtual + if temp<>4 + halt ;APSCALL macro NOT usable in thumb mode + end if + if ~ parameter eq + if .size + b .skip + end if + temp=$ + tempcount=0 + reverse + local ..arg + found equ no + match i[like]za,:parameter: \{ found equ \} + match =no:*ustring,found:parameter \{ + def_ustring ..arg,ustring,0 + found equ \} + match =no:some=,more,found:parameter \{ + def_astring ..arg,parameter,0 + found equ \} + match =no,found \{ + if parameter eqtype '' + def_astring ..arg,parameter,0 + end if \} + tempcount=tempcount+1 + common + pcount=tempcount + align 4 + .size=$-temp + if .size + .skip: + end if + lastvalue=1 shl 63 + tempcount=0 + reverse + if tempcount<(pcount-4) + found equ no + define param parameter + match [address],parameter \{ + LDR lr,[address] + lastvalue=1 shl 63 + str lr,[sp,-tempcount*4-4] + found equ yes \} + irp i_s,b:byte:byte,sb:sbyte:byte,h:hword:hword,sh:shword:hword,:word:word \{ + match instr:msize:size,LDR\#i_s \\{ + match =msize[address],parameter \\\{ + instr lr,size[address] + lastvalue=1 shl 63 + str lr,[sp,-tempcount*4-4] + found equ yes \\\}\\}\} + match =addr address,param \{ + lea lr,[address] + lastvalue=1 shl 63 + str lr,[sp,-tempcount*4-4] + found equ yes \} + match value =no,parameter found \{ + if defined ..arg + lastvalue=1 shl 63 + ADD lr,pc,..arg-$-8 + str lr,[sp,-tempcount*4-4] + else if value eqtype r0 + str value,[sp,-tempcount*4-4] + else if value eqtype 0 + virtual + dw value + load temp word from $-4 + end virtual + if temp <> lastvalue + MOV lr,value + end if + lastvalue=temp + str lr,[sp,-tempcount*4-4] + else + MOV lr,value + lastvalue=1 shl 63 + str lr,[sp,-tempcount*4-4] + end if \} + end if + rept 4 p:0 \{\reverse + if tempcount=pcount-p-1 + found equ no + match [address],parameter \\{ + LDR r\#p,[address] + found equ yes \\} + irp i_s,b:byte:byte,sb:sbyte:byte,h:hword:hword,sh:shword:hword,:word:word \\{ + match instr:msize:size,LDR\\#i_s \\\{ + match =msize[address],parameter \\\\{ + instr r\#p,size[address] + found equ yes \\\\}\\\}\\} + match =addr address,param \\{ + lea r\#p,[address] + found equ yes \\} + match value =no,parameter found \\{ + if ~ defined ..arg & value eqtype 0 + virtual + dw value + load temp word from $-4 + end virtual + end if + if defined ..arg + ADD r\#p,pc,..arg-$-8 + else if value eqtype 0 & lastvalue = temp + MOV r\#p,lr + else if ~ r\#p eq value + MOV r\#p,value + end if \\} + end if + \} + tempcount=tempcount+1 + common + else + pcount=0 + end if + if pcount>4 + sub sp,sp,(pcount-4)*4 + end if + if defined _#function & _#function-$-8<4096 & _#function-$-8>-4096 + mov lr,pc + ldr pc,[pc,_#function-$-8] + else + bl function + end if + if pcount>4 + add sp,sp,(pcount-4)*4 + end if +} + +macro popcount val,result { + local r + r=0 + repeat 16 + r=r+(((val)shr(%-1))and 1) + end repeat + result=r +} + +macro push [list] { + common + local bits,popc + virtual + stmdb sp!,{list\} + load bits hword from $-4 + end virtual + popcount bits,popc + if popc=1 + str list,[sp,-4]! + else + stmdb sp!,{list\} + end if +} + +macro pop [list] { + common + local bits,popc + virtual + ldmia sp!,{list\} + load bits hword from $-4 + end virtual + popcount bits,popc + if popc=1 + ldr list,[sp],+4 + else + ldmia sp!,{list\} + end if +} + +irp cond,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo { + macro push#cond [list] \{ + \common + \local bits,popc + virtual + stm#cond#db sp!,\\{list\\} + load bits hword from $-4 + end virtual + popcount bits,popc + if popc=1 + str#cond list,[sp,-4]! + else + stm#cond#db sp!,\\{list\\} + end if + \} + macro pop#cond [list] \{ + \common + \local bits,popc + virtual + ldm#cond#ia sp!,\\{list\\} + load bits hword from $-4 + end virtual + popcount bits,popc + if popc=1 + ldr#cond list,[sp],+4 + else + ldm#cond#ia sp!,\\{list\\} + end if + \} +} + +macro proc [parameter] { + common + local use,pname,parg,stack_count,bits,curr_off,locals_size,regbase,locals_names,spill,spill_size,param_count + match n remaining,parameter: \{pname equ n\} + if used pname + use equ + parg equ + locals_names equ + regbase equ fp + spill equ all + match junk =uses[u] remaining,parameter: \{use equ u\} + match junk =base b remaining,parameter: \{regbase equ b\} + match junk =nospill remaining,parameter: \{spill equ no\} + match :junk=,remaining,use:parameter \{parg equ remaining\} + match u:junk]=,remaining,use:parameter \{parg equ remaining\} + match :u:junk]foo=,remaining,parg:use:parameter \{parg equ remaining\} + match ,parg \{spill equ no\} + match =all:p1=,p2=,p3=,more,spill:parg\{spill equ ,r0,r1,r2,r3\} + match =all:p1=,p2=,p3,spill:parg\{spill equ ,r0,r1,r2\} + match =all:p1=,p2,spill:parg\{spill equ ,r0,r1\} + match =all:p1,spill:parg\{spill equ ,r0\} + match =no:p1=,p2=,p3=,p4=,more,spill:parg\{irp arg,p1 r0,p2 r1,p3 r2,p4 r3\\{match a r,arg\\\{a equ r\\\}\\}spill equ\} + match =no:p1=,p2=,p3=,p4,spill:parg\{irp arg,p1 r0,p2 r1,p3 r2,p4 r3\\{match a r,arg\\\{a equ r\\\}\\}spill equ\} + match =no:p1=,p2=,p3,spill:parg\{irp arg,p1 r0,p2 r1,p3 r2\\{match a r,arg\\\{a equ r\\\}\\}spill equ\} + match =no:p1=,p2,spill:parg\{irp arg,p1 r0,p2 r1\\{match a r,arg\\\{a equ r\\\}\\}spill equ\} + match =no:p1,spill:parg\{p1 equ r0\} + match =no,spill\{spill equ\} + match =,any,spill \{ + virtual at 0 + ldmia sp!,{any\\} + load bits hword from $-4 + popcount bits,spill_count + end virtual + \} + match ,spill\{spill_count=0\} + match any,use \{ + virtual at 0 + ldmia sp!,{any\\} + load bits hword from $-4 + popcount bits,stack_count + end virtual + \} + match ,use\{stack_count=0\} + curr_off=0 + match =,junk:args,spill:parg \{ + irp arg,args \\{ + \\local ..arg + arg equ ..arg + if curr_off<4 + if regbase eq sp + virtual at regbase+curr_off*4+locals_size + else if param_count >= 4 + virtual at regbase-(4-curr_off+stack_count)*4 + else + virtual at regbase-(param_count-curr_off+stack_count)*4 + end if + ..arg dw ? + end virtual + else + if regbase eq sp + virtual at regbase+stack_count*4+curr_off*4+locals_size + else + virtual at regbase+(curr_off-4)*4 + end if + ..arg dw ? + end virtual + end if + curr_off=curr_off+1 + \\} + param_count=curr_off + \} + match :p1=,p2=,p3=,p4=,others,spill:parg \{ + param_count=5 + if regbase eq sp + virtual at regbase+(stack_count+spill_count)*4+locals_size + else + virtual at regbase + end if + irp arg,others \\{ + \\local ..arg + arg equ ..arg + ..arg dw ? + \\} + end virtual + \} + align 4 + use32 + pname: + match :=,regs,use:spill\{push regs\} + match junk,use\{push use spill\} + if (~ regbase eq sp) & ((locals_size+spill_count) | (defined param_count & param_count>4)) + add regbase,sp,(stack_count+spill_count)*4 + end if + if (locals_size) + SUB sp,sp,locals_size + end if + irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo \{ + match rt:sb1:AD2:ld:ldia:xb,ret\#cond:sub\#cond:ADD\#cond:ldr\#cond:ldm\#cond\#ia:bx\#cond\\{ + macro rt \\\{ + if (~ regbase eq sp) & ((locals_size+spill_count) | (defined param_count & param_count>4)) + sb1 sp,regbase,stack_count*4 + end if + if (regbase eq sp) & locals_size+spill_count + AD2 sp,sp,locals_size+spill_count*4 + end if + if stack_count>1 + ldia sp!,{use\\\\} + store hword ((bits and 0x3fff)+((bits and 0x4000)shl 1)) at $-4 + if ~ bits and 0x4000 + xb lr + end if + else if stack_count=1 + if use eq lr + ld pc,[sp],+4 + else + ld use,[sp],+4 + xb lr + end if + else + xb lr + end if + \\\} + \\} + \} + curr_off=0 + local in_locals + in_locals=0 + macro locals \{ + if in_locals + halt - locals is not allowed to be recursive + end if + if regbase eq sp + virtual at regbase+curr_off + else + virtual at regbase-locals_size+curr_off-((stack_count+spill_count)*4) + end if + in_locals=1 + \} + local ..s,size,reserve,op,def,copy + macro \local [arg] \{ + \common + locals + \forward + found equ no + define copy arg + match name[count]:type,copy \\{ + irp op,BYTE rb,HWORD rh,WORD rw,DWORD rd \\\{ + match size reserve,op \\\\{ + match =size,type \\\\\{ + name reserve count + found equ \\\\\}\\\\}\\\} + match =no,found \\\{ + virtual + name type + ..s=$-$$ + end virtual + rb count*..s + found equ \\\} + \\} + match =no:name:type,found:copy \\{ + irp op,BYTE db,HWORD dh,WORD dw,DWORD dd \\\{ + match size def,op \\\\{ + match =size,type \\\\\{ + name def ? + found equ \\\\\}\\\\}\\\} + match =no,found \\\{ + name type + found equ \\\} + \\} + match =no,found \\{ arg \\} + \common + endl + \} + macro endl \{ + in_locals=0 + curr_off=curr_off+$-$$ + end virtual + \} + macro close_proc \{ + locals_size=(curr_off+3)and not 3 + match a,parg \\{ restore a \\} + match =,a,locals_names \\{ restore a \\} + restruc db,dh,du,dw,dd,rb,rh,rw,rd + \} + irp op,db 1,dh 2,du 2,dw 4,dd 4,rb 1,rh 2,rw 4,rd 4 \{ + \local already + match str bytes,op \\{ + struc str [v]\\\{ + \\\common + \\\local ..arg + already equ no + match foo =. bar,:locals_names:\\\\{already equ\\\\} + match =no,already\\\\{ + locals_names equ locals_names,. + . equ ..arg + \\\\} + times ($$-$-curr_off)and(bytes-1) db ? + . str v + \\\} + \\} + \} + irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo \{ + \local ad + match inst,lea\#cond\\{ + macro inst dest,var \\\{ + found equ no + define copy var + match [v=+off],copy \\\\{ + match ad:some=,=v=,more , ADD\#cond::,parg locals_names,: \\\\\{ + ad dest,regbase,v-regbase+off + found equ + \\\\\} + \\\\} + match [v=-off],copy \\\\{ + match ad:some=,=v=,more , ADD\#cond::,parg locals_names,: \\\\\{ + ad dest,regbase,v-regbase-off + found equ + \\\\\} + \\\\} + match [v=,off],copy \\\\{ + match ad:some=,=v=,more , ADD\#cond::,parg locals_names,: \\\\\{ + ad dest,regbase,v-regbase+off + found equ + \\\\\} + \\\\} + match [v]:=no,copy:found \\\\{ + match ad:some=,=v=,more , ADD\#cond::,parg locals_names,: \\\\\{ + ad dest,regbase,v-regbase + found equ + \\\\\} + \\\\} + match ad:[v]:=no,ADD\#cond:copy:found \\\\{ + ad dest,pc,v-$-8 + found equ + \\\\} + match =no,found\\\\{ + halt ;malformed expression, use: lea reg,[address] + \\\\} + \\\} + \\} + \} +} + +macro endp { + close_proc + purge locals,endl,close_proc,local + irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo\{ + purge lea\#cond + purge ret\#cond + \} + end if +} + +irp cond,,eq,ne,cs,cc,mi,pl,vs,vc,hi,ls,ge,lt,gt,le,al,hs,lo { + local found,inst,ad,d,v + match inst,lea#cond\{ + macro inst dest,var \\{ + found equ no + match ad:d:[v],ADD#cond:dest:var \\\{ + ad d,pc,v-$-8 + found equ + \\\} + match =no,found \\\{ + halt ;malformed expression, use: lea reg,[address] + \\\} + \\} + \} +} + diff --git a/include/wince.inc b/include/wince.inc new file mode 100644 index 0000000..58dad25 --- /dev/null +++ b/include/wince.inc @@ -0,0 +1,8 @@ + +;WinCE programming headers +;By default this file is included from "WINCEX.INC". + +include 'macro\procaps.inc' +include 'macro\importce.inc' +include 'macro\armresrc.inc' +include 'macro\armstruc.inc' diff --git a/include/wincex.inc b/include/wincex.inc new file mode 100644 index 0000000..b34afe3 --- /dev/null +++ b/include/wincex.inc @@ -0,0 +1,22 @@ + +;Extended WinCE programming headers + + format PE GUI + + include 'wince.inc' + include 'macro\armlitrl.inc' + +macro .code {section '.text' code readable executable} +macro .data {section '.data' data readable writeable} + +macro .end begin { + entry begin + section '.idata' import readable writeable + library coredll,'COREDLL.DLL' + include 'apice\coredll.inc' +} + +macro endp { + literals + endp +} diff --git a/source/armtable.inc b/source/armtable.inc new file mode 100644 index 0000000..b22ac3e --- /dev/null +++ b/source/armtable.inc @@ -0,0 +1,11321 @@ +; ARMv8 assembler core module v1.44 for flat assembler, +; Copyright (c) 2005-2023, Revolution. +; All rights reserved. +; +; Some portions are Copyright (c) 1999-2016, Tomasz Grysztar. +; All rights reserved. + +macro dw [value] { + forward + assert value >= 0 + dw value +} + +include_variable db 'INCLUDE',0 + +symbol_characters db 27 + db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\' + +preprocessor_directives: + db 6,'define' + dw define_symbolic_constant-directive_handler + db 7,'include' + dw include_file-directive_handler + db 3,'irp' + dw irp_directive-directive_handler + db 4,'irps' + dw irps_directive-directive_handler + db 4,'irpv' + dw irpv_directive-directive_handler + db 5,'macro' + dw define_macro-directive_handler + db 5,'match' + dw match_directive-directive_handler + db 8,'postpone' + dw postpone_directive-directive_handler + db 5,'purge' + dw purge_macro-directive_handler + db 4,'rept' + dw rept_directive-directive_handler + db 7,'restore' + dw restore_equ_constant-directive_handler + db 7,'restruc' + dw purge_struc-directive_handler + db 5,'struc' + dw define_struc-directive_handler + db 0 + +macro_directives: + db 6,'common' + dw common_block-directive_handler + db 7,'forward' + dw forward_block-directive_handler + db 5,'local' + dw local_symbols-directive_handler + db 7,'reverse' + dw reverse_block-directive_handler + db 0 + +preprocessor_special_symbols: + db 4,'file' + dw preprocessed_file_value-directive_handler + db 4,'line' + dw preprocessed_line_value-directive_handler + db 0 + +operators: + db 1,'+',80h + db 1,'-',81h + db 1,'*',90h + db 1,'/',91h + db 3,'and',0B0h + db 3,'mod',0A0h + db 2,'or',0B1h + db 3,'shl',0C0h + db 3,'shr',0C1h + db 3,'xor',0B2h + db 0 + +single_operand_operators: + db 1,'+',082h + db 1,'-',083h + db 3,'bsf',0E0h + db 3,'bsr',0E1h + db 3,'fit',0D1h ;ARM operator fit + db 3,'not',0D0h + db 3,'plt',0F1h + db 3,'rva',0F0h + db 0 + +directive_operators: + db 5,'align',8Ch + db 2,'as',86h + db 2,'at',80h + db 11,'coprocessor',08Eh ;ARM coprocessor instructions selected + db 7,'defined',88h + db 8,'definite',8Ah + db 3,'dup',81h + db 2,'eq',0F0h + db 6,'eqtype',0F7h + db 4,'from',82h + db 2,'in',0F6h + db 2,'on',84h + db 9,'processor',08Fh ;ARM processor instructions selected + db 3,'ptr',85h + db 10,'relativeto',0F8h + db 4,'used',89h + db 0 + +address_sizes: + db 0 + +symbols: + dw symbols_1-symbols,(symbols_2-symbols_1)/(1+2) + dw symbols_2-symbols,(symbols_3-symbols_2)/(2+2) + dw symbols_3-symbols,(symbols_4-symbols_3)/(3+2) + dw symbols_4-symbols,(symbols_5-symbols_4)/(4+2) + dw symbols_5-symbols,(symbols_6-symbols_5)/(5+2) + dw symbols_6-symbols,(symbols_7-symbols_6)/(6+2) + dw symbols_7-symbols,(symbols_8-symbols_7)/(7+2) + dw symbols_8-symbols,(symbols_9-symbols_8)/(8+2) + dw symbols_9-symbols,(symbols_10-symbols_9)/(9+2) + dw symbols_10-symbols,(symbols_11-symbols_10)/(10+2) + dw symbols_11-symbols,(symbols_12-symbols_11)/(11+2) + dw symbols_12-symbols,(symbols_13-symbols_12)/(12+2) + dw symbols_13-symbols,(symbols_14-symbols_13)/(13+2) + dw symbols_14-symbols,(symbols_15-symbols_14)/(14+2) + dw symbols_15-symbols,(symbols_16-symbols_15)/(15+2) + dw symbols_16-symbols,(symbols_17-symbols_16)/(16+2) + dw symbols_17-symbols,(symbols_end-symbols_17)/(17+2) + +base_@16 = 0x1010 +base_@16.size = 0x10 ;r0@16-r15@16 + +base_@32 = base_@16+base_@16.size +base_@32.size = 0x10 ;r0@32-r15@32 + +base_@64 = base_@32+base_@32.size +base_@64.size = 0x10 ;r0@64-r15@64 + +base_@128 = base_@64+base_@64.size +base_@128.size = 0x10 ;r0@128-r15@128 + +base_@256 = base_@128+base_@128.size +base_@256.size = 0x10 ;r0@256-r15@256 + +base_reg = base_@256+base_@256.size +base_reg.size = 0x10 ;r0-r15 + +dword_reg = base_reg+base_reg.size +dword_reg.size = 0x20 ;x0-x30,xzr + +size_opr = 0x1100 +size_opr.size = 33 ;byte,hword,word,dword,qword,dqword + +sys_at = 0x1200 +sys_at.size = 12 ;0-11 + +sys_dc = sys_at+sys_at.size +sys_dc.size = 8 ;0-7 + +sys_ic = sys_dc+sys_dc.size +sys_ic.size = 3 ;0-2 + +sys_tlbi = sys_ic+sys_ic.size +sys_tlbi.size = 32 ;0-31 + +sys_msr = sys_tlbi+sys_tlbi.size +sys_msr.size = 384 ;0-383 + +sys_pstate = sys_msr+sys_msr.size +sys_pstate.size = 2 ;daifclr, daifset + +base_reg! = sys_pstate+sys_pstate.size +base_reg!.size = 0x10 ;r0!-r15! + +vect_breg = base_reg!+base_reg!.size +vect_breg.size = 0x20 ;b0-b31 + +vect_hreg = vect_breg+vect_breg.size +vect_hreg.size = 0x20 ;h0-h31 + +vect_sreg = vect_hreg+vect_hreg.size +vect_sreg.size = 0x20 ;s0-s31 + +vfps_reg = vect_sreg +vfps_reg.size = 0x20 ;s0-s31 + +vect_dreg = vect_sreg+vect_sreg.size +vect_dreg.size = 0x20 ;d0-d31 + +vfpd_reg = vect_dreg +vfpd_reg.size = 0x20 ;d0-d31 + +vect_qreg = vect_dreg+vect_dreg.size +vect_qreg.size = 0x20 ;q0-q31 + +simd_qreg = vect_qreg +simd_qreg.size = 0x10 ;q0-q15 + +word_reg = vect_qreg+vect_qreg.size +word_reg.size = 0x21 ;w0-w30,wzr,wsp + +banked_reg = word_reg+word_reg.size +banked_reg.size = 0x3f ;0-62 + +vect_v8b = banked_reg+banked_reg.size +vect_v8b.size = 0x20 ;v0.8b-v31.8b + +vect_v16b = vect_v8b+vect_v8b.size +vect_v16b.size = 0x20 ;v0.16b-v31.16b + +vect_v4h = vect_v16b+vect_v16b.size +vect_v4h.size = 0x20 ;v0.4h-v31.4h + +vect_v8h = vect_v4h+vect_v4h.size +vect_v8h.size = 0x20 ;v0.8h-v31.8h + +vect_v2s = vect_v8h+vect_v8h.size +vect_v2s.size = 0x20 ;v0.2s-v31.2s + +vect_v4s = vect_v2s+vect_v2s.size +vect_v4s.size = 0x20 ;v0.4s-v31.4s + +vect_v2d = vect_v4s+vect_v4s.size +vect_v2d.size = 0x20 ;v0.2d-v31.2d + +vect_v1d = vect_v2d+vect_v2d.size +vect_v1d.size = 0x20 ;v0.1d-v31.1d + +vect_v1q = vect_v1d+vect_v1d.size +vect_v1q.size = 0x20 ;v0.1q-v31.1q + +vect_vb = vect_v1q+vect_v1q.size +vect_vb.size = 0x20 ;v0.b-v31.b + +vect_vh = vect_vb+vect_vb.size +vect_vh.size = 0x20 ;v0.h-v31.h + +vect_vs = vect_vh+vect_vh.size +vect_vs.size = 0x20 ;v0.s-v31.s + +vect_vd = vect_vs+vect_vs.size +vect_vd.size = 0x20 ;v0.d-v31.d + +cpro_sel = vect_vd+vect_vd.size +cpro_sel.size = 0x10 ;p0-p15 + +cpro_reg = cpro_sel+cpro_sel.size +cpro_reg.size = 0x10 ;c0-c15 + +shift_op = cpro_reg+cpro_reg.size +shift_op.size = 4 ;asr, lsl, lsr, ror + +rrx_op = shift_op+shift_op.size +rrx_op.size = 1 ;rrx + +msl_op = rrx_op+rrx_op.size +msl_op.size = 1 ;msl + +endian = msl_op+msl_op.size +endian.size = 2 ;be, le + +modifier = endian+endian.size +modifier.size = 2 ;!, ^ + +psr_reg = modifier+modifier.size +psr_reg.size = 16+16+3 ;cpse, spsr + +iflags = psr_reg+psr_reg.size +iflags.size = 8 ;a, i, f + +vfp_syst = iflags+iflags.size +vfp_syst.size = 11 ; + +acc_40bt = vfp_syst+vfp_syst.size +acc_40bt.size = 8 ;acc0-acc7 + +iwmmx_wreg = acc_40bt+acc_40bt.size +iwmmx_wreg.size = 0x10 ;wr0-wr15 + +iwmmx_creg = iwmmx_wreg+iwmmx_wreg.size +iwmmx_creg.size = 12 ; + +mvrk_areg = iwmmx_creg+iwmmx_creg.size +mvrk_areg.size = 1 ;a0 + +mvrk_psc = mvrk_areg+mvrk_areg.size +mvrk_psc.size = 1 ;dspsc + +fpa_freg = mvrk_psc+mvrk_psc.size +fpa_freg.size = 8 ;f0-f7 + +barrier = fpa_freg+fpa_freg.size +barrier.size = 0x10 ; + +condition = barrier+barrier.size +condition.size = 16 ; + +sysm_reg = condition+condition.size +sysm_reg.size = 21 ; + +xtnd_op = sysm_reg+sysm_reg.size +xtnd_op.size = 8 ; + +prf_op = xtnd_op+xtnd_op.size +prf_op.size = 2*8+2*2+1 + 1 ; + +assert prf_op+prf_op.size <= 0x1800 + + ; 0x18 mz, pe, elf, coff, pe64, elf64, binary + ; 0x19 code, data, dwarf, linkinfo, readable, writable, shareable, writeable, executable, linkremove, discardable, notpageable + ; 0x1a export, fixups, import, resource + ; 0x1b nx, dll, efi, gui, wdm, large, native, console, efiboot, efiruntime + ; 0x1c ms, ms64 + ; 0x1d static + ; 0x1e note, dynamic, interpreter + ; 0x1f cpu_sel, copro_sel + +cpu_sel.all32 = 0x1f00 +cpu_sel.all64 = 0x1f01 +copro_sel.all = 0x1f02 + +cpu_sel = 0x1f03 +cpu_sel.size = 37 + +copro_sel = cpu_sel+cpu_sel.size +copro_sel.size = 19 + +macro symbol_maker symbol,value {db symbol,(value) shr 8,(value) and 0xff} + +symbols_1: + symbol_maker '!',modifier+0 + symbol_maker '^',modifier+1 +symbols_2: + symbol_maker 'a0',mvrk_areg + symbol_maker 'a1',base_reg+0 + symbol_maker 'a2',base_reg+1 + symbol_maker 'a3',base_reg+2 + symbol_maker 'a4',base_reg+3 + symbol_maker 'al',condition+0xe + symbol_maker 'b0',vect_breg+0 + symbol_maker 'b1',vect_breg+1 + symbol_maker 'b2',vect_breg+2 + symbol_maker 'b3',vect_breg+3 + symbol_maker 'b4',vect_breg+4 + symbol_maker 'b5',vect_breg+5 + symbol_maker 'b6',vect_breg+6 + symbol_maker 'b7',vect_breg+7 + symbol_maker 'b8',vect_breg+8 + symbol_maker 'b9',vect_breg+9 + symbol_maker 'be',endian+1 + symbol_maker 'c0',cpro_reg+0 + symbol_maker 'c1',cpro_reg+1 + symbol_maker 'c2',cpro_reg+2 + symbol_maker 'c3',cpro_reg+3 + symbol_maker 'c4',cpro_reg+4 + symbol_maker 'c5',cpro_reg+5 + symbol_maker 'c6',cpro_reg+6 + symbol_maker 'c7',cpro_reg+7 + symbol_maker 'c8',cpro_reg+8 + symbol_maker 'c9',cpro_reg+9 + symbol_maker 'cc',condition+0x3 + symbol_maker 'cs',condition+0x2 + symbol_maker 'd0',vect_dreg+0 + symbol_maker 'd1',vect_dreg+1 + symbol_maker 'd2',vect_dreg+2 + symbol_maker 'd3',vect_dreg+3 + symbol_maker 'd4',vect_dreg+4 + symbol_maker 'd5',vect_dreg+5 + symbol_maker 'd6',vect_dreg+6 + symbol_maker 'd7',vect_dreg+7 + symbol_maker 'd8',vect_dreg+8 + symbol_maker 'd9',vect_dreg+9 +;; symbol_maker 'eq',condition+0x0 + symbol_maker 'f0',fpa_freg+0 + symbol_maker 'f1',fpa_freg+1 + symbol_maker 'f2',fpa_freg+2 + symbol_maker 'f3',fpa_freg+3 + symbol_maker 'f4',fpa_freg+4 + symbol_maker 'f5',fpa_freg+5 + symbol_maker 'f6',fpa_freg+6 + symbol_maker 'f7',fpa_freg+7 + symbol_maker 'fp',base_reg+11 + symbol_maker 'ge',condition+0xa + symbol_maker 'gt',condition+0xc + symbol_maker 'h0',vect_hreg+0 + symbol_maker 'h1',vect_hreg+1 + symbol_maker 'h2',vect_hreg+2 + symbol_maker 'h3',vect_hreg+3 + symbol_maker 'h4',vect_hreg+4 + symbol_maker 'h5',vect_hreg+5 + symbol_maker 'h6',vect_hreg+6 + symbol_maker 'h7',vect_hreg+7 + symbol_maker 'h8',vect_hreg+8 + symbol_maker 'h9',vect_hreg+9 + symbol_maker 'hi',condition+0x8 + symbol_maker 'hs',condition+0x2 + symbol_maker 'ip',base_reg+12 + symbol_maker 'ld',barrier+1101b + symbol_maker 'le',endian+0 +;; symbol_maker 'le',condition+0xd + symbol_maker 'lo',condition+0x3 + symbol_maker 'lr',base_reg+14 + symbol_maker 'ls',condition+0x9 + symbol_maker 'lt',condition+0xb + symbol_maker 'mi',condition+0x4 + symbol_maker 'ms',1Ch shl 8 + 41h + symbol_maker 'mz',18h shl 8 + 20h + symbol_maker 'ne',condition+0x1 + symbol_maker 'nv',condition+0xf + symbol_maker 'nx',1Bh shl 8 + 83h + symbol_maker 'p0',cpro_sel+0 + symbol_maker 'p1',cpro_sel+1 + symbol_maker 'p2',cpro_sel+2 + symbol_maker 'p3',cpro_sel+3 + symbol_maker 'p4',cpro_sel+4 + symbol_maker 'p5',cpro_sel+5 + symbol_maker 'p6',cpro_sel+6 + symbol_maker 'p7',cpro_sel+7 + symbol_maker 'p8',cpro_sel+8 + symbol_maker 'p9',cpro_sel+9 + symbol_maker 'pc',base_reg+15 + symbol_maker 'pe',18h shl 8 + 30h + symbol_maker 'pl',condition+0x5 + symbol_maker 'q0',vect_qreg+0 + symbol_maker 'q1',vect_qreg+1 + symbol_maker 'q2',vect_qreg+2 + symbol_maker 'q3',vect_qreg+3 + symbol_maker 'q4',vect_qreg+4 + symbol_maker 'q5',vect_qreg+5 + symbol_maker 'q6',vect_qreg+6 + symbol_maker 'q7',vect_qreg+7 + symbol_maker 'q8',vect_qreg+8 + symbol_maker 'q9',vect_qreg+9 + symbol_maker 'r0',base_reg+0 + symbol_maker 'r1',base_reg+1 + symbol_maker 'r2',base_reg+2 + symbol_maker 'r3',base_reg+3 + symbol_maker 'r4',base_reg+4 + symbol_maker 'r5',base_reg+5 + symbol_maker 'r6',base_reg+6 + symbol_maker 'r7',base_reg+7 + symbol_maker 'r8',base_reg+8 + symbol_maker 'r9',base_reg+9 + symbol_maker 's0',vect_sreg+0 + symbol_maker 's1',vect_sreg+1 + symbol_maker 's2',vect_sreg+2 + symbol_maker 's3',vect_sreg+3 + symbol_maker 's4',vect_sreg+4 + symbol_maker 's5',vect_sreg+5 + symbol_maker 's6',vect_sreg+6 + symbol_maker 's7',vect_sreg+7 + symbol_maker 's8',vect_sreg+8 + symbol_maker 's9',vect_sreg+9 + symbol_maker 'sb',base_reg+9 + symbol_maker 'sl',base_reg+10 + symbol_maker 'sp',base_reg+13 + symbol_maker 'st',barrier+1110b + symbol_maker 'sy',barrier+1111b + symbol_maker 'v1',base_reg+4 + symbol_maker 'v2',base_reg+5 + symbol_maker 'v3',base_reg+6 + symbol_maker 'v4',base_reg+7 + symbol_maker 'v5',base_reg+8 + symbol_maker 'v6',base_reg+9 + symbol_maker 'v7',base_reg+10 + symbol_maker 'v8',base_reg+11 + symbol_maker 'vc',condition+0x7 + symbol_maker 'vs',condition+0x6 + symbol_maker 'w0',word_reg+0 + symbol_maker 'w1',word_reg+1 + symbol_maker 'w2',word_reg+2 + symbol_maker 'w3',word_reg+3 + symbol_maker 'w4',word_reg+4 + symbol_maker 'w5',word_reg+5 + symbol_maker 'w6',word_reg+6 + symbol_maker 'w7',word_reg+7 + symbol_maker 'w8',word_reg+8 + symbol_maker 'w9',word_reg+9 + symbol_maker 'x0',dword_reg+0 + symbol_maker 'x1',dword_reg+1 + symbol_maker 'x2',dword_reg+2 + symbol_maker 'x3',dword_reg+3 + symbol_maker 'x4',dword_reg+4 + symbol_maker 'x5',dword_reg+5 + symbol_maker 'x6',dword_reg+6 + symbol_maker 'x7',dword_reg+7 + symbol_maker 'x8',dword_reg+8 + symbol_maker 'x9',dword_reg+9 +symbols_3: + symbol_maker 'a1!',base_reg!+0 + symbol_maker 'a2!',base_reg!+1 + symbol_maker 'a3!',base_reg!+2 + symbol_maker 'a4!',base_reg!+3 + symbol_maker 'asr',shift_op+2 + symbol_maker 'b10',vect_breg+10 + symbol_maker 'b11',vect_breg+11 + symbol_maker 'b12',vect_breg+12 + symbol_maker 'b13',vect_breg+13 + symbol_maker 'b14',vect_breg+14 + symbol_maker 'b15',vect_breg+15 + symbol_maker 'b16',vect_breg+16 + symbol_maker 'b17',vect_breg+17 + symbol_maker 'b18',vect_breg+18 + symbol_maker 'b19',vect_breg+19 + symbol_maker 'b20',vect_breg+20 + symbol_maker 'b21',vect_breg+21 + symbol_maker 'b22',vect_breg+22 + symbol_maker 'b23',vect_breg+23 + symbol_maker 'b24',vect_breg+24 + symbol_maker 'b25',vect_breg+25 + symbol_maker 'b26',vect_breg+26 + symbol_maker 'b27',vect_breg+27 + symbol_maker 'b28',vect_breg+28 + symbol_maker 'b29',vect_breg+29 + symbol_maker 'b30',vect_breg+30 + symbol_maker 'b31',vect_breg+31 + symbol_maker 'c10',cpro_reg+10 + symbol_maker 'c11',cpro_reg+11 + symbol_maker 'c12',cpro_reg+12 + symbol_maker 'c13',cpro_reg+13 + symbol_maker 'c14',cpro_reg+14 + symbol_maker 'c15',cpro_reg+15 + symbol_maker 'csw',sys_dc+(sys_encode_csw-sys_encode_table_dc) shr 1 + symbol_maker 'd10',vect_dreg+10 + symbol_maker 'd11',vect_dreg+11 + symbol_maker 'd12',vect_dreg+12 + symbol_maker 'd13',vect_dreg+13 + symbol_maker 'd14',vect_dreg+14 + symbol_maker 'd15',vect_dreg+15 + symbol_maker 'd16',vect_dreg+16 + symbol_maker 'd17',vect_dreg+17 + symbol_maker 'd18',vect_dreg+18 + symbol_maker 'd19',vect_dreg+19 + symbol_maker 'd20',vect_dreg+20 + symbol_maker 'd21',vect_dreg+21 + symbol_maker 'd22',vect_dreg+22 + symbol_maker 'd23',vect_dreg+23 + symbol_maker 'd24',vect_dreg+24 + symbol_maker 'd25',vect_dreg+25 + symbol_maker 'd26',vect_dreg+26 + symbol_maker 'd27',vect_dreg+27 + symbol_maker 'd28',vect_dreg+28 + symbol_maker 'd29',vect_dreg+29 + symbol_maker 'd30',vect_dreg+30 + symbol_maker 'd31',vect_dreg+31 + symbol_maker 'dll',1Bh shl 8 + 80h + symbol_maker 'efi',1Bh shl 10 + symbol_maker 'elf',18h shl 8 + 50h + symbol_maker 'fp!',base_reg!+11 + symbol_maker 'gui',1Bh shl 8 + 2 + symbol_maker 'h10',vect_hreg+10 + symbol_maker 'h11',vect_hreg+11 + symbol_maker 'h12',vect_hreg+12 + symbol_maker 'h13',vect_hreg+13 + symbol_maker 'h14',vect_hreg+14 + symbol_maker 'h15',vect_hreg+15 + symbol_maker 'h16',vect_hreg+16 + symbol_maker 'h17',vect_hreg+17 + symbol_maker 'h18',vect_hreg+18 + symbol_maker 'h19',vect_hreg+19 + symbol_maker 'h20',vect_hreg+20 + symbol_maker 'h21',vect_hreg+21 + symbol_maker 'h22',vect_hreg+22 + symbol_maker 'h23',vect_hreg+23 + symbol_maker 'h24',vect_hreg+24 + symbol_maker 'h25',vect_hreg+25 + symbol_maker 'h26',vect_hreg+26 + symbol_maker 'h27',vect_hreg+27 + symbol_maker 'h28',vect_hreg+28 + symbol_maker 'h29',vect_hreg+29 + symbol_maker 'h30',vect_hreg+30 + symbol_maker 'h31',vect_hreg+31 + symbol_maker 'ip!',base_reg!+12 + symbol_maker 'ish',barrier+1011b + symbol_maker 'isw',sys_dc+(sys_encode_isw-sys_encode_table_dc) shr 1 + symbol_maker 'lr!',base_reg!+14 + symbol_maker 'lsl',shift_op+0 + symbol_maker 'lsr',shift_op+1 + symbol_maker 'msl',msl_op+0 + symbol_maker 'msp',sysm_reg+8 + symbol_maker 'nsh',barrier+0111b + symbol_maker 'osh',barrier+0011b + symbol_maker 'p10',cpro_sel+10 + symbol_maker 'p11',cpro_sel+11 + symbol_maker 'p12',cpro_sel+12 + symbol_maker 'p13',cpro_sel+13 + symbol_maker 'p14',cpro_sel+14 + symbol_maker 'p15',cpro_sel+15 + symbol_maker 'pc!',base_reg!+15 + symbol_maker 'psp',sysm_reg+9 + symbol_maker 'q10',vect_qreg+10 + symbol_maker 'q11',vect_qreg+11 + symbol_maker 'q12',vect_qreg+12 + symbol_maker 'q13',vect_qreg+13 + symbol_maker 'q14',vect_qreg+14 + symbol_maker 'q15',vect_qreg+15 + symbol_maker 'q16',vect_qreg+16 + symbol_maker 'q17',vect_qreg+17 + symbol_maker 'q18',vect_qreg+18 + symbol_maker 'q19',vect_qreg+19 + symbol_maker 'q20',vect_qreg+20 + symbol_maker 'q21',vect_qreg+21 + symbol_maker 'q22',vect_qreg+22 + symbol_maker 'q23',vect_qreg+23 + symbol_maker 'q24',vect_qreg+24 + symbol_maker 'q25',vect_qreg+25 + symbol_maker 'q26',vect_qreg+26 + symbol_maker 'q27',vect_qreg+27 + symbol_maker 'q28',vect_qreg+28 + symbol_maker 'q29',vect_qreg+29 + symbol_maker 'q30',vect_qreg+30 + symbol_maker 'q31',vect_qreg+31 + symbol_maker 'r0!',base_reg!+0 + symbol_maker 'r1!',base_reg!+1 + symbol_maker 'r10',base_reg+10 + symbol_maker 'r11',base_reg+11 + symbol_maker 'r12',base_reg+12 + symbol_maker 'r13',base_reg+13 + symbol_maker 'r14',base_reg+14 + symbol_maker 'r15',base_reg+15 + symbol_maker 'r2!',base_reg!+2 + symbol_maker 'r3!',base_reg!+3 + symbol_maker 'r4!',base_reg!+4 + symbol_maker 'r5!',base_reg!+5 + symbol_maker 'r6!',base_reg!+6 + symbol_maker 'r7!',base_reg!+7 + symbol_maker 'r8!',base_reg!+8 + symbol_maker 'r9!',base_reg!+9 + symbol_maker 'ror',shift_op+3 + symbol_maker 'rrx',rrx_op+0 + symbol_maker 's10',vect_sreg+10 + symbol_maker 's11',vect_sreg+11 + symbol_maker 's12',vect_sreg+12 + symbol_maker 's13',vect_sreg+13 + symbol_maker 's14',vect_sreg+14 + symbol_maker 's15',vect_sreg+15 + symbol_maker 's16',vect_sreg+16 + symbol_maker 's17',vect_sreg+17 + symbol_maker 's18',vect_sreg+18 + symbol_maker 's19',vect_sreg+19 + symbol_maker 's20',vect_sreg+20 + symbol_maker 's21',vect_sreg+21 + symbol_maker 's22',vect_sreg+22 + symbol_maker 's23',vect_sreg+23 + symbol_maker 's24',vect_sreg+24 + symbol_maker 's25',vect_sreg+25 + symbol_maker 's26',vect_sreg+26 + symbol_maker 's27',vect_sreg+27 + symbol_maker 's28',vect_sreg+28 + symbol_maker 's29',vect_sreg+29 + symbol_maker 's30',vect_sreg+30 + symbol_maker 's31',vect_sreg+31 + symbol_maker 'sb!',base_reg!+9 + symbol_maker 'sl!',base_reg!+10 + symbol_maker 'sp!',base_reg!+13 + symbol_maker 'v1!',base_reg!+4 + symbol_maker 'v2!',base_reg!+5 + symbol_maker 'v3!',base_reg!+6 + symbol_maker 'v4!',base_reg!+7 + symbol_maker 'v5!',base_reg!+8 + symbol_maker 'v6!',base_reg!+9 + symbol_maker 'v7!',base_reg!+10 + symbol_maker 'v8!',base_reg!+11 + symbol_maker 'w10',word_reg+10 + symbol_maker 'w11',word_reg+11 + symbol_maker 'w12',word_reg+12 + symbol_maker 'w13',word_reg+13 + symbol_maker 'w14',word_reg+14 + symbol_maker 'w15',word_reg+15 + symbol_maker 'w16',word_reg+16 + symbol_maker 'w17',word_reg+17 + symbol_maker 'w18',word_reg+18 + symbol_maker 'w19',word_reg+19 + symbol_maker 'w20',word_reg+20 + symbol_maker 'w21',word_reg+21 + symbol_maker 'w22',word_reg+22 + symbol_maker 'w23',word_reg+23 + symbol_maker 'w24',word_reg+24 + symbol_maker 'w25',word_reg+25 + symbol_maker 'w26',word_reg+26 + symbol_maker 'w27',word_reg+27 + symbol_maker 'w28',word_reg+28 + symbol_maker 'w29',word_reg+29 + symbol_maker 'w30',word_reg+30 + symbol_maker 'wdm',1Bh shl 8 + 81h + symbol_maker 'wr0',iwmmx_wreg+0 + symbol_maker 'wr1',iwmmx_wreg+1 + symbol_maker 'wr2',iwmmx_wreg+2 + symbol_maker 'wr3',iwmmx_wreg+3 + symbol_maker 'wr4',iwmmx_wreg+4 + symbol_maker 'wr5',iwmmx_wreg+5 + symbol_maker 'wr6',iwmmx_wreg+6 + symbol_maker 'wr7',iwmmx_wreg+7 + symbol_maker 'wr8',iwmmx_wreg+8 + symbol_maker 'wr9',iwmmx_wreg+9 + symbol_maker 'wsp',word_reg+32 + symbol_maker 'wzr',word_reg+31 + symbol_maker 'x10',dword_reg+10 + symbol_maker 'x11',dword_reg+11 + symbol_maker 'x12',dword_reg+12 + symbol_maker 'x13',dword_reg+13 + symbol_maker 'x14',dword_reg+14 + symbol_maker 'x15',dword_reg+15 + symbol_maker 'x16',dword_reg+16 + symbol_maker 'x17',dword_reg+17 + symbol_maker 'x18',dword_reg+18 + symbol_maker 'x19',dword_reg+19 + symbol_maker 'x20',dword_reg+20 + symbol_maker 'x21',dword_reg+21 + symbol_maker 'x22',dword_reg+22 + symbol_maker 'x23',dword_reg+23 + symbol_maker 'x24',dword_reg+24 + symbol_maker 'x25',dword_reg+25 + symbol_maker 'x26',dword_reg+26 + symbol_maker 'x27',dword_reg+27 + symbol_maker 'x28',dword_reg+28 + symbol_maker 'x29',dword_reg+29 + symbol_maker 'x30',dword_reg+30 + symbol_maker 'xzr',dword_reg+31 + symbol_maker 'zva',sys_dc+(sys_encode_zva-sys_encode_table_dc) shr 1 +symbols_4: + symbol_maker 'acc0',acc_40bt+0 + symbol_maker 'acc1',acc_40bt+1 + symbol_maker 'acc2',acc_40bt+2 + symbol_maker 'acc3',acc_40bt+3 + symbol_maker 'acc4',acc_40bt+4 + symbol_maker 'acc5',acc_40bt+5 + symbol_maker 'acc6',acc_40bt+6 + symbol_maker 'acc7',acc_40bt+7 + symbol_maker 'apsr',psr_reg+34 + symbol_maker 'byte',size_opr+1 + symbol_maker 'cisw',sys_dc+(sys_encode_cisw-sys_encode_table_dc) shr 1 + symbol_maker 'code',19h shl 8 + 5 + symbol_maker 'coff',18h shl 8 + 40h + symbol_maker 'cpsr',psr_reg+32 + symbol_maker 'cvac',sys_dc+(sys_encode_cvac-sys_encode_table_dc) shr 1 + symbol_maker 'cvau',sys_dc+(sys_encode_cvau-sys_encode_table_dc) shr 1 + symbol_maker 'daif',sys_msr+(sys_encode_daif-sys_encode_table_msr) shr 1 + symbol_maker 'data',19h shl 8 + 6 + symbol_maker 'epsr',sysm_reg+6 + symbol_maker 'fpcr',sys_msr+(sys_encode_fpcr-sys_encode_table_msr) shr 1 + symbol_maker 'fpsr',sys_msr+(sys_encode_fpsr-sys_encode_table_msr) shr 1 + symbol_maker 'ipsr',sysm_reg+5 + symbol_maker 'ivac',sys_dc+(sys_encode_ivac-sys_encode_table_dc) shr 1 + symbol_maker 'ivau',sys_ic+(sys_encode_ivau-sys_encode_table_ic) shr 1 + symbol_maker 'ms64',1Ch shl 8 + 49h + symbol_maker 'note',1Eh shl 8 + 4 + symbol_maker 'nzcv',sys_msr+(sys_encode_nzcv-sys_encode_table_msr) shr 1 + symbol_maker 'pe64',18h shl 8 + 3ch + symbol_maker 'r10!',base_reg!+10 + symbol_maker 'r11!',base_reg!+11 + symbol_maker 'r12!',base_reg!+12 + symbol_maker 'r13!',base_reg!+13 + symbol_maker 'r14!',base_reg!+14 + symbol_maker 'r15!',base_reg!+15 + symbol_maker 'spsr',psr_reg+33 + symbol_maker 'sxtb',xtnd_op+4 + symbol_maker 'sxth',xtnd_op+5 + symbol_maker 'sxtw',xtnd_op+6 + symbol_maker 'sxtx',xtnd_op+7 + symbol_maker 'syst',barrier+1110b + symbol_maker 'uxtb',xtnd_op+0 + symbol_maker 'uxth',xtnd_op+1 + symbol_maker 'uxtw',xtnd_op+2 + symbol_maker 'uxtx',xtnd_op+3 + symbol_maker 'v0.b',vect_vb+0 + symbol_maker 'v0.d',vect_vd+0 + symbol_maker 'v0.h',vect_vh+0 + symbol_maker 'v0.s',vect_vs+0 + symbol_maker 'v1.b',vect_vb+1 + symbol_maker 'v1.d',vect_vd+1 + symbol_maker 'v1.h',vect_vh+1 + symbol_maker 'v1.s',vect_vs+1 + symbol_maker 'v2.b',vect_vb+2 + symbol_maker 'v2.d',vect_vd+2 + symbol_maker 'v2.h',vect_vh+2 + symbol_maker 'v2.s',vect_vs+2 + symbol_maker 'v3.b',vect_vb+3 + symbol_maker 'v3.d',vect_vd+3 + symbol_maker 'v3.h',vect_vh+3 + symbol_maker 'v3.s',vect_vs+3 + symbol_maker 'v4.b',vect_vb+4 + symbol_maker 'v4.d',vect_vd+4 + symbol_maker 'v4.h',vect_vh+4 + symbol_maker 'v4.s',vect_vs+4 + symbol_maker 'v5.b',vect_vb+5 + symbol_maker 'v5.d',vect_vd+5 + symbol_maker 'v5.h',vect_vh+5 + symbol_maker 'v5.s',vect_vs+5 + symbol_maker 'v6.b',vect_vb+6 + symbol_maker 'v6.d',vect_vd+6 + symbol_maker 'v6.h',vect_vh+6 + symbol_maker 'v6.s',vect_vs+6 + symbol_maker 'v7.b',vect_vb+7 + symbol_maker 'v7.d',vect_vd+7 + symbol_maker 'v7.h',vect_vh+7 + symbol_maker 'v7.s',vect_vs+7 + symbol_maker 'v8.b',vect_vb+8 + symbol_maker 'v8.d',vect_vd+8 + symbol_maker 'v8.h',vect_vh+8 + symbol_maker 'v8.s',vect_vs+8 + symbol_maker 'v9.b',vect_vb+9 + symbol_maker 'v9.d',vect_vd+9 + symbol_maker 'v9.h',vect_vh+9 + symbol_maker 'v9.s',vect_vs+9 + symbol_maker 'vae1',sys_tlbi+(sys_encode_vae1-sys_encode_table_tlbi) shr 1 + symbol_maker 'vae2',sys_tlbi+(sys_encode_vae2-sys_encode_table_tlbi) shr 1 + symbol_maker 'vae3',sys_tlbi+(sys_encode_vae3-sys_encode_table_tlbi) shr 1 + symbol_maker 'wcid',iwmmx_creg+0 + symbol_maker 'wcon',iwmmx_creg+1 + symbol_maker 'word',size_opr+4 + symbol_maker 'wr10',iwmmx_wreg+10 + symbol_maker 'wr11',iwmmx_wreg+11 + symbol_maker 'wr12',iwmmx_wreg+12 + symbol_maker 'wr13',iwmmx_wreg+13 + symbol_maker 'wr14',iwmmx_wreg+14 + symbol_maker 'wr15',iwmmx_wreg+15 + symbol_maker 'xpsr',sysm_reg+3 +symbols_5: + symbol_maker 'alle1',sys_tlbi+(sys_encode_alle1-sys_encode_table_tlbi) shr 1 + symbol_maker 'alle2',sys_tlbi+(sys_encode_alle2-sys_encode_table_tlbi) shr 1 + symbol_maker 'alle3',sys_tlbi+(sys_encode_alle3-sys_encode_table_tlbi) shr 1 + symbol_maker 'civac',sys_dc+(sys_encode_civac-sys_encode_table_dc) shr 1 + symbol_maker 'dspsc',mvrk_psc+0 + symbol_maker 'dwarf',19h shl 8 + 0C0h + symbol_maker 'dword',size_opr+8 + symbol_maker 'eapsr',sysm_reg+2 + symbol_maker 'elf64',18h shl 8 + 58h + symbol_maker 'fpexc',vfp_syst+8 + symbol_maker 'fpscr',vfp_syst+1 + symbol_maker 'fpsid',vfp_syst+0 + symbol_maker 'hword',size_opr+2 + symbol_maker 'iallu',sys_ic+(sys_encode_iallu-sys_encode_table_ic) shr 1 + symbol_maker 'iapsr',sysm_reg+1 + symbol_maker 'iepsr',sysm_reg+7 + symbol_maker 'ishld',barrier+1001b + symbol_maker 'ishst',barrier+1010b + symbol_maker 'large',1Bh shl 8 + 82h + symbol_maker 'mvfr0',vfp_syst+7 + symbol_maker 'mvfr1',vfp_syst+6 + symbol_maker 'nshld',barrier+0101b + symbol_maker 'nshst',barrier+0110b + symbol_maker 'oshld',barrier+0001b + symbol_maker 'oshst',barrier+0010b + symbol_maker 'qword',size_opr+16 + symbol_maker 'r0@16',base_@16+0 + symbol_maker 'r0@32',base_@32+0 + symbol_maker 'r0@64',base_@64+0 + symbol_maker 'r1@16',base_@16+1 + symbol_maker 'r1@32',base_@32+1 + symbol_maker 'r1@64',base_@64+1 + symbol_maker 'r2@16',base_@16+2 + symbol_maker 'r2@32',base_@32+2 + symbol_maker 'r2@64',base_@64+2 + symbol_maker 'r3@16',base_@16+3 + symbol_maker 'r3@32',base_@32+3 + symbol_maker 'r3@64',base_@64+3 + symbol_maker 'r4@16',base_@16+4 + symbol_maker 'r4@32',base_@32+4 + symbol_maker 'r4@64',base_@64+4 + symbol_maker 'r5@16',base_@16+5 + symbol_maker 'r5@32',base_@32+5 + symbol_maker 'r5@64',base_@64+5 + symbol_maker 'r6@16',base_@16+6 + symbol_maker 'r6@32',base_@32+6 + symbol_maker 'r6@64',base_@64+6 + symbol_maker 'r7@16',base_@16+7 + symbol_maker 'r7@32',base_@32+7 + symbol_maker 'r7@64',base_@64+7 + symbol_maker 'r8@16',base_@16+8 + symbol_maker 'r8@32',base_@32+8 + symbol_maker 'r8@64',base_@64+8 + symbol_maker 'r9@16',base_@16+9 + symbol_maker 'r9@32',base_@32+9 + symbol_maker 'r9@64',base_@64+9 + symbol_maker 's1e0r',sys_at+(sys_encode_s1e0r-sys_encode_table_at) shr 1 + symbol_maker 's1e0w',sys_at+(sys_encode_s1e0w-sys_encode_table_at) shr 1 + symbol_maker 's1e1r',sys_at+(sys_encode_s1e1r-sys_encode_table_at) shr 1 + symbol_maker 's1e1w',sys_at+(sys_encode_s1e1w-sys_encode_table_at) shr 1 + symbol_maker 's1e2r',sys_at+(sys_encode_s1e2r-sys_encode_table_at) shr 1 + symbol_maker 's1e2w',sys_at+(sys_encode_s1e2w-sys_encode_table_at) shr 1 + symbol_maker 's1e3r',sys_at+(sys_encode_s1e3r-sys_encode_table_at) shr 1 + symbol_maker 's1e3w',sys_at+(sys_encode_s1e3w-sys_encode_table_at) shr 1 + symbol_maker 'spsel',sys_msr+(sys_encode_spsel-sys_encode_table_msr) shr 1 +;; symbol_maker 'spsel',sys_pstate+(sys_pencode_spsel-sys_encode_table_pstate) shr 1 + symbol_maker 'v0.1d',vect_v1d+0 + symbol_maker 'v0.1q',vect_v1q+0 + symbol_maker 'v0.2d',vect_v2d+0 + symbol_maker 'v0.2s',vect_v2s+0 + symbol_maker 'v0.4h',vect_v4h+0 + symbol_maker 'v0.4s',vect_v4s+0 + symbol_maker 'v0.8b',vect_v8b+0 + symbol_maker 'v0.8h',vect_v8h+0 + symbol_maker 'v1.1d',vect_v1d+1 + symbol_maker 'v1.1q',vect_v1q+1 + symbol_maker 'v1.2d',vect_v2d+1 + symbol_maker 'v1.2s',vect_v2s+1 + symbol_maker 'v1.4h',vect_v4h+1 + symbol_maker 'v1.4s',vect_v4s+1 + symbol_maker 'v1.8b',vect_v8b+1 + symbol_maker 'v1.8h',vect_v8h+1 + symbol_maker 'v10.b',vect_vb+10 + symbol_maker 'v10.d',vect_vd+10 + symbol_maker 'v10.h',vect_vh+10 + symbol_maker 'v10.s',vect_vs+10 + symbol_maker 'v11.b',vect_vb+11 + symbol_maker 'v11.d',vect_vd+11 + symbol_maker 'v11.h',vect_vh+11 + symbol_maker 'v11.s',vect_vs+11 + symbol_maker 'v12.b',vect_vb+12 + symbol_maker 'v12.d',vect_vd+12 + symbol_maker 'v12.h',vect_vh+12 + symbol_maker 'v12.s',vect_vs+12 + symbol_maker 'v13.b',vect_vb+13 + symbol_maker 'v13.d',vect_vd+13 + symbol_maker 'v13.h',vect_vh+13 + symbol_maker 'v13.s',vect_vs+13 + symbol_maker 'v14.b',vect_vb+14 + symbol_maker 'v14.d',vect_vd+14 + symbol_maker 'v14.h',vect_vh+14 + symbol_maker 'v14.s',vect_vs+14 + symbol_maker 'v15.b',vect_vb+15 + symbol_maker 'v15.d',vect_vd+15 + symbol_maker 'v15.h',vect_vh+15 + symbol_maker 'v15.s',vect_vs+15 + symbol_maker 'v16.b',vect_vb+16 + symbol_maker 'v16.d',vect_vd+16 + symbol_maker 'v16.h',vect_vh+16 + symbol_maker 'v16.s',vect_vs+16 + symbol_maker 'v17.b',vect_vb+17 + symbol_maker 'v17.d',vect_vd+17 + symbol_maker 'v17.h',vect_vh+17 + symbol_maker 'v17.s',vect_vs+17 + symbol_maker 'v18.b',vect_vb+18 + symbol_maker 'v18.d',vect_vd+18 + symbol_maker 'v18.h',vect_vh+18 + symbol_maker 'v18.s',vect_vs+18 + symbol_maker 'v19.b',vect_vb+19 + symbol_maker 'v19.d',vect_vd+19 + symbol_maker 'v19.h',vect_vh+19 + symbol_maker 'v19.s',vect_vs+19 + symbol_maker 'v2.1d',vect_v1d+2 + symbol_maker 'v2.1q',vect_v1q+2 + symbol_maker 'v2.2d',vect_v2d+2 + symbol_maker 'v2.2s',vect_v2s+2 + symbol_maker 'v2.4h',vect_v4h+2 + symbol_maker 'v2.4s',vect_v4s+2 + symbol_maker 'v2.8b',vect_v8b+2 + symbol_maker 'v2.8h',vect_v8h+2 + symbol_maker 'v20.b',vect_vb+20 + symbol_maker 'v20.d',vect_vd+20 + symbol_maker 'v20.h',vect_vh+20 + symbol_maker 'v20.s',vect_vs+20 + symbol_maker 'v21.b',vect_vb+21 + symbol_maker 'v21.d',vect_vd+21 + symbol_maker 'v21.h',vect_vh+21 + symbol_maker 'v21.s',vect_vs+21 + symbol_maker 'v22.b',vect_vb+22 + symbol_maker 'v22.d',vect_vd+22 + symbol_maker 'v22.h',vect_vh+22 + symbol_maker 'v22.s',vect_vs+22 + symbol_maker 'v23.b',vect_vb+23 + symbol_maker 'v23.d',vect_vd+23 + symbol_maker 'v23.h',vect_vh+23 + symbol_maker 'v23.s',vect_vs+23 + symbol_maker 'v24.b',vect_vb+24 + symbol_maker 'v24.d',vect_vd+24 + symbol_maker 'v24.h',vect_vh+24 + symbol_maker 'v24.s',vect_vs+24 + symbol_maker 'v25.b',vect_vb+25 + symbol_maker 'v25.d',vect_vd+25 + symbol_maker 'v25.h',vect_vh+25 + symbol_maker 'v25.s',vect_vs+25 + symbol_maker 'v26.b',vect_vb+26 + symbol_maker 'v26.d',vect_vd+26 + symbol_maker 'v26.h',vect_vh+26 + symbol_maker 'v26.s',vect_vs+26 + symbol_maker 'v27.b',vect_vb+27 + symbol_maker 'v27.d',vect_vd+27 + symbol_maker 'v27.h',vect_vh+27 + symbol_maker 'v27.s',vect_vs+27 + symbol_maker 'v28.b',vect_vb+28 + symbol_maker 'v28.d',vect_vd+28 + symbol_maker 'v28.h',vect_vh+28 + symbol_maker 'v28.s',vect_vs+28 + symbol_maker 'v29.b',vect_vb+29 + symbol_maker 'v29.d',vect_vd+29 + symbol_maker 'v29.h',vect_vh+29 + symbol_maker 'v29.s',vect_vs+29 + symbol_maker 'v3.1d',vect_v1d+3 + symbol_maker 'v3.1q',vect_v1q+3 + symbol_maker 'v3.2d',vect_v2d+3 + symbol_maker 'v3.2s',vect_v2s+3 + symbol_maker 'v3.4h',vect_v4h+3 + symbol_maker 'v3.4s',vect_v4s+3 + symbol_maker 'v3.8b',vect_v8b+3 + symbol_maker 'v3.8h',vect_v8h+3 + symbol_maker 'v30.b',vect_vb+30 + symbol_maker 'v30.d',vect_vd+30 + symbol_maker 'v30.h',vect_vh+30 + symbol_maker 'v30.s',vect_vs+30 + symbol_maker 'v31.b',vect_vb+31 + symbol_maker 'v31.d',vect_vd+31 + symbol_maker 'v31.h',vect_vh+31 + symbol_maker 'v31.s',vect_vs+31 + symbol_maker 'v4.1d',vect_v1d+4 + symbol_maker 'v4.1q',vect_v1q+4 + symbol_maker 'v4.2d',vect_v2d+4 + symbol_maker 'v4.2s',vect_v2s+4 + symbol_maker 'v4.4h',vect_v4h+4 + symbol_maker 'v4.4s',vect_v4s+4 + symbol_maker 'v4.8b',vect_v8b+4 + symbol_maker 'v4.8h',vect_v8h+4 + symbol_maker 'v5.1d',vect_v1d+5 + symbol_maker 'v5.1q',vect_v1q+5 + symbol_maker 'v5.2d',vect_v2d+5 + symbol_maker 'v5.2s',vect_v2s+5 + symbol_maker 'v5.4h',vect_v4h+5 + symbol_maker 'v5.4s',vect_v4s+5 + symbol_maker 'v5.8b',vect_v8b+5 + symbol_maker 'v5.8h',vect_v8h+5 + symbol_maker 'v6.1d',vect_v1d+6 + symbol_maker 'v6.1q',vect_v1q+6 + symbol_maker 'v6.2d',vect_v2d+6 + symbol_maker 'v6.2s',vect_v2s+6 + symbol_maker 'v6.4h',vect_v4h+6 + symbol_maker 'v6.4s',vect_v4s+6 + symbol_maker 'v6.8b',vect_v8b+6 + symbol_maker 'v6.8h',vect_v8h+6 + symbol_maker 'v7.1d',vect_v1d+7 + symbol_maker 'v7.1q',vect_v1q+7 + symbol_maker 'v7.2d',vect_v2d+7 + symbol_maker 'v7.2s',vect_v2s+7 + symbol_maker 'v7.4h',vect_v4h+7 + symbol_maker 'v7.4s',vect_v4s+7 + symbol_maker 'v7.8b',vect_v8b+7 + symbol_maker 'v7.8h',vect_v8h+7 + symbol_maker 'v8.1d',vect_v1d+8 + symbol_maker 'v8.1q',vect_v1q+8 + symbol_maker 'v8.2d',vect_v2d+8 + symbol_maker 'v8.2s',vect_v2s+8 + symbol_maker 'v8.4h',vect_v4h+8 + symbol_maker 'v8.4s',vect_v4s+8 + symbol_maker 'v8.8b',vect_v8b+8 + symbol_maker 'v8.8h',vect_v8h+8 + symbol_maker 'v9.1d',vect_v1d+9 + symbol_maker 'v9.1q',vect_v1q+9 + symbol_maker 'v9.2d',vect_v2d+9 + symbol_maker 'v9.2s',vect_v2s+9 + symbol_maker 'v9.4h',vect_v4h+9 + symbol_maker 'v9.4s',vect_v4s+9 + symbol_maker 'v9.8b',vect_v8b+9 + symbol_maker 'v9.8h',vect_v8h+9 + symbol_maker 'vaae1',sys_tlbi+(sys_encode_vaae1-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale1',sys_tlbi+(sys_encode_vale1-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale2',sys_tlbi+(sys_encode_vale2-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale3',sys_tlbi+(sys_encode_vale3-sys_encode_table_tlbi) shr 1 + symbol_maker 'wcasf',iwmmx_creg+3 + symbol_maker 'wcgr0',iwmmx_creg+8 + symbol_maker 'wcgr1',iwmmx_creg+9 + symbol_maker 'wcgr2',iwmmx_creg+10 + symbol_maker 'wcgr3',iwmmx_creg+11 + symbol_maker 'wcssf',iwmmx_creg+2 +symbols_6: + symbol_maker 'apsr_g',psr_reg+4 + symbol_maker 'aside1',sys_tlbi+(sys_encode_aside1-sys_encode_table_tlbi) shr 1 + symbol_maker 'binary',18h shl 8 + 10h + symbol_maker 'cpsr_c',psr_reg+1 + symbol_maker 'cpsr_f',psr_reg+8 + symbol_maker 'cpsr_s',psr_reg+4 + symbol_maker 'cpsr_x',psr_reg+2 + symbol_maker 'dqword',size_opr+32 + symbol_maker 'export',1Ah shl 8 + 0 + symbol_maker 'fixups',1Ah shl 8 + 5 + symbol_maker 'fpinst',vfp_syst+9 + symbol_maker 'import',1Ah shl 8 + 1 + symbol_maker 'lr_abt',banked_reg+20 + symbol_maker 'lr_fiq',banked_reg+14 + symbol_maker 'lr_irq',banked_reg+16 + symbol_maker 'lr_mon',banked_reg+28 + symbol_maker 'lr_svc',banked_reg+18 + symbol_maker 'lr_und',banked_reg+22 + symbol_maker 'lr_usr',banked_reg+6 + symbol_maker 'native',1Bh shl 8 + 1 + symbol_maker 'r0@128',base_@128+0 + symbol_maker 'r0@256',base_@256+0 + symbol_maker 'r10@16',base_@16+10 + symbol_maker 'r10@32',base_@32+10 + symbol_maker 'r10@64',base_@64+10 + symbol_maker 'r11@16',base_@16+11 + symbol_maker 'r11@32',base_@32+11 + symbol_maker 'r11@64',base_@64+11 + symbol_maker 'r12@16',base_@16+12 + symbol_maker 'r12@32',base_@32+12 + symbol_maker 'r12@64',base_@64+12 + symbol_maker 'r13@16',base_@16+13 + symbol_maker 'r13@32',base_@32+13 + symbol_maker 'r13@64',base_@64+13 + symbol_maker 'r14@16',base_@16+14 + symbol_maker 'r14@32',base_@32+14 + symbol_maker 'r14@64',base_@64+14 + symbol_maker 'r15@16',base_@16+15 + symbol_maker 'r15@32',base_@32+15 + symbol_maker 'r15@64',base_@64+15 + symbol_maker 'r1@128',base_@128+1 + symbol_maker 'r1@256',base_@256+1 + symbol_maker 'r2@128',base_@128+2 + symbol_maker 'r2@256',base_@256+2 + symbol_maker 'r3@128',base_@128+3 + symbol_maker 'r3@256',base_@256+3 + symbol_maker 'r4@128',base_@128+4 + symbol_maker 'r4@256',base_@256+4 + symbol_maker 'r5@128',base_@128+5 + symbol_maker 'r5@256',base_@256+5 + symbol_maker 'r6@128',base_@128+6 + symbol_maker 'r6@256',base_@256+6 + symbol_maker 'r7@128',base_@128+7 + symbol_maker 'r7@256',base_@256+7 + symbol_maker 'r8@128',base_@128+8 + symbol_maker 'r8@256',base_@256+8 + symbol_maker 'r8_fiq',banked_reg+8 + symbol_maker 'r8_usr',banked_reg+0 + symbol_maker 'r9@128',base_@128+9 + symbol_maker 'r9@256',base_@256+9 + symbol_maker 'r9_fiq',banked_reg+9 + symbol_maker 'r9_usr',banked_reg+1 + symbol_maker 's12e0r',sys_at+(sys_encode_s12e0r-sys_encode_table_at) shr 1 + symbol_maker 's12e0w',sys_at+(sys_encode_s12e0w-sys_encode_table_at) shr 1 + symbol_maker 's12e1r',sys_at+(sys_encode_s12e1r-sys_encode_table_at) shr 1 + symbol_maker 's12e1w',sys_at+(sys_encode_s12e1w-sys_encode_table_at) shr 1 + symbol_maker 'sp_abt',banked_reg+21 + symbol_maker 'sp_el0',sys_msr+(sys_encode_sp_el0-sys_encode_table_msr) shr 1 + symbol_maker 'sp_el1',sys_msr+(sys_encode_sp_el1-sys_encode_table_msr) shr 1 + symbol_maker 'sp_el2',sys_msr+(sys_encode_sp_el2-sys_encode_table_msr) shr 1 + symbol_maker 'sp_fiq',banked_reg+13 + symbol_maker 'sp_hyp',banked_reg+31 + symbol_maker 'sp_irq',banked_reg+17 + symbol_maker 'sp_mon',banked_reg+29 + symbol_maker 'sp_svc',banked_reg+19 + symbol_maker 'sp_und',banked_reg+23 + symbol_maker 'sp_usr',banked_reg+5 + symbol_maker 'spsr_c',psr_reg+1 + symbol_maker 'spsr_f',psr_reg+8 + symbol_maker 'spsr_s',psr_reg+4 + symbol_maker 'spsr_x',psr_reg+2 + symbol_maker 'static',1Dh shl 8 + 1 + symbol_maker 'v0.16b',vect_v16b+0 + symbol_maker 'v1.16b',vect_v16b+1 + symbol_maker 'v10.1d',vect_v1d+10 + symbol_maker 'v10.1q',vect_v1q+20 + symbol_maker 'v10.2d',vect_v2d+10 + symbol_maker 'v10.2s',vect_v2s+10 + symbol_maker 'v10.4h',vect_v4h+10 + symbol_maker 'v10.4s',vect_v4s+10 + symbol_maker 'v10.8b',vect_v8b+10 + symbol_maker 'v10.8h',vect_v8h+10 + symbol_maker 'v11.1d',vect_v1d+11 + symbol_maker 'v11.1q',vect_v1q+21 + symbol_maker 'v11.2d',vect_v2d+11 + symbol_maker 'v11.2s',vect_v2s+11 + symbol_maker 'v11.4h',vect_v4h+11 + symbol_maker 'v11.4s',vect_v4s+11 + symbol_maker 'v11.8b',vect_v8b+11 + symbol_maker 'v11.8h',vect_v8h+11 + symbol_maker 'v12.1d',vect_v1d+12 + symbol_maker 'v12.1q',vect_v1q+22 + symbol_maker 'v12.2d',vect_v2d+12 + symbol_maker 'v12.2s',vect_v2s+12 + symbol_maker 'v12.4h',vect_v4h+12 + symbol_maker 'v12.4s',vect_v4s+12 + symbol_maker 'v12.8b',vect_v8b+12 + symbol_maker 'v12.8h',vect_v8h+12 + symbol_maker 'v13.1d',vect_v1d+13 + symbol_maker 'v13.1q',vect_v1q+23 + symbol_maker 'v13.2d',vect_v2d+13 + symbol_maker 'v13.2s',vect_v2s+13 + symbol_maker 'v13.4h',vect_v4h+13 + symbol_maker 'v13.4s',vect_v4s+13 + symbol_maker 'v13.8b',vect_v8b+13 + symbol_maker 'v13.8h',vect_v8h+13 + symbol_maker 'v14.1d',vect_v1d+14 + symbol_maker 'v14.1q',vect_v1q+24 + symbol_maker 'v14.2d',vect_v2d+14 + symbol_maker 'v14.2s',vect_v2s+14 + symbol_maker 'v14.4h',vect_v4h+14 + symbol_maker 'v14.4s',vect_v4s+14 + symbol_maker 'v14.8b',vect_v8b+14 + symbol_maker 'v14.8h',vect_v8h+14 + symbol_maker 'v15.1d',vect_v1d+15 + symbol_maker 'v15.1q',vect_v1q+25 + symbol_maker 'v15.2d',vect_v2d+15 + symbol_maker 'v15.2s',vect_v2s+15 + symbol_maker 'v15.4h',vect_v4h+15 + symbol_maker 'v15.4s',vect_v4s+15 + symbol_maker 'v15.8b',vect_v8b+15 + symbol_maker 'v15.8h',vect_v8h+15 + symbol_maker 'v16.1d',vect_v1d+16 + symbol_maker 'v16.1q',vect_v1q+26 + symbol_maker 'v16.2d',vect_v2d+16 + symbol_maker 'v16.2s',vect_v2s+16 + symbol_maker 'v16.4h',vect_v4h+16 + symbol_maker 'v16.4s',vect_v4s+16 + symbol_maker 'v16.8b',vect_v8b+16 + symbol_maker 'v16.8h',vect_v8h+16 + symbol_maker 'v17.1d',vect_v1d+17 + symbol_maker 'v17.1q',vect_v1q+27 + symbol_maker 'v17.2d',vect_v2d+17 + symbol_maker 'v17.2s',vect_v2s+17 + symbol_maker 'v17.4h',vect_v4h+17 + symbol_maker 'v17.4s',vect_v4s+17 + symbol_maker 'v17.8b',vect_v8b+17 + symbol_maker 'v17.8h',vect_v8h+17 + symbol_maker 'v18.1d',vect_v1d+18 + symbol_maker 'v18.1q',vect_v1q+28 + symbol_maker 'v18.2d',vect_v2d+18 + symbol_maker 'v18.2s',vect_v2s+18 + symbol_maker 'v18.4h',vect_v4h+18 + symbol_maker 'v18.4s',vect_v4s+18 + symbol_maker 'v18.8b',vect_v8b+18 + symbol_maker 'v18.8h',vect_v8h+18 + symbol_maker 'v19.1d',vect_v1d+19 + symbol_maker 'v19.1q',vect_v1q+29 + symbol_maker 'v19.2d',vect_v2d+19 + symbol_maker 'v19.2s',vect_v2s+19 + symbol_maker 'v19.4h',vect_v4h+19 + symbol_maker 'v19.4s',vect_v4s+19 + symbol_maker 'v19.8b',vect_v8b+19 + symbol_maker 'v19.8h',vect_v8h+19 + symbol_maker 'v2.16b',vect_v16b+2 + symbol_maker 'v20.1d',vect_v1d+20 + symbol_maker 'v20.1q',vect_v1q+20 + symbol_maker 'v20.2d',vect_v2d+20 + symbol_maker 'v20.2s',vect_v2s+20 + symbol_maker 'v20.4h',vect_v4h+20 + symbol_maker 'v20.4s',vect_v4s+20 + symbol_maker 'v20.8b',vect_v8b+20 + symbol_maker 'v20.8h',vect_v8h+20 + symbol_maker 'v21.1d',vect_v1d+21 + symbol_maker 'v21.1q',vect_v1q+21 + symbol_maker 'v21.2d',vect_v2d+21 + symbol_maker 'v21.2s',vect_v2s+21 + symbol_maker 'v21.4h',vect_v4h+21 + symbol_maker 'v21.4s',vect_v4s+21 + symbol_maker 'v21.8b',vect_v8b+21 + symbol_maker 'v21.8h',vect_v8h+21 + symbol_maker 'v22.1d',vect_v1d+22 + symbol_maker 'v22.1q',vect_v1q+22 + symbol_maker 'v22.2d',vect_v2d+22 + symbol_maker 'v22.2s',vect_v2s+22 + symbol_maker 'v22.4h',vect_v4h+22 + symbol_maker 'v22.4s',vect_v4s+22 + symbol_maker 'v22.8b',vect_v8b+22 + symbol_maker 'v22.8h',vect_v8h+22 + symbol_maker 'v23.1d',vect_v1d+23 + symbol_maker 'v23.1q',vect_v1q+23 + symbol_maker 'v23.2d',vect_v2d+23 + symbol_maker 'v23.2s',vect_v2s+23 + symbol_maker 'v23.4h',vect_v4h+23 + symbol_maker 'v23.4s',vect_v4s+23 + symbol_maker 'v23.8b',vect_v8b+23 + symbol_maker 'v23.8h',vect_v8h+23 + symbol_maker 'v24.1d',vect_v1d+24 + symbol_maker 'v24.1q',vect_v1q+24 + symbol_maker 'v24.2d',vect_v2d+24 + symbol_maker 'v24.2s',vect_v2s+24 + symbol_maker 'v24.4h',vect_v4h+24 + symbol_maker 'v24.4s',vect_v4s+24 + symbol_maker 'v24.8b',vect_v8b+24 + symbol_maker 'v24.8h',vect_v8h+24 + symbol_maker 'v25.1d',vect_v1d+25 + symbol_maker 'v25.1q',vect_v1q+25 + symbol_maker 'v25.2d',vect_v2d+25 + symbol_maker 'v25.2s',vect_v2s+25 + symbol_maker 'v25.4h',vect_v4h+25 + symbol_maker 'v25.4s',vect_v4s+25 + symbol_maker 'v25.8b',vect_v8b+25 + symbol_maker 'v25.8h',vect_v8h+25 + symbol_maker 'v26.1d',vect_v1d+26 + symbol_maker 'v26.1q',vect_v1q+26 + symbol_maker 'v26.2d',vect_v2d+26 + symbol_maker 'v26.2s',vect_v2s+26 + symbol_maker 'v26.4h',vect_v4h+26 + symbol_maker 'v26.4s',vect_v4s+26 + symbol_maker 'v26.8b',vect_v8b+26 + symbol_maker 'v26.8h',vect_v8h+26 + symbol_maker 'v27.1d',vect_v1d+27 + symbol_maker 'v27.1q',vect_v1q+27 + symbol_maker 'v27.2d',vect_v2d+27 + symbol_maker 'v27.2s',vect_v2s+27 + symbol_maker 'v27.4h',vect_v4h+27 + symbol_maker 'v27.4s',vect_v4s+27 + symbol_maker 'v27.8b',vect_v8b+27 + symbol_maker 'v27.8h',vect_v8h+27 + symbol_maker 'v28.1d',vect_v1d+28 + symbol_maker 'v28.1q',vect_v1q+28 + symbol_maker 'v28.2d',vect_v2d+28 + symbol_maker 'v28.2s',vect_v2s+28 + symbol_maker 'v28.4h',vect_v4h+28 + symbol_maker 'v28.4s',vect_v4s+28 + symbol_maker 'v28.8b',vect_v8b+28 + symbol_maker 'v28.8h',vect_v8h+28 + symbol_maker 'v29.1d',vect_v1d+29 + symbol_maker 'v29.1q',vect_v1q+29 + symbol_maker 'v29.2d',vect_v2d+29 + symbol_maker 'v29.2s',vect_v2s+29 + symbol_maker 'v29.4h',vect_v4h+29 + symbol_maker 'v29.4s',vect_v4s+29 + symbol_maker 'v29.8b',vect_v8b+29 + symbol_maker 'v29.8h',vect_v8h+29 + symbol_maker 'v3.16b',vect_v16b+3 + symbol_maker 'v30.1d',vect_v1d+30 + symbol_maker 'v30.1q',vect_v1q+30 + symbol_maker 'v30.2d',vect_v2d+30 + symbol_maker 'v30.2s',vect_v2s+30 + symbol_maker 'v30.4h',vect_v4h+30 + symbol_maker 'v30.4s',vect_v4s+30 + symbol_maker 'v30.8b',vect_v8b+30 + symbol_maker 'v30.8h',vect_v8h+30 + symbol_maker 'v31.1d',vect_v1d+31 + symbol_maker 'v31.1q',vect_v1q+31 + symbol_maker 'v31.2d',vect_v2d+31 + symbol_maker 'v31.2s',vect_v2s+31 + symbol_maker 'v31.4h',vect_v4h+31 + symbol_maker 'v31.4s',vect_v4s+31 + symbol_maker 'v31.8b',vect_v8b+31 + symbol_maker 'v31.8h',vect_v8h+31 + symbol_maker 'v4.16b',vect_v16b+4 + symbol_maker 'v5.16b',vect_v16b+5 + symbol_maker 'v6.16b',vect_v16b+6 + symbol_maker 'v7.16b',vect_v16b+7 + symbol_maker 'v8.16b',vect_v16b+8 + symbol_maker 'v9.16b',vect_v16b+9 + symbol_maker 'vaale1',sys_tlbi+(sys_encode_vaale1-sys_encode_table_tlbi) shr 1 + symbol_maker 'vae1is',sys_tlbi+(sys_encode_vae1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vae2is',sys_tlbi+(sys_encode_vae2is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vae3is',sys_tlbi+(sys_encode_vae3is-sys_encode_table_tlbi) shr 1 +symbols_7: + symbol_maker 'alle1is',sys_tlbi+(sys_encode_alle1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'alle2is',sys_tlbi+(sys_encode_alle2is-sys_encode_table_tlbi) shr 1 + symbol_maker 'alle3is',sys_tlbi+(sys_encode_alle3is-sys_encode_table_tlbi) shr 1 + symbol_maker 'basepri',sysm_reg+17 + symbol_maker 'console',1Bh shl 8 + 3 + symbol_maker 'control',sysm_reg+20 + symbol_maker 'cpsr_cf',psr_reg+1 + symbol_maker 'cpsr_cs',psr_reg+1 + symbol_maker 'cpsr_cx',psr_reg+1 + symbol_maker 'cpsr_fc',psr_reg+8 + symbol_maker 'cpsr_fs',psr_reg+8 + symbol_maker 'cpsr_fx',psr_reg+8 + symbol_maker 'cpsr_sc',psr_reg+4 + symbol_maker 'cpsr_sf',psr_reg+4 + symbol_maker 'cpsr_sx',psr_reg+4 + symbol_maker 'cpsr_xc',psr_reg+2 + symbol_maker 'cpsr_xf',psr_reg+2 + symbol_maker 'cpsr_xs',psr_reg+2 + symbol_maker 'cpu32_a',cpu_sel+CPU32_CAPABILITY_A + symbol_maker 'cpu32_e',cpu_sel+CPU32_CAPABILITY_E + symbol_maker 'cpu32_j',cpu_sel+CPU32_CAPABILITY_J + symbol_maker 'cpu32_k',cpu_sel+CPU32_CAPABILITY_K + symbol_maker 'cpu32_m',cpu_sel+CPU32_CAPABILITY_M + symbol_maker 'cpu32_p',cpu_sel+CPU32_CAPABILITY_P + symbol_maker 'cpu32_x',cpu_sel+CPU32_CAPABILITY_X + symbol_maker 'cpu32_z',cpu_sel+CPU32_CAPABILITY_Z + symbol_maker 'ctr_el0',sys_msr+(sys_encode_ctr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'daifclr',sys_pstate+(sys_pencode_daifclr-sys_encode_table_pstate) shr 1 + symbol_maker 'daifset',sys_pstate+(sys_pencode_daifset-sys_encode_table_pstate) shr 1 + symbol_maker 'dlr_el0',sys_msr+(sys_encode_dlr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'dynamic',1Eh shl 8 + 2 + symbol_maker 'efiboot',1Bh shl 8 + 11 + symbol_maker 'elr_el1',sys_msr+(sys_encode_elr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'elr_el2',sys_msr+(sys_encode_elr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'elr_el3',sys_msr+(sys_encode_elr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'elr_hyp',banked_reg+30 + symbol_maker 'esr_el1',sys_msr+(sys_encode_esr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'esr_el2',sys_msr+(sys_encode_esr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'esr_el3',sys_msr+(sys_encode_esr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'far_el1',sys_msr+(sys_encode_far_el1-sys_encode_table_msr) shr 1 + symbol_maker 'far_el2',sys_msr+(sys_encode_far_el2-sys_encode_table_msr) shr 1 + symbol_maker 'far_el3',sys_msr+(sys_encode_far_el3-sys_encode_table_msr) shr 1 + symbol_maker 'fpinst2',vfp_syst+10 + symbol_maker 'hcr_el2',sys_msr+(sys_encode_hcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ialluis',sys_ic+(sys_encode_ialluis-sys_encode_table_ic) shr 1 + symbol_maker 'ipas2e1',sys_tlbi+(sys_encode_ipas2e1-sys_encode_table_tlbi) shr 1 + symbol_maker 'isr_el1',sys_msr+(sys_encode_isr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'par_el1',sys_msr+(sys_encode_par_el1-sys_encode_table_msr) shr 1 + symbol_maker 'primask',sysm_reg+16 + symbol_maker 'r10@128',base_@128+10 + symbol_maker 'r10@256',base_@256+10 + symbol_maker 'r10_fiq',banked_reg+10 + symbol_maker 'r10_usr',banked_reg+2 + symbol_maker 'r11@128',base_@128+11 + symbol_maker 'r11@256',base_@256+11 + symbol_maker 'r11_fiq',banked_reg+11 + symbol_maker 'r11_usr',banked_reg+3 + symbol_maker 'r12@128',base_@128+12 + symbol_maker 'r12@256',base_@256+12 + symbol_maker 'r12_fiq',banked_reg+12 + symbol_maker 'r12_usr',banked_reg+4 + symbol_maker 'r13@128',base_@128+13 + symbol_maker 'r13@256',base_@256+13 + symbol_maker 'r14@128',base_@128+14 + symbol_maker 'r14@256',base_@256+14 + symbol_maker 'r15@128',base_@128+15 + symbol_maker 'r15@256',base_@256+15 + symbol_maker 'rmr_el1',sys_msr+(sys_encode_rmr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'rmr_el2',sys_msr+(sys_encode_rmr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'rmr_el3',sys_msr+(sys_encode_rmr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'scr_el3',sys_msr+(sys_encode_scr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_cf',psr_reg+16+8+1 + symbol_maker 'spsr_cs',psr_reg+16+4+1 + symbol_maker 'spsr_cx',psr_reg+16+2+1 + symbol_maker 'spsr_fc',psr_reg+16+1+8 + symbol_maker 'spsr_fs',psr_reg+16+4+8 + symbol_maker 'spsr_fx',psr_reg+16+2+8 + symbol_maker 'spsr_sc',psr_reg+16+1+4 + symbol_maker 'spsr_sf',psr_reg+16+8+4 + symbol_maker 'spsr_sx',psr_reg+16+2+4 + symbol_maker 'spsr_xc',psr_reg+16+1+2 + symbol_maker 'spsr_xf',psr_reg+16+8+2 + symbol_maker 'spsr_xs',psr_reg+16+4+2 + symbol_maker 'tcr_el1',sys_msr+(sys_encode_tcr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'tcr_el2',sys_msr+(sys_encode_tcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'tcr_el3',sys_msr+(sys_encode_tcr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'v10.16b',vect_v16b+10 + symbol_maker 'v11.16b',vect_v16b+11 + symbol_maker 'v12.16b',vect_v16b+12 + symbol_maker 'v13.16b',vect_v16b+13 + symbol_maker 'v14.16b',vect_v16b+14 + symbol_maker 'v15.16b',vect_v16b+15 + symbol_maker 'v16.16b',vect_v16b+16 + symbol_maker 'v17.16b',vect_v16b+17 + symbol_maker 'v18.16b',vect_v16b+18 + symbol_maker 'v19.16b',vect_v16b+19 + symbol_maker 'v20.16b',vect_v16b+20 + symbol_maker 'v21.16b',vect_v16b+21 + symbol_maker 'v22.16b',vect_v16b+22 + symbol_maker 'v23.16b',vect_v16b+23 + symbol_maker 'v24.16b',vect_v16b+24 + symbol_maker 'v25.16b',vect_v16b+25 + symbol_maker 'v26.16b',vect_v16b+26 + symbol_maker 'v27.16b',vect_v16b+27 + symbol_maker 'v28.16b',vect_v16b+28 + symbol_maker 'v29.16b',vect_v16b+29 + symbol_maker 'v30.16b',vect_v16b+30 + symbol_maker 'v31.16b',vect_v16b+31 + symbol_maker 'vaae1is',sys_tlbi+(sys_encode_vaae1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale1is',sys_tlbi+(sys_encode_vale1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale2is',sys_tlbi+(sys_encode_vale2is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vale3is',sys_tlbi+(sys_encode_vale3is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vmalle1',sys_tlbi+(sys_encode_vmalle1-sys_encode_table_tlbi) shr 1 +symbols_8: + symbol_maker 'aidr_el1',sys_msr+(sys_encode_aidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'aside1is',sys_tlbi+(sys_encode_aside1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'cpsr_all',psr_reg+8+1 + symbol_maker 'cpsr_cfs',psr_reg+8+4+1 + symbol_maker 'cpsr_cfx',psr_reg+8+2+1 + symbol_maker 'cpsr_csf',psr_reg+8+4+1 + symbol_maker 'cpsr_csx',psr_reg+4+2+1 + symbol_maker 'cpsr_ctl',psr_reg+1 + symbol_maker 'cpsr_cxf',psr_reg+8+2+1 + symbol_maker 'cpsr_cxs',psr_reg+4+2+1 + symbol_maker 'cpsr_fcs',psr_reg+1+4+8 + symbol_maker 'cpsr_fcx',psr_reg+1+2+8 + symbol_maker 'cpsr_flg',psr_reg+8 + symbol_maker 'cpsr_fsc',psr_reg+1+4+8 + symbol_maker 'cpsr_fsx',psr_reg+4+2+8 + symbol_maker 'cpsr_fxc',psr_reg+1+2+8 + symbol_maker 'cpsr_fxs',psr_reg+4+2+8 + symbol_maker 'cpsr_scf',psr_reg+8+1+4 + symbol_maker 'cpsr_scx',psr_reg+1+2+4 + symbol_maker 'cpsr_sfc',psr_reg+8+1+4 + symbol_maker 'cpsr_sfx',psr_reg+8+2+4 + symbol_maker 'cpsr_sxc',psr_reg+1+2+4 + symbol_maker 'cpsr_sxf',psr_reg+8+2+4 + symbol_maker 'cpsr_xcf',psr_reg+8+1+2 + symbol_maker 'cpsr_xcs',psr_reg+4+1+2 + symbol_maker 'cpsr_xfc',psr_reg+8+1+2 + symbol_maker 'cpsr_xfs',psr_reg+8+4+2 + symbol_maker 'cpsr_xsc',psr_reg+4+1+2 + symbol_maker 'cpsr_xsf',psr_reg+8+4+2 + symbol_maker 'cptr_el2',sys_msr+(sys_encode_cptr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cptr_el3',sys_msr+(sys_encode_cptr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'cpu32_6m',cpu_sel+CPU32_CAPABILITY_6M + symbol_maker 'cpu32_7m',cpu_sel+CPU32_CAPABILITY_7M + symbol_maker 'cpu32_mp',cpu_sel+CPU32_CAPABILITY_MP + symbol_maker 'cpu32_t2',cpu_sel+CPU32_CAPABILITY_T2 + symbol_maker 'cpu32_v1',cpu_sel+CPU32_CAPABILITY_V1 + symbol_maker 'cpu32_v2',cpu_sel+CPU32_CAPABILITY_V2 + symbol_maker 'cpu32_v3',cpu_sel+CPU32_CAPABILITY_V3 + symbol_maker 'cpu32_v4',cpu_sel+CPU32_CAPABILITY_V4 + symbol_maker 'cpu32_v5',cpu_sel+CPU32_CAPABILITY_V5 + symbol_maker 'cpu32_v6',cpu_sel+CPU32_CAPABILITY_V6 + symbol_maker 'cpu32_v7',cpu_sel+CPU32_CAPABILITY_V7 + symbol_maker 'cpu32_v8',cpu_sel+CPU32_CAPABILITY_V8 + symbol_maker 'cpu32_ve',cpu_sel+CPU32_CAPABILITY_VE + symbol_maker 'cpu64_fp',cpu_sel+CPU64_CAPABILITY_FP + symbol_maker 'cpu64_v8',cpu_sel+CPU64_CAPABILITY_V8 + symbol_maker 'hacr_el2',sys_msr+(sys_encode_hacr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'hstr_el2',sys_msr+(sys_encode_hstr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'iflags_a',iflags+4 + symbol_maker 'iflags_f',iflags+1 + symbol_maker 'iflags_i',iflags+2 + symbol_maker 'ipas2le1',sys_tlbi+(sys_encode_ipas2le1-sys_encode_table_tlbi) shr 1 + symbol_maker 'linkinfo',19h shl 8 + 9 + symbol_maker 'mair_el1',sys_msr+(sys_encode_mair_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mair_el2',sys_msr+(sys_encode_mair_el2-sys_encode_table_msr) shr 1 + symbol_maker 'mair_el3',sys_msr+(sys_encode_mair_el3-sys_encode_table_msr) shr 1 + symbol_maker 'mdcr_el2',sys_msr+(sys_encode_mdcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'mdcr_el3',sys_msr+(sys_encode_mdcr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'midr_el1',sys_msr+(sys_encode_midr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmcr_el0',sys_msr+(sys_encode_pmcr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'readable',19h shl 8 + 30 + symbol_maker 'resource',1Ah shl 8 + 2 + symbol_maker 'spsr_abt',banked_reg+32+20 +;; symbol_maker 'spsr_abt',sys_msr+(sys_encode_spsr_abt-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_all',psr_reg+16+8+1 + symbol_maker 'spsr_cfs',psr_reg+16+8+4+1 + symbol_maker 'spsr_cfx',psr_reg+16+8+2+1 + symbol_maker 'spsr_csf',psr_reg+16+8+4+1 + symbol_maker 'spsr_csx',psr_reg+16+4+2+1 + symbol_maker 'spsr_ctl',psr_reg+16+1 + symbol_maker 'spsr_cxf',psr_reg+16+8+2+1 + symbol_maker 'spsr_cxs',psr_reg+16+4+2+1 + symbol_maker 'spsr_el1',sys_msr+(sys_encode_spsr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_el2',sys_msr+(sys_encode_spsr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_el3',sys_msr+(sys_encode_spsr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_fcs',psr_reg+16+1+4+8 + symbol_maker 'spsr_fcx',psr_reg+16+1+2+8 + symbol_maker 'spsr_fiq',banked_reg+32+14 +;; symbol_maker 'spsr_fiq',sys_msr+(sys_encode_spsr_fiq-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_flg',psr_reg+16+8 + symbol_maker 'spsr_fsc',psr_reg+16+1+4+8 + symbol_maker 'spsr_fsx',psr_reg+16+4+2+8 + symbol_maker 'spsr_fxc',psr_reg+16+1+2+8 + symbol_maker 'spsr_fxs',psr_reg+16+4+2+8 + symbol_maker 'spsr_hyp',banked_reg+32+30 + symbol_maker 'spsr_irq',banked_reg+32+16 +;; symbol_maker 'spsr_irq',sys_msr+(sys_encode_spsr_irq-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_mon',banked_reg+32+28 + symbol_maker 'spsr_scf',psr_reg+16+8+1+4 + symbol_maker 'spsr_scx',psr_reg+16+1+2+4 + symbol_maker 'spsr_sfc',psr_reg+16+8+1+4 + symbol_maker 'spsr_sfx',psr_reg+16+8+2+4 + symbol_maker 'spsr_svc',banked_reg+32+18 + symbol_maker 'spsr_sxc',psr_reg+16+1+2+4 + symbol_maker 'spsr_sxf',psr_reg+16+8+2+4 + symbol_maker 'spsr_und',banked_reg+32+22 +;; symbol_maker 'spsr_und',sys_msr+(sys_encode_spsr_und-sys_encode_table_msr) shr 1 + symbol_maker 'spsr_xcf',psr_reg+16+8+1+2 + symbol_maker 'spsr_xcs',psr_reg+16+4+1+2 + symbol_maker 'spsr_xfc',psr_reg+16+8+1+2 + symbol_maker 'spsr_xfs',psr_reg+16+8+4+2 + symbol_maker 'spsr_xsc',psr_reg+16+4+1+2 + symbol_maker 'spsr_xsf',psr_reg+16+8+4+2 + symbol_maker 'vaale1is',sys_tlbi+(sys_encode_vaale1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vbar_el1',sys_msr+(sys_encode_vbar_el1-sys_encode_table_msr) shr 1 + symbol_maker 'vbar_el2',sys_msr+(sys_encode_vbar_el2-sys_encode_table_msr) shr 1 + symbol_maker 'vbar_el3',sys_msr+(sys_encode_vbar_el3-sys_encode_table_msr) shr 1 + symbol_maker 'vtcr_el2',sys_msr+(sys_encode_vtcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'writable',19h shl 8 + 31 +symbols_9: + symbol_maker 'actlr_el1',sys_msr+(sys_encode_actlr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'actlr_el2',sys_msr+(sys_encode_actlr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'actlr_el3',sys_msr+(sys_encode_actlr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'afsr0_el1',sys_msr+(sys_encode_afsr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'afsr0_el2',sys_msr+(sys_encode_afsr0_el2-sys_encode_table_msr) shr 1 + symbol_maker 'afsr0_el3',sys_msr+(sys_encode_afsr0_el3-sys_encode_table_msr) shr 1 + symbol_maker 'afsr1_el1',sys_msr+(sys_encode_afsr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'afsr1_el2',sys_msr+(sys_encode_afsr1_el2-sys_encode_table_msr) shr 1 + symbol_maker 'afsr1_el3',sys_msr+(sys_encode_afsr1_el3-sys_encode_table_msr) shr 1 + symbol_maker 'amair_el1',sys_msr+(sys_encode_amair_el1-sys_encode_table_msr) shr 1 + symbol_maker 'amair_el2',sys_msr+(sys_encode_amair_el2-sys_encode_table_msr) shr 1 + symbol_maker 'amair_el3',sys_msr+(sys_encode_amair_el3-sys_encode_table_msr) shr 1 + symbol_maker 'apsr_nzcv',psr_reg+34 + symbol_maker 'clidr_el1',sys_msr+(sys_encode_clidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'copro_all',copro_sel.all + symbol_maker 'cpacr_el1',sys_msr+(sys_encode_cpacr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'cpsr_cfsx',psr_reg+8+4+2+1 + symbol_maker 'cpsr_cfxs',psr_reg+8+4+2+1 + symbol_maker 'cpsr_csfx',psr_reg+8+4+2+1 + symbol_maker 'cpsr_csxf',psr_reg+8+4+2+1 + symbol_maker 'cpsr_cxfs',psr_reg+8+4+2+1 + symbol_maker 'cpsr_cxsf',psr_reg+8+4+2+1 + symbol_maker 'cpsr_fcsx',psr_reg+1+4+2+8 + symbol_maker 'cpsr_fcxs',psr_reg+1+4+2+8 + symbol_maker 'cpsr_fscx',psr_reg+1+4+2+8 + symbol_maker 'cpsr_fsxc',psr_reg+1+4+2+8 + symbol_maker 'cpsr_fxcs',psr_reg+1+4+2+8 + symbol_maker 'cpsr_fxsc',psr_reg+1+4+2+8 + symbol_maker 'cpsr_scfx',psr_reg+8+1+2+4 + symbol_maker 'cpsr_scxf',psr_reg+8+1+2+4 + symbol_maker 'cpsr_sfcx',psr_reg+8+1+2+4 + symbol_maker 'cpsr_sfxc',psr_reg+8+1+2+4 + symbol_maker 'cpsr_sxcf',psr_reg+8+1+2+4 + symbol_maker 'cpsr_sxfc',psr_reg+8+1+2+4 + symbol_maker 'cpsr_xcfs',psr_reg+8+4+1+2 + symbol_maker 'cpsr_xcsf',psr_reg+8+4+1+2 + symbol_maker 'cpsr_xfcs',psr_reg+8+4+1+2 + symbol_maker 'cpsr_xfsc',psr_reg+8+4+1+2 + symbol_maker 'cpsr_xscf',psr_reg+8+4+1+2 + symbol_maker 'cpsr_xsfc',psr_reg+8+4+1+2 + symbol_maker 'cpu32_all',cpu_sel.all32 + symbol_maker 'cpu32_crc',cpu_sel+CPU32_CAPABILITY_CRC + symbol_maker 'cpu32_div',cpu_sel+CPU32_CAPABILITY_DIV + symbol_maker 'cpu32_v4t',cpu_sel+CPU32_CAPABILITY_V4T + symbol_maker 'cpu32_v5t',cpu_sel+CPU32_CAPABILITY_V5T + symbol_maker 'cpu32_v6t',cpu_sel+CPU32_CAPABILITY_V6T + symbol_maker 'cpu64_all',cpu_sel.all64 + symbol_maker 'cpu64_crc',cpu_sel+CPU64_CAPABILITY_CRC + symbol_maker 'currentel',sys_msr+(sys_encode_currentel-sys_encode_table_msr) shr 1 + symbol_maker 'dczid_el0',sys_msr+(sys_encode_dczid_el0-sys_encode_table_msr) shr 1 + symbol_maker 'dspsr_el0',sys_msr+(sys_encode_dspsr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'faultmask',sysm_reg+19 + symbol_maker 'hpfar_el2',sys_msr+(sys_encode_hpfar_el2-sys_encode_table_msr) shr 1 + symbol_maker 'iflags_af',iflags+4+1 + symbol_maker 'iflags_ai',iflags+4+2 + symbol_maker 'iflags_fa',iflags+1+4 + symbol_maker 'iflags_fi',iflags+1+2 + symbol_maker 'iflags_ia',iflags+2+4 + symbol_maker 'iflags_if',iflags+2+1 + symbol_maker 'ipas2e1is',sys_tlbi+(sys_encode_ipas2e1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'mdrar_el1',sys_msr+(sys_encode_mdrar_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mdscr_el1',sys_msr+(sys_encode_mdscr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mpidr_el1',sys_msr+(sys_encode_mpidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mvfr0_el1',sys_msr+(sys_encode_mvfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mvfr1_el1',sys_msr+(sys_encode_mvfr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'mvfr2_el1',sys_msr+(sys_encode_mvfr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'osdlr_el1',sys_msr+(sys_encode_osdlr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'oslar_el1',sys_msr+(sys_encode_oslar_el1-sys_encode_table_msr) shr 1 + symbol_maker 'oslsr_el1',sys_msr+(sys_encode_oslsr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pldl1keep',prf_op+0*8+0*2+0 + symbol_maker 'pldl1strm',prf_op+0*8+0*2+1 + symbol_maker 'pldl2keep',prf_op+0*8+1*2+0 + symbol_maker 'pldl2strm',prf_op+0*8+1*2+1 + symbol_maker 'pldl3keep',prf_op+0*8+2*2+0 + symbol_maker 'pldl3strm',prf_op+0*8+2*2+1 + symbol_maker 'plil1keep',prf_op+1*8+0*2+0 + symbol_maker 'plil1strm',prf_op+1*8+0*2+1 + symbol_maker 'plil2keep',prf_op+1*8+1*2+0 + symbol_maker 'plil2strm',prf_op+1*8+1*2+1 + symbol_maker 'plil3keep',prf_op+1*8+2*2+0 + symbol_maker 'plil3strm',prf_op+1*8+2*2+1 + symbol_maker 'pstl1keep',prf_op+2*8+0*2+0 + symbol_maker 'pstl1strm',prf_op+2*8+0*2+1 + symbol_maker 'pstl2keep',prf_op+2*8+1*2+0 + symbol_maker 'pstl2strm',prf_op+2*8+1*2+1 + symbol_maker 'pstl3keep',prf_op+2*8+2*2+0 + symbol_maker 'pstl3strm',prf_op+2*8+2*2+1 + symbol_maker 'rvbar_el1',sys_msr+(sys_encode_rvbar_el1-sys_encode_table_msr) shr 1 + symbol_maker 'rvbar_el2',sys_msr+(sys_encode_rvbar_el2-sys_encode_table_msr) shr 1 + symbol_maker 'rvbar_el3',sys_msr+(sys_encode_rvbar_el3-sys_encode_table_msr) shr 1 + symbol_maker 'sctlr_el1',sys_msr+(sys_encode_sctlr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'sctlr_el2',sys_msr+(sys_encode_sctlr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'sctlr_el3',sys_msr+(sys_encode_sctlr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'shareable',19h shl 8 + 28 + symbol_maker 'spsr_cfsx',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_cfxs',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_csfx',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_csxf',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_cxfs',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_cxsf',psr_reg+16+8+4+2+1 + symbol_maker 'spsr_fcsx',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_fcxs',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_fscx',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_fsxc',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_fxcs',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_fxsc',psr_reg+16+1+4+2+8 + symbol_maker 'spsr_scfx',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_scxf',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_sfcx',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_sfxc',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_sxcf',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_sxfc',psr_reg+16+8+1+2+4 + symbol_maker 'spsr_xcfs',psr_reg+16+8+4+1+2 + symbol_maker 'spsr_xcsf',psr_reg+16+8+4+1+2 + symbol_maker 'spsr_xfcs',psr_reg+16+8+4+1+2 + symbol_maker 'spsr_xfsc',psr_reg+16+8+4+1+2 + symbol_maker 'spsr_xscf',psr_reg+16+8+4+1+2 + symbol_maker 'spsr_xsfc',psr_reg+16+8+4+1+2 + symbol_maker 'tpidr_el0',sys_msr+(sys_encode_tpidr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'tpidr_el1',sys_msr+(sys_encode_tpidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'tpidr_el2',sys_msr+(sys_encode_tpidr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'tpidr_el3',sys_msr+(sys_encode_tpidr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'ttbr0_el1',sys_msr+(sys_encode_ttbr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'ttbr0_el2',sys_msr+(sys_encode_ttbr0_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ttbr0_el3',sys_msr+(sys_encode_ttbr0_el3-sys_encode_table_msr) shr 1 + symbol_maker 'ttbr1_el1',sys_msr+(sys_encode_ttbr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'vmalle1is',sys_tlbi+(sys_encode_vmalle1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'vpidr_el2',sys_msr+(sys_encode_vpidr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'vttbr_el2',sys_msr+(sys_encode_vttbr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'writeable',19h shl 8 + 31 +symbols_10: + symbol_maker 'apsr_nzcvq',psr_reg+8 + symbol_maker 'ccsidr_el1',sys_msr+(sys_encode_ccsidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'cntfrq_el0',sys_msr+(sys_encode_cntfrq_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntpct_el0',sys_msr+(sys_encode_cntpct_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntvct_el0',sys_msr+(sys_encode_cntvct_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cpu32_sync',cpu_sel+CPU32_CAPABILITY_SYNC + symbol_maker 'cpu32_t2ee',cpu_sel+CPU32_CAPABILITY_T2EE + symbol_maker 'cpu64_simd',cpu_sel+CPU64_CAPABILITY_SIMD + symbol_maker 'csselr_el1',sys_msr+(sys_encode_csselr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dacr32_el2',sys_msr+(sys_encode_dacr32_el2-sys_encode_table_msr) shr 1 + symbol_maker 'dbgdtr_el0',sys_msr+(sys_encode_dbgdtr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'efiruntime',1Bh shl 8 + 12 + symbol_maker 'executable',19h shl 8 + 29 + symbol_maker 'iflags_afi',iflags+4+1+2 + symbol_maker 'iflags_aif',iflags+4+2+1 + symbol_maker 'iflags_fai',iflags+1+4+2 + symbol_maker 'iflags_fia',iflags+1+2+4 + symbol_maker 'iflags_iaf',iflags+2+4+1 + symbol_maker 'iflags_ifa',iflags+2+1+4 + symbol_maker 'ifsr32_el2',sys_msr+(sys_encode_ifsr32_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ipas2le1is',sys_tlbi+(sys_encode_ipas2le1is-sys_encode_table_tlbi) shr 1 + symbol_maker 'linkremove',19h shl 8 + 11 + symbol_maker 'mdccsr_el0',sys_msr+(sys_encode_mdccsr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'oseccr_el1',sys_msr+(sys_encode_oseccr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmselr_el0',sys_msr+(sys_encode_pmselr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'revidr_el1',sys_msr+(sys_encode_revidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'sder32_el3',sys_msr+(sys_encode_sder32_el3-sys_encode_table_msr) shr 1 + symbol_maker 'vmalls12e1',sys_tlbi+(sys_encode_vmalls12e1-sys_encode_table_tlbi) shr 1 + symbol_maker 'vmpidr_el2',sys_msr+(sys_encode_vmpidr_el2-sys_encode_table_msr) shr 1 +symbols_11: + symbol_maker 'apsr_nzcvqg',psr_reg+8+4 + symbol_maker 'basepri_max',sysm_reg+18 + symbol_maker 'cnthctl_el2',sys_msr+(sys_encode_cnthctl_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cntkctl_el1',sys_msr+(sys_encode_cntkctl_el1-sys_encode_table_msr) shr 1 + symbol_maker 'cntvoff_el2',sys_msr+(sys_encode_cntvoff_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cpu32_26bit',cpu_sel+CPU32_CAPABILITY_26BIT + symbol_maker 'cpu32_align',cpu_sel+CPU32_CAPABILITY_ALIGN + symbol_maker 'dbgbcr0_el1',sys_msr+(sys_encode_dbgbcr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr1_el1',sys_msr+(sys_encode_dbgbcr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr2_el1',sys_msr+(sys_encode_dbgbcr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr3_el1',sys_msr+(sys_encode_dbgbcr3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr4_el1',sys_msr+(sys_encode_dbgbcr4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr5_el1',sys_msr+(sys_encode_dbgbcr5_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr6_el1',sys_msr+(sys_encode_dbgbcr6_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr7_el1',sys_msr+(sys_encode_dbgbcr7_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr8_el1',sys_msr+(sys_encode_dbgbcr8_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr9_el1',sys_msr+(sys_encode_dbgbcr9_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr0_el1',sys_msr+(sys_encode_dbgbvr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr1_el1',sys_msr+(sys_encode_dbgbvr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr2_el1',sys_msr+(sys_encode_dbgbvr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr3_el1',sys_msr+(sys_encode_dbgbvr3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr4_el1',sys_msr+(sys_encode_dbgbvr4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr5_el1',sys_msr+(sys_encode_dbgbvr5_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr6_el1',sys_msr+(sys_encode_dbgbvr6_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr7_el1',sys_msr+(sys_encode_dbgbvr7_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr8_el1',sys_msr+(sys_encode_dbgbvr8_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr9_el1',sys_msr+(sys_encode_dbgbvr9_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgprcr_el1',sys_msr+(sys_encode_dbgprcr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr0_el1',sys_msr+(sys_encode_dbgwcr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr1_el1',sys_msr+(sys_encode_dbgwcr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr2_el1',sys_msr+(sys_encode_dbgwcr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr3_el1',sys_msr+(sys_encode_dbgwcr3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr4_el1',sys_msr+(sys_encode_dbgwcr4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr5_el1',sys_msr+(sys_encode_dbgwcr5_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr6_el1',sys_msr+(sys_encode_dbgwcr6_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr7_el1',sys_msr+(sys_encode_dbgwcr7_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr8_el1',sys_msr+(sys_encode_dbgwcr8_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr9_el1',sys_msr+(sys_encode_dbgwcr9_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr0_el1',sys_msr+(sys_encode_dbgwvr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr1_el1',sys_msr+(sys_encode_dbgwvr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr2_el1',sys_msr+(sys_encode_dbgwvr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr3_el1',sys_msr+(sys_encode_dbgwvr3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr4_el1',sys_msr+(sys_encode_dbgwvr4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr5_el1',sys_msr+(sys_encode_dbgwvr5_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr6_el1',sys_msr+(sys_encode_dbgwvr6_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr7_el1',sys_msr+(sys_encode_dbgwvr7_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr8_el1',sys_msr+(sys_encode_dbgwvr8_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr9_el1',sys_msr+(sys_encode_dbgwvr9_el1-sys_encode_table_msr) shr 1 + symbol_maker 'discardable',19h shl 8 + 25 + symbol_maker 'fpexc32_el2',sys_msr+(sys_encode_fpexc32_el2-sys_encode_table_msr) shr 1 + symbol_maker 'icc_dir_el1',sys_msr+(sys_encode_icc_dir_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_pmr_el1',sys_msr+(sys_encode_icc_pmr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_rpr_el1',sys_msr+(sys_encode_icc_rpr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_sre_el1',sys_msr+(sys_encode_icc_sre_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_sre_el2',sys_msr+(sys_encode_icc_sre_el2-sys_encode_table_msr) shr 1 + symbol_maker 'icc_sre_el3',sys_msr+(sys_encode_icc_sre_el3-sys_encode_table_msr) shr 1 + symbol_maker 'ich_hcr_el2',sys_msr+(sys_encode_ich_hcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr0_el2',sys_msr+(sys_encode_ich_lr0_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr1_el2',sys_msr+(sys_encode_ich_lr1_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr2_el2',sys_msr+(sys_encode_ich_lr2_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr3_el2',sys_msr+(sys_encode_ich_lr3_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr4_el2',sys_msr+(sys_encode_ich_lr4_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr5_el2',sys_msr+(sys_encode_ich_lr5_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr6_el2',sys_msr+(sys_encode_ich_lr6_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr7_el2',sys_msr+(sys_encode_ich_lr7_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr8_el2',sys_msr+(sys_encode_ich_lr8_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr9_el2',sys_msr+(sys_encode_ich_lr9_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_vtr_el2',sys_msr+(sys_encode_ich_vtr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'icv_dir_el1',sys_msr+(sys_encode_icv_dir_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_pmr_el1',sys_msr+(sys_encode_icv_pmr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_rpr_el1',sys_msr+(sys_encode_icv_rpr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_afr0_el1',sys_msr+(sys_encode_id_afr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_dfr0_el1',sys_msr+(sys_encode_id_dfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_pfr0_el1',sys_msr+(sys_encode_id_pfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_pfr1_el1',sys_msr+(sys_encode_id_pfr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'interpreter',1Eh shl 8 + 3 + symbol_maker 'mdccint_el1',sys_msr+(sys_encode_mdccint_el1-sys_encode_table_msr) shr 1 + symbol_maker 'notpageable',19h shl 8 + 27 + symbol_maker 'osdtrrx_el1',sys_msr+(sys_encode_osdtrrx_el1-sys_encode_table_msr) shr 1 + symbol_maker 'osdtrtx_el1',sys_msr+(sys_encode_osdtrtx_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmccntr_el0',sys_msr+(sys_encode_pmccntr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmceid0_el0',sys_msr+(sys_encode_pmceid0_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmceid1_el0',sys_msr+(sys_encode_pmceid1_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmswinc_el0',sys_msr+(sys_encode_pmswinc_el0-sys_encode_table_msr) shr 1 + symbol_maker 'tpidrro_el0',sys_msr+(sys_encode_tpidrro_el0-sys_encode_table_msr) shr 1 +symbols_12: + symbol_maker 'cntp_ctl_el0',sys_msr+(sys_encode_cntp_ctl_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntv_ctl_el0',sys_msr+(sys_encode_cntv_ctl_el0-sys_encode_table_msr) shr 1 + symbol_maker 'copro_fpa_v1',copro_sel+COPRO_CAPABILITY_FPA_V1 + symbol_maker 'copro_fpa_v2',copro_sel+COPRO_CAPABILITY_FPA_V2 + symbol_maker 'copro_vfp_hp',copro_sel+COPRO_CAPABILITY_VFP_HP + symbol_maker 'copro_vfp_v1',copro_sel+COPRO_CAPABILITY_VFP_V1 + symbol_maker 'copro_vfp_v2',copro_sel+COPRO_CAPABILITY_VFP_V2 + symbol_maker 'copro_vfp_v3',copro_sel+COPRO_CAPABILITY_VFP_V3 + symbol_maker 'copro_vfp_v4',copro_sel+COPRO_CAPABILITY_VFP_V4 + symbol_maker 'copro_xscale',copro_sel+COPRO_CAPABILITY_XSCALE + symbol_maker 'cpu64_crypto',cpu_sel+CPU64_CAPABILITY_CRYPTO + symbol_maker 'dbgbcr10_el1',sys_msr+(sys_encode_dbgbcr10_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr11_el1',sys_msr+(sys_encode_dbgbcr11_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr12_el1',sys_msr+(sys_encode_dbgbcr12_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr13_el1',sys_msr+(sys_encode_dbgbcr13_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr14_el1',sys_msr+(sys_encode_dbgbcr14_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbcr15_el1',sys_msr+(sys_encode_dbgbcr15_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr10_el1',sys_msr+(sys_encode_dbgbvr10_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr11_el1',sys_msr+(sys_encode_dbgbvr11_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr12_el1',sys_msr+(sys_encode_dbgbvr12_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr13_el1',sys_msr+(sys_encode_dbgbvr13_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr14_el1',sys_msr+(sys_encode_dbgbvr14_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgbvr15_el1',sys_msr+(sys_encode_dbgbvr15_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgdtrrx_el0',sys_msr+(sys_encode_dbgdtrrx_el0-sys_encode_table_msr) shr 1 + symbol_maker 'dbgdtrtx_el0',sys_msr+(sys_encode_dbgdtrtx_el0-sys_encode_table_msr) shr 1 + symbol_maker 'dbgvcr32_el2',sys_msr+(sys_encode_dbgvcr32_el2-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr10_el1',sys_msr+(sys_encode_dbgwcr10_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr11_el1',sys_msr+(sys_encode_dbgwcr11_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr12_el1',sys_msr+(sys_encode_dbgwcr12_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr13_el1',sys_msr+(sys_encode_dbgwcr13_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr14_el1',sys_msr+(sys_encode_dbgwcr14_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwcr15_el1',sys_msr+(sys_encode_dbgwcr15_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr10_el1',sys_msr+(sys_encode_dbgwvr10_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr11_el1',sys_msr+(sys_encode_dbgwvr11_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr12_el1',sys_msr+(sys_encode_dbgwvr12_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr13_el1',sys_msr+(sys_encode_dbgwvr13_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr14_el1',sys_msr+(sys_encode_dbgwvr14_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgwvr15_el1',sys_msr+(sys_encode_dbgwvr15_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_bpr0_el1',sys_msr+(sys_encode_icc_bpr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_bpr1_el1',sys_msr+(sys_encode_icc_bpr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ctlr_el1',sys_msr+(sys_encode_icc_ctlr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ctlr_el3',sys_msr+(sys_encode_icc_ctlr_el3-sys_encode_table_msr) shr 1 + symbol_maker 'icc_iar0_el1',sys_msr+(sys_encode_icc_iar0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_iar1_el1',sys_msr+(sys_encode_icc_iar1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'ich_eisr_el2',sys_msr+(sys_encode_ich_eisr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr10_el2',sys_msr+(sys_encode_ich_lr10_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr11_el2',sys_msr+(sys_encode_ich_lr11_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr12_el2',sys_msr+(sys_encode_ich_lr12_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr13_el2',sys_msr+(sys_encode_ich_lr13_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr14_el2',sys_msr+(sys_encode_ich_lr14_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_lr15_el2',sys_msr+(sys_encode_ich_lr15_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_misr_el2',sys_msr+(sys_encode_ich_misr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_vmcr_el2',sys_msr+(sys_encode_ich_vmcr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'icv_bpr0_el1',sys_msr+(sys_encode_icv_bpr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_bpr1_el1',sys_msr+(sys_encode_icv_bpr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ctlr_el1',sys_msr+(sys_encode_icv_ctlr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_iar0_el1',sys_msr+(sys_encode_icv_iar0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_iar1_el1',sys_msr+(sys_encode_icv_iar1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar0_el1',sys_msr+(sys_encode_id_isar0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar1_el1',sys_msr+(sys_encode_id_isar1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar2_el1',sys_msr+(sys_encode_id_isar2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar3_el1',sys_msr+(sys_encode_id_isar3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar4_el1',sys_msr+(sys_encode_id_isar4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_isar5_el1',sys_msr+(sys_encode_id_isar5_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_mmfr0_el1',sys_msr+(sys_encode_id_mmfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_mmfr1_el1',sys_msr+(sys_encode_id_mmfr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_mmfr2_el1',sys_msr+(sys_encode_id_mmfr2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_mmfr3_el1',sys_msr+(sys_encode_id_mmfr3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_mmfr4_el1',sys_msr+(sys_encode_id_mmfr4_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmovsclr_el0',sys_msr+(sys_encode_pmovsclr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmovsset_el0',sys_msr+(sys_encode_pmovsset_el0-sys_encode_table_msr) shr 1 + symbol_maker 'vmalls12e1is',sys_tlbi+(sys_encode_vmalls12e1is-sys_encode_table_tlbi) shr 1 +symbols_13: + symbol_maker 'cnthp_ctl_el2',sys_msr+(sys_encode_cnthp_ctl_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cntp_cval_el0',sys_msr+(sys_encode_cntp_cval_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntp_tval_el0',sys_msr+(sys_encode_cntp_tval_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntps_ctl_el1',sys_msr+(sys_encode_cntps_ctl_el1-sys_encode_table_msr) shr 1 + symbol_maker 'cntv_cval_el0',sys_msr+(sys_encode_cntv_cval_el0-sys_encode_table_msr) shr 1 + symbol_maker 'cntv_tval_el0',sys_msr+(sys_encode_cntv_tval_el0-sys_encode_table_msr) shr 1 + symbol_maker 'copro_simd_hp',copro_sel+COPRO_CAPABILITY_SIMD_HP + symbol_maker 'copro_simd_v2',copro_sel+COPRO_CAPABILITY_SIMD_V2 + symbol_maker 'copro_simd_v8',copro_sel+COPRO_CAPABILITY_SIMD_V8 + symbol_maker 'copro_vfp_d32',copro_sel+COPRO_CAPABILITY_VFP_D32 + symbol_maker 'icc_ap0r0_el1',sys_msr+(sys_encode_icc_ap0r0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap0r1_el1',sys_msr+(sys_encode_icc_ap0r1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap0r2_el1',sys_msr+(sys_encode_icc_ap0r2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap0r3_el1',sys_msr+(sys_encode_icc_ap0r3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap1r0_el1',sys_msr+(sys_encode_icc_ap1r0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap1r1_el1',sys_msr+(sys_encode_icc_ap1r1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap1r2_el1',sys_msr+(sys_encode_icc_ap1r2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_ap1r3_el1',sys_msr+(sys_encode_icc_ap1r3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_eoir0_el1',sys_msr+(sys_encode_icc_eoir0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_eoir1_el1',sys_msr+(sys_encode_icc_eoir1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_sgi0r_el1',sys_msr+(sys_encode_icc_sgi0r_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_sgi1r_el1',sys_msr+(sys_encode_icc_sgi1r_el1-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap0r0_el2',sys_msr+(sys_encode_ich_ap0r0_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap0r1_el2',sys_msr+(sys_encode_ich_ap0r1_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap0r2_el2',sys_msr+(sys_encode_ich_ap0r2_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap0r3_el2',sys_msr+(sys_encode_ich_ap0r3_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap1r0_el2',sys_msr+(sys_encode_ich_ap1r0_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap1r1_el2',sys_msr+(sys_encode_ich_ap1r1_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap1r2_el2',sys_msr+(sys_encode_ich_ap1r2_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_ap1r3_el2',sys_msr+(sys_encode_ich_ap1r3_el2-sys_encode_table_msr) shr 1 + symbol_maker 'ich_elrsr_el2',sys_msr+(sys_encode_ich_elrsr_el2-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap0r0_el1',sys_msr+(sys_encode_icv_ap0r0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap0r1_el1',sys_msr+(sys_encode_icv_ap0r1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap0r2_el1',sys_msr+(sys_encode_icv_ap0r2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap0r3_el1',sys_msr+(sys_encode_icv_ap0r3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap1r0_el1',sys_msr+(sys_encode_icv_ap1r0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap1r1_el1',sys_msr+(sys_encode_icv_ap1r1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap1r2_el1',sys_msr+(sys_encode_icv_ap1r2_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_ap1r3_el1',sys_msr+(sys_encode_icv_ap1r3_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_eoir0_el1',sys_msr+(sys_encode_icv_eoir0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_eoir1_el1',sys_msr+(sys_encode_icv_eoir1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmccfiltr_el0',sys_msr+(sys_encode_pmccfiltr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr0_el0',sys_msr+(sys_encode_pmevcntr0_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr1_el0',sys_msr+(sys_encode_pmevcntr1_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr2_el0',sys_msr+(sys_encode_pmevcntr2_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr3_el0',sys_msr+(sys_encode_pmevcntr3_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr4_el0',sys_msr+(sys_encode_pmevcntr4_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr5_el0',sys_msr+(sys_encode_pmevcntr5_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr6_el0',sys_msr+(sys_encode_pmevcntr6_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr7_el0',sys_msr+(sys_encode_pmevcntr7_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr8_el0',sys_msr+(sys_encode_pmevcntr8_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr9_el0',sys_msr+(sys_encode_pmevcntr9_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmuserenr_el0',sys_msr+(sys_encode_pmuserenr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmxevcntr_el0',sys_msr+(sys_encode_pmxevcntr_el0-sys_encode_table_msr) shr 1 +symbols_14: + symbol_maker 'cnthp_cval_el2',sys_msr+(sys_encode_cnthp_cval_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cnthp_tval_el2',sys_msr+(sys_encode_cnthp_tval_el2-sys_encode_table_msr) shr 1 + symbol_maker 'cntps_cval_el1',sys_msr+(sys_encode_cntps_cval_el1-sys_encode_table_msr) shr 1 + symbol_maker 'cntps_tval_el1',sys_msr+(sys_encode_cntps_tval_el1-sys_encode_table_msr) shr 1 + symbol_maker 'contextidr_el1',sys_msr+(sys_encode_contextidr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'copro_maverick',copro_sel+COPRO_CAPABILITY_MAVERICK + symbol_maker 'copro_simd_int',copro_sel+COPRO_CAPABILITY_SIMD_INT + symbol_maker 'copro_vfp_v1xd',copro_sel+COPRO_CAPABILITY_VFP_V1xD + symbol_maker 'icc_asgi1r_el1',sys_msr+(sys_encode_icc_asgi1r_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_hppir0_el1',sys_msr+(sys_encode_icc_hppir0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_hppir1_el1',sys_msr+(sys_encode_icc_hppir1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_hppir0_el1',sys_msr+(sys_encode_icv_hppir0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_hppir1_el1',sys_msr+(sys_encode_icv_hppir1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmcntenclr_el0',sys_msr+(sys_encode_pmcntenclr_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmcntenset_el0',sys_msr+(sys_encode_pmcntenset_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr10_el0',sys_msr+(sys_encode_pmevcntr10_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr11_el0',sys_msr+(sys_encode_pmevcntr11_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr12_el0',sys_msr+(sys_encode_pmevcntr12_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr13_el0',sys_msr+(sys_encode_pmevcntr13_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr14_el0',sys_msr+(sys_encode_pmevcntr14_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr15_el0',sys_msr+(sys_encode_pmevcntr15_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr16_el0',sys_msr+(sys_encode_pmevcntr16_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr17_el0',sys_msr+(sys_encode_pmevcntr17_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr18_el0',sys_msr+(sys_encode_pmevcntr18_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr19_el0',sys_msr+(sys_encode_pmevcntr19_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr20_el0',sys_msr+(sys_encode_pmevcntr20_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr21_el0',sys_msr+(sys_encode_pmevcntr21_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr22_el0',sys_msr+(sys_encode_pmevcntr22_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr23_el0',sys_msr+(sys_encode_pmevcntr23_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr24_el0',sys_msr+(sys_encode_pmevcntr24_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr25_el0',sys_msr+(sys_encode_pmevcntr25_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr26_el0',sys_msr+(sys_encode_pmevcntr26_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr27_el0',sys_msr+(sys_encode_pmevcntr27_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr28_el0',sys_msr+(sys_encode_pmevcntr28_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr29_el0',sys_msr+(sys_encode_pmevcntr29_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevcntr30_el0',sys_msr+(sys_encode_pmevcntr30_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper0_el0',sys_msr+(sys_encode_pmevtyper0_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper1_el0',sys_msr+(sys_encode_pmevtyper1_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper2_el0',sys_msr+(sys_encode_pmevtyper2_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper3_el0',sys_msr+(sys_encode_pmevtyper3_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper4_el0',sys_msr+(sys_encode_pmevtyper4_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper5_el0',sys_msr+(sys_encode_pmevtyper5_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper6_el0',sys_msr+(sys_encode_pmevtyper6_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper7_el0',sys_msr+(sys_encode_pmevtyper7_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper8_el0',sys_msr+(sys_encode_pmevtyper8_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper9_el0',sys_msr+(sys_encode_pmevtyper9_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmintenclr_el1',sys_msr+(sys_encode_pmintenclr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmintenset_el1',sys_msr+(sys_encode_pmintenset_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmxevtyper_el0',sys_msr+(sys_encode_pmxevtyper_el0-sys_encode_table_msr) shr 1 +symbols_15: + symbol_maker 'copro_iwmmxt_v1',copro_sel+COPRO_CAPABILITY_IWMMXT_V1 + symbol_maker 'copro_iwmmxt_v2',copro_sel+COPRO_CAPABILITY_IWMMXT_V2 + symbol_maker 'dbgclaimclr_el1',sys_msr+(sys_encode_dbgclaimclr_el1-sys_encode_table_msr) shr 1 + symbol_maker 'dbgclaimset_el1',sys_msr+(sys_encode_dbgclaimset_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_igrpen0_el1',sys_msr+(sys_encode_icc_igrpen0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_igrpen1_el1',sys_msr+(sys_encode_icc_igrpen1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icc_igrpen1_el3',sys_msr+(sys_encode_icc_igrpen1_el3-sys_encode_table_msr) shr 1 + symbol_maker 'icv_igrpen0_el1',sys_msr+(sys_encode_icv_igrpen0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'icv_igrpen1_el1',sys_msr+(sys_encode_icv_igrpen1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64afr0_el1',sys_msr+(sys_encode_id_aa64afr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64afr1_el1',sys_msr+(sys_encode_id_aa64afr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64dfr0_el1',sys_msr+(sys_encode_id_aa64dfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64dfr1_el1',sys_msr+(sys_encode_id_aa64dfr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64pfr0_el1',sys_msr+(sys_encode_id_aa64pfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64pfr1_el1',sys_msr+(sys_encode_id_aa64pfr1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper10_el0',sys_msr+(sys_encode_pmevtyper10_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper11_el0',sys_msr+(sys_encode_pmevtyper11_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper12_el0',sys_msr+(sys_encode_pmevtyper12_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper13_el0',sys_msr+(sys_encode_pmevtyper13_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper14_el0',sys_msr+(sys_encode_pmevtyper14_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper15_el0',sys_msr+(sys_encode_pmevtyper15_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper16_el0',sys_msr+(sys_encode_pmevtyper16_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper17_el0',sys_msr+(sys_encode_pmevtyper17_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper18_el0',sys_msr+(sys_encode_pmevtyper18_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper19_el0',sys_msr+(sys_encode_pmevtyper19_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper20_el0',sys_msr+(sys_encode_pmevtyper20_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper21_el0',sys_msr+(sys_encode_pmevtyper21_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper22_el0',sys_msr+(sys_encode_pmevtyper22_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper23_el0',sys_msr+(sys_encode_pmevtyper23_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper24_el0',sys_msr+(sys_encode_pmevtyper24_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper25_el0',sys_msr+(sys_encode_pmevtyper25_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper26_el0',sys_msr+(sys_encode_pmevtyper26_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper27_el0',sys_msr+(sys_encode_pmevtyper27_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper28_el0',sys_msr+(sys_encode_pmevtyper28_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper29_el0',sys_msr+(sys_encode_pmevtyper29_el0-sys_encode_table_msr) shr 1 + symbol_maker 'pmevtyper30_el0',sys_msr+(sys_encode_pmevtyper30_el0-sys_encode_table_msr) shr 1 +symbols_16: + symbol_maker 'copro_simd_float',copro_sel+COPRO_CAPABILITY_SIMD_FLOAT + symbol_maker 'id_aa64isar0_el1',sys_msr+(sys_encode_id_aa64isar0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64isar1_el1',sys_msr+(sys_encode_id_aa64isar1_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64mmfr0_el1',sys_msr+(sys_encode_id_aa64mmfr0_el1-sys_encode_table_msr) shr 1 + symbol_maker 'id_aa64mmfr1_el1',sys_msr+(sys_encode_id_aa64mmfr1_el1-sys_encode_table_msr) shr 1 +symbols_17: + symbol_maker 'copro_simd_crypto',copro_sel+COPRO_CAPABILITY_SIMD_CRYPTO + symbol_maker 'dbgauthstatus_el1',sys_msr+(sys_encode_dbgauthstatus_el1-sys_encode_table_msr) shr 1 +symbols_end: + +purge symbol_maker + + align 2 +sys_encode_table_at: + ;at op0 op1 crn crm op2 + sys_encode_s12e0r: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0110b + sys_encode_s12e0w: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0111b + sys_encode_s12e1r: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0100b + sys_encode_s12e1w: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0101b + sys_encode_s1e0r: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01000b shl 3 + 0010b + sys_encode_s1e0w: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01000b shl 3 + 0011b + sys_encode_s1e1r: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01000b shl 3 + 0000b + sys_encode_s1e1w: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01000b shl 3 + 0001b + sys_encode_s1e2r: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0000b + sys_encode_s1e2w: dw 001b shl 14 + 0100b shl 11 + 00111b shl 7 + 01000b shl 3 + 0001b + sys_encode_s1e3r: dw 001b shl 14 + 0110b shl 11 + 00111b shl 7 + 01000b shl 3 + 0000b + sys_encode_s1e3w: dw 001b shl 14 + 0110b shl 11 + 00111b shl 7 + 01000b shl 3 + 0001b +sys_encode_table_dc: + ;dc op0 op1 crn crm op2 + sys_encode_cisw: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01110b shl 3 + 0010b + sys_encode_civac: dw 001b shl 14 + 0011b shl 11 + 00111b shl 7 + 01110b shl 3 + 0001b + sys_encode_csw: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 01010b shl 3 + 0010b + sys_encode_cvac: dw 001b shl 14 + 0011b shl 11 + 00111b shl 7 + 01010b shl 3 + 0001b + sys_encode_cvau: dw 001b shl 14 + 0011b shl 11 + 00111b shl 7 + 01011b shl 3 + 0001b + sys_encode_isw: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 00110b shl 3 + 0010b + sys_encode_ivac: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 00110b shl 3 + 0001b + sys_encode_zva: dw 001b shl 14 + 0011b shl 11 + 00111b shl 7 + 00100b shl 3 + 0001b +sys_encode_table_ic: + ;ic op0 op1 crn crm op2 + sys_encode_iallu: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 00101b shl 3 + 0000b + sys_encode_ialluis: dw 001b shl 14 + 0000b shl 11 + 00111b shl 7 + 00001b shl 3 + 0000b + sys_encode_ivau: dw 001b shl 14 + 0011b shl 11 + 00111b shl 7 + 00101b shl 3 + 0001b +sys_encode_table_tlbi: + ;tlbi op0 op1 crn crm op2 + sys_encode_alle1: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00111b shl 3 + 0100b + sys_encode_alle1is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00011b shl 3 + 0100b + sys_encode_alle2: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00111b shl 3 + 0000b + sys_encode_alle2is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00011b shl 3 + 0000b + sys_encode_alle3: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00111b shl 3 + 0000b + sys_encode_alle3is: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00011b shl 3 + 0000b + sys_encode_aside1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0010b + sys_encode_aside1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0010b + sys_encode_ipas2e1: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00100b shl 3 + 0001b + sys_encode_ipas2e1is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00000b shl 3 + 0001b + sys_encode_ipas2le1: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00100b shl 3 + 0101b + sys_encode_ipas2le1is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00000b shl 3 + 0101b + sys_encode_vaae1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0011b + sys_encode_vaae1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0011b + sys_encode_vaale1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0111b + sys_encode_vaale1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0111b + sys_encode_vae1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0001b + sys_encode_vae1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0001b + sys_encode_vae2: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00111b shl 3 + 0001b + sys_encode_vae2is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00011b shl 3 + 0001b + sys_encode_vae3: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00111b shl 3 + 0001b + sys_encode_vae3is: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00011b shl 3 + 0001b + sys_encode_vale1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0101b + sys_encode_vale1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0101b + sys_encode_vale2: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00111b shl 3 + 0101b + sys_encode_vale2is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00011b shl 3 + 0101b + sys_encode_vale3: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00111b shl 3 + 0101b + sys_encode_vale3is: dw 001b shl 14 + 0110b shl 11 + 01000b shl 7 + 00011b shl 3 + 0101b + sys_encode_vmalle1: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00111b shl 3 + 0000b + sys_encode_vmalle1is: dw 001b shl 14 + 0000b shl 11 + 01000b shl 7 + 00011b shl 3 + 0000b + sys_encode_vmalls12e1: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00111b shl 3 + 0110b + sys_encode_vmalls12e1is: dw 001b shl 14 + 0100b shl 11 + 01000b shl 7 + 00011b shl 3 + 0110b +sys_encode_table_msr: + ;msr/mrs op0 op1 crn crm op2 + sys_encode_actlr_el1: dw 011b shl 14 + 0000b shl 11 + 00001b shl 7 + 00000b shl 3 + 0001b + sys_encode_actlr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00000b shl 3 + 0001b + sys_encode_actlr_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00000b shl 3 + 0001b + sys_encode_afsr0_el1: dw 011b shl 14 + 0000b shl 11 + 00101b shl 7 + 00001b shl 3 + 0000b + sys_encode_afsr0_el2: dw 011b shl 14 + 0100b shl 11 + 00101b shl 7 + 00001b shl 3 + 0000b + sys_encode_afsr0_el3: dw 011b shl 14 + 0110b shl 11 + 00101b shl 7 + 00001b shl 3 + 0000b + sys_encode_afsr1_el1: dw 011b shl 14 + 0000b shl 11 + 00101b shl 7 + 00001b shl 3 + 0001b + sys_encode_afsr1_el2: dw 011b shl 14 + 0100b shl 11 + 00101b shl 7 + 00001b shl 3 + 0001b + sys_encode_afsr1_el3: dw 011b shl 14 + 0110b shl 11 + 00101b shl 7 + 00001b shl 3 + 0001b + sys_encode_aidr_el1: dw 011b shl 14 + 0001b shl 11 + 00000b shl 7 + 00000b shl 3 + 0111b + sys_encode_amair_el1: dw 011b shl 14 + 0000b shl 11 + 01010b shl 7 + 00011b shl 3 + 0000b + sys_encode_amair_el2: dw 011b shl 14 + 0100b shl 11 + 01010b shl 7 + 00011b shl 3 + 0000b + sys_encode_amair_el3: dw 011b shl 14 + 0110b shl 11 + 01010b shl 7 + 00011b shl 3 + 0000b + sys_encode_ccsidr_el1: dw 011b shl 14 + 0001b shl 11 + 00000b shl 7 + 00000b shl 3 + 0000b + sys_encode_clidr_el1: dw 011b shl 14 + 0001b shl 11 + 00000b shl 7 + 00000b shl 3 + 0001b + sys_encode_cntfrq_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00000b shl 3 + 0000b + sys_encode_cnthctl_el2: dw 011b shl 14 + 0100b shl 11 + 01110b shl 7 + 00001b shl 3 + 0000b + sys_encode_cnthp_ctl_el2: dw 011b shl 14 + 0100b shl 11 + 01110b shl 7 + 00010b shl 3 + 0001b + sys_encode_cnthp_cval_el2: dw 011b shl 14 + 0100b shl 11 + 01110b shl 7 + 00010b shl 3 + 0010b + sys_encode_cnthp_tval_el2: dw 011b shl 14 + 0100b shl 11 + 01110b shl 7 + 00010b shl 3 + 0000b + sys_encode_cntkctl_el1: dw 011b shl 14 + 0000b shl 11 + 01110b shl 7 + 00001b shl 3 + 0000b + sys_encode_cntp_ctl_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00010b shl 3 + 0001b + sys_encode_cntp_cval_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00010b shl 3 + 0010b + sys_encode_cntp_tval_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00010b shl 3 + 0000b + sys_encode_cntpct_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00000b shl 3 + 0001b + sys_encode_cntps_ctl_el1: dw 011b shl 14 + 0111b shl 11 + 01110b shl 7 + 00010b shl 3 + 0001b + sys_encode_cntps_cval_el1: dw 011b shl 14 + 0111b shl 11 + 01110b shl 7 + 00010b shl 3 + 0010b + sys_encode_cntps_tval_el1: dw 011b shl 14 + 0111b shl 11 + 01110b shl 7 + 00010b shl 3 + 0000b + sys_encode_cntv_ctl_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00011b shl 3 + 0001b + sys_encode_cntv_cval_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00011b shl 3 + 0010b + sys_encode_cntv_tval_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00011b shl 3 + 0000b + sys_encode_cntvct_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 00000b shl 3 + 0010b + sys_encode_cntvoff_el2: dw 011b shl 14 + 0100b shl 11 + 01110b shl 7 + 00000b shl 3 + 0011b + sys_encode_contextidr_el1: dw 011b shl 14 + 0000b shl 11 + 01101b shl 7 + 00000b shl 3 + 0001b + sys_encode_cpacr_el1: dw 011b shl 14 + 0000b shl 11 + 00001b shl 7 + 00000b shl 3 + 0010b + sys_encode_cptr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00001b shl 3 + 0010b + sys_encode_cptr_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00001b shl 3 + 0010b + sys_encode_csselr_el1: dw 011b shl 14 + 0010b shl 11 + 00000b shl 7 + 00000b shl 3 + 0000b + sys_encode_ctr_el0: dw 011b shl 14 + 0011b shl 11 + 00000b shl 7 + 00000b shl 3 + 0001b + sys_encode_currentel: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00010b shl 3 + 0010b + sys_encode_dacr32_el2: dw 011b shl 14 + 0100b shl 11 + 00011b shl 7 + 00000b shl 3 + 0000b + sys_encode_daif: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00010b shl 3 + 0001b + sys_encode_dbgauthstatus_el1: dw 010b shl 14 + 0000b shl 11 + 00111b shl 7 + 01110b shl 3 + 0110b + sys_encode_dbgbcr0_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0101b + sys_encode_dbgbcr1_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0101b + sys_encode_dbgbcr10_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01010b shl 3 + 0101b + sys_encode_dbgbcr11_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01011b shl 3 + 0101b + sys_encode_dbgbcr12_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01100b shl 3 + 0101b + sys_encode_dbgbcr13_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01101b shl 3 + 0101b + sys_encode_dbgbcr14_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01110b shl 3 + 0101b + sys_encode_dbgbcr15_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01111b shl 3 + 0101b + sys_encode_dbgbcr2_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0101b + sys_encode_dbgbcr3_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0101b + sys_encode_dbgbcr4_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0101b + sys_encode_dbgbcr5_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0101b + sys_encode_dbgbcr6_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0101b + sys_encode_dbgbcr7_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0101b + sys_encode_dbgbcr8_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01000b shl 3 + 0101b + sys_encode_dbgbcr9_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01001b shl 3 + 0101b + sys_encode_dbgbvr0_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0100b + sys_encode_dbgbvr1_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0100b + sys_encode_dbgbvr10_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01010b shl 3 + 0100b + sys_encode_dbgbvr11_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01011b shl 3 + 0100b + sys_encode_dbgbvr12_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01100b shl 3 + 0100b + sys_encode_dbgbvr13_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01101b shl 3 + 0100b + sys_encode_dbgbvr14_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01110b shl 3 + 0100b + sys_encode_dbgbvr15_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01111b shl 3 + 0100b + sys_encode_dbgbvr2_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0100b + sys_encode_dbgbvr3_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0100b + sys_encode_dbgbvr4_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0100b + sys_encode_dbgbvr5_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0100b + sys_encode_dbgbvr6_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0100b + sys_encode_dbgbvr7_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0100b + sys_encode_dbgbvr8_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01000b shl 3 + 0100b + sys_encode_dbgbvr9_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01001b shl 3 + 0100b + sys_encode_dbgclaimclr_el1: dw 010b shl 14 + 0000b shl 11 + 00111b shl 7 + 01001b shl 3 + 0110b + sys_encode_dbgclaimset_el1: dw 010b shl 14 + 0000b shl 11 + 00111b shl 7 + 01000b shl 3 + 0110b + sys_encode_dbgdtr_el0: dw 010b shl 14 + 0011b shl 11 + 00000b shl 7 + 00100b shl 3 + 0000b + sys_encode_dbgdtrrx_el0: dw 010b shl 14 + 0011b shl 11 + 00000b shl 7 + 00101b shl 3 + 0000b + sys_encode_dbgdtrtx_el0: dw 010b shl 14 + 0011b shl 11 + 00000b shl 7 + 00101b shl 3 + 0000b + sys_encode_dbgprcr_el1: dw 010b shl 14 + 0000b shl 11 + 00001b shl 7 + 00100b shl 3 + 0100b + sys_encode_dbgvcr32_el2: dw 010b shl 14 + 0100b shl 11 + 00000b shl 7 + 00111b shl 3 + 0000b + sys_encode_dbgwcr0_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0111b + sys_encode_dbgwcr1_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0111b + sys_encode_dbgwcr10_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01010b shl 3 + 0111b + sys_encode_dbgwcr11_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01011b shl 3 + 0111b + sys_encode_dbgwcr12_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01100b shl 3 + 0111b + sys_encode_dbgwcr13_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01101b shl 3 + 0111b + sys_encode_dbgwcr14_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01110b shl 3 + 0111b + sys_encode_dbgwcr15_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01111b shl 3 + 0111b + sys_encode_dbgwcr2_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0111b + sys_encode_dbgwcr3_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0111b + sys_encode_dbgwcr4_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0111b + sys_encode_dbgwcr5_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0111b + sys_encode_dbgwcr6_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0111b + sys_encode_dbgwcr7_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0111b + sys_encode_dbgwcr8_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01000b shl 3 + 0111b + sys_encode_dbgwcr9_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01001b shl 3 + 0111b + sys_encode_dbgwvr0_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0110b + sys_encode_dbgwvr1_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0110b + sys_encode_dbgwvr10_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01010b shl 3 + 0110b + sys_encode_dbgwvr11_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01011b shl 3 + 0110b + sys_encode_dbgwvr12_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01100b shl 3 + 0110b + sys_encode_dbgwvr13_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01101b shl 3 + 0110b + sys_encode_dbgwvr14_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01110b shl 3 + 0110b + sys_encode_dbgwvr15_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01111b shl 3 + 0110b + sys_encode_dbgwvr2_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0110b + sys_encode_dbgwvr3_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0110b + sys_encode_dbgwvr4_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0110b + sys_encode_dbgwvr5_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0110b + sys_encode_dbgwvr6_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0110b + sys_encode_dbgwvr7_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0110b + sys_encode_dbgwvr8_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01000b shl 3 + 0110b + sys_encode_dbgwvr9_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 01001b shl 3 + 0110b + sys_encode_dczid_el0: dw 011b shl 14 + 0011b shl 11 + 00000b shl 7 + 00000b shl 3 + 0111b + sys_encode_dlr_el0: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00101b shl 3 + 0001b + sys_encode_dspsr_el0: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00101b shl 3 + 0000b + sys_encode_elr_el1: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00000b shl 3 + 0001b + sys_encode_elr_el2: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00000b shl 3 + 0001b + sys_encode_elr_el3: dw 011b shl 14 + 0110b shl 11 + 00100b shl 7 + 00000b shl 3 + 0001b + sys_encode_esr_el1: dw 011b shl 14 + 0000b shl 11 + 00101b shl 7 + 00010b shl 3 + 0000b + sys_encode_esr_el2: dw 011b shl 14 + 0100b shl 11 + 00101b shl 7 + 00010b shl 3 + 0000b + sys_encode_esr_el3: dw 011b shl 14 + 0110b shl 11 + 00101b shl 7 + 00010b shl 3 + 0000b + sys_encode_far_el1: dw 011b shl 14 + 0000b shl 11 + 00110b shl 7 + 00000b shl 3 + 0000b + sys_encode_far_el2: dw 011b shl 14 + 0100b shl 11 + 00110b shl 7 + 00000b shl 3 + 0000b + sys_encode_far_el3: dw 011b shl 14 + 0110b shl 11 + 00110b shl 7 + 00000b shl 3 + 0000b + sys_encode_fpcr: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00100b shl 3 + 0000b + sys_encode_fpexc32_el2: dw 011b shl 14 + 0100b shl 11 + 00101b shl 7 + 00011b shl 3 + 0000b + sys_encode_fpsr: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00100b shl 3 + 0001b + sys_encode_hacr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00001b shl 3 + 0111b + sys_encode_hcr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00001b shl 3 + 0000b + sys_encode_hpfar_el2: dw 011b shl 14 + 0100b shl 11 + 00110b shl 7 + 00000b shl 3 + 0100b + sys_encode_hstr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00001b shl 3 + 0011b + sys_encode_icc_ap0r0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0100b + sys_encode_icc_ap0r1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0101b + sys_encode_icc_ap0r2_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0110b + sys_encode_icc_ap0r3_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0111b + sys_encode_icc_ap1r0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0000b + sys_encode_icc_ap1r1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0001b + sys_encode_icc_ap1r2_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0010b + sys_encode_icc_ap1r3_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0011b + sys_encode_icc_asgi1r_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0110b + sys_encode_icc_bpr0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0011b + sys_encode_icc_bpr1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0011b + sys_encode_icc_ctlr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0100b + sys_encode_icc_ctlr_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 01100b shl 3 + 0100b + sys_encode_icc_dir_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0001b + sys_encode_icc_eoir0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0001b + sys_encode_icc_eoir1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0001b + sys_encode_icc_hppir0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0010b + sys_encode_icc_hppir1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0010b + sys_encode_icc_iar0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0000b + sys_encode_icc_iar1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0000b + sys_encode_icc_igrpen0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0110b + sys_encode_icc_igrpen1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0111b + sys_encode_icc_igrpen1_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 01100b shl 3 + 0111b + sys_encode_icc_pmr_el1: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00110b shl 3 + 0000b + sys_encode_icc_rpr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0011b + sys_encode_icc_sgi0r_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0111b + sys_encode_icc_sgi1r_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0101b + sys_encode_icc_sre_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0101b + sys_encode_icc_sre_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01001b shl 3 + 0101b + sys_encode_icc_sre_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 01100b shl 3 + 0101b + sys_encode_ich_ap0r0_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01000b shl 3 + 0000b + sys_encode_ich_ap0r1_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01000b shl 3 + 0001b + sys_encode_ich_ap0r2_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01000b shl 3 + 0010b + sys_encode_ich_ap0r3_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01000b shl 3 + 0011b + sys_encode_ich_ap1r0_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01001b shl 3 + 0000b + sys_encode_ich_ap1r1_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01001b shl 3 + 0001b + sys_encode_ich_ap1r2_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01001b shl 3 + 0010b + sys_encode_ich_ap1r3_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01001b shl 3 + 0011b + sys_encode_ich_eisr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0011b + sys_encode_ich_elrsr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0101b + sys_encode_ich_hcr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0000b + sys_encode_ich_lr0_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0000b + sys_encode_ich_lr1_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0001b + sys_encode_ich_lr10_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0010b + sys_encode_ich_lr11_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0011b + sys_encode_ich_lr12_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0100b + sys_encode_ich_lr13_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0101b + sys_encode_ich_lr14_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0110b + sys_encode_ich_lr15_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0111b + sys_encode_ich_lr2_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0010b + sys_encode_ich_lr3_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0011b + sys_encode_ich_lr4_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0100b + sys_encode_ich_lr5_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0101b + sys_encode_ich_lr6_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0110b + sys_encode_ich_lr7_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01100b shl 3 + 0111b + sys_encode_ich_lr8_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0000b + sys_encode_ich_lr9_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01101b shl 3 + 0001b + sys_encode_ich_misr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0010b + sys_encode_ich_vmcr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0111b + sys_encode_ich_vtr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 01011b shl 3 + 0001b + sys_encode_icv_ap0r0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0100b + sys_encode_icv_ap0r1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0101b + sys_encode_icv_ap0r2_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0110b + sys_encode_icv_ap0r3_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0111b + sys_encode_icv_ap1r0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0000b + sys_encode_icv_ap1r1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0001b + sys_encode_icv_ap1r2_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0010b + sys_encode_icv_ap1r3_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01001b shl 3 + 0011b + sys_encode_icv_bpr0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0011b + sys_encode_icv_bpr1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0011b + sys_encode_icv_ctlr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0100b + sys_encode_icv_dir_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0001b + sys_encode_icv_eoir0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0001b + sys_encode_icv_eoir1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0001b + sys_encode_icv_hppir0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0010b + sys_encode_icv_hppir1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0010b + sys_encode_icv_iar0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01000b shl 3 + 0000b + sys_encode_icv_iar1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0000b + sys_encode_icv_igrpen0_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0110b + sys_encode_icv_igrpen1_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01100b shl 3 + 0111b + sys_encode_icv_pmr_el1: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00110b shl 3 + 0000b + sys_encode_icv_rpr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 01011b shl 3 + 0011b + sys_encode_id_aa64afr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0100b + sys_encode_id_aa64afr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0101b + sys_encode_id_aa64dfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0000b + sys_encode_id_aa64dfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00101b shl 3 + 0001b + sys_encode_id_aa64isar0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0000b + sys_encode_id_aa64isar1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0001b + sys_encode_id_aa64mmfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0000b + sys_encode_id_aa64mmfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00111b shl 3 + 0001b + sys_encode_id_aa64pfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0000b + sys_encode_id_aa64pfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00100b shl 3 + 0001b + sys_encode_id_afr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0011b + sys_encode_id_dfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0010b + sys_encode_id_isar0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0000b + sys_encode_id_isar1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0001b + sys_encode_id_isar2_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0010b + sys_encode_id_isar3_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0011b + sys_encode_id_isar4_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0100b + sys_encode_id_isar5_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0101b + sys_encode_id_mmfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0100b + sys_encode_id_mmfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0101b + sys_encode_id_mmfr2_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0110b + sys_encode_id_mmfr3_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0111b + sys_encode_id_mmfr4_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0110b + sys_encode_id_pfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0000b + sys_encode_id_pfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00001b shl 3 + 0001b + sys_encode_ifsr32_el2: dw 011b shl 14 + 0100b shl 11 + 00101b shl 7 + 00000b shl 3 + 0001b + sys_encode_isr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 00001b shl 3 + 0000b + sys_encode_mair_el1: dw 011b shl 14 + 0000b shl 11 + 01010b shl 7 + 00010b shl 3 + 0000b + sys_encode_mair_el2: dw 011b shl 14 + 0100b shl 11 + 01010b shl 7 + 00010b shl 3 + 0000b + sys_encode_mair_el3: dw 011b shl 14 + 0110b shl 11 + 01010b shl 7 + 00010b shl 3 + 0000b + sys_encode_mdccint_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0000b + sys_encode_mdccsr_el0: dw 010b shl 14 + 0011b shl 11 + 00000b shl 7 + 00001b shl 3 + 0000b + sys_encode_mdcr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00001b shl 3 + 0001b + sys_encode_mdcr_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00011b shl 3 + 0001b + sys_encode_mdrar_el1: dw 010b shl 14 + 0000b shl 11 + 00001b shl 7 + 00000b shl 3 + 0000b + sys_encode_mdscr_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00010b shl 3 + 0010b + sys_encode_midr_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0000b + sys_encode_mpidr_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0101b + sys_encode_mvfr0_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0000b + sys_encode_mvfr1_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0001b + sys_encode_mvfr2_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0010b + sys_encode_nzcv: dw 011b shl 14 + 0011b shl 11 + 00100b shl 7 + 00010b shl 3 + 0000b + sys_encode_osdlr_el1: dw 010b shl 14 + 0000b shl 11 + 00001b shl 7 + 00011b shl 3 + 0100b + sys_encode_osdtrrx_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0010b + sys_encode_osdtrtx_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00011b shl 3 + 0010b + sys_encode_oseccr_el1: dw 010b shl 14 + 0000b shl 11 + 00000b shl 7 + 00110b shl 3 + 0010b + sys_encode_oslar_el1: dw 010b shl 14 + 0000b shl 11 + 00001b shl 7 + 00000b shl 3 + 0100b + sys_encode_oslsr_el1: dw 010b shl 14 + 0000b shl 11 + 00001b shl 7 + 00001b shl 3 + 0100b + sys_encode_par_el1: dw 011b shl 14 + 0000b shl 11 + 00111b shl 7 + 00100b shl 3 + 0000b + sys_encode_pmccfiltr_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0111b + sys_encode_pmccntr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01101b shl 3 + 0000b + sys_encode_pmceid0_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0110b + sys_encode_pmceid1_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0111b + sys_encode_pmcntenclr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0010b + sys_encode_pmcntenset_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0001b + sys_encode_pmcr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0000b + sys_encode_pmevcntr0_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0000b + sys_encode_pmevcntr1_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0001b + sys_encode_pmevcntr10_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0010b + sys_encode_pmevcntr11_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0011b + sys_encode_pmevcntr12_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0100b + sys_encode_pmevcntr13_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0101b + sys_encode_pmevcntr14_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0110b + sys_encode_pmevcntr15_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0111b + sys_encode_pmevcntr16_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0000b + sys_encode_pmevcntr17_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0001b + sys_encode_pmevcntr18_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0010b + sys_encode_pmevcntr19_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0011b + sys_encode_pmevcntr2_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0010b + sys_encode_pmevcntr20_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0100b + sys_encode_pmevcntr21_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0101b + sys_encode_pmevcntr22_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0110b + sys_encode_pmevcntr23_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01010b shl 3 + 0111b + sys_encode_pmevcntr24_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0000b + sys_encode_pmevcntr25_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0001b + sys_encode_pmevcntr26_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0010b + sys_encode_pmevcntr27_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0011b + sys_encode_pmevcntr28_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0100b + sys_encode_pmevcntr29_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0101b + sys_encode_pmevcntr3_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0011b + sys_encode_pmevcntr30_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01011b shl 3 + 0110b + sys_encode_pmevcntr4_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0100b + sys_encode_pmevcntr5_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0101b + sys_encode_pmevcntr6_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0110b + sys_encode_pmevcntr7_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01000b shl 3 + 0111b + sys_encode_pmevcntr8_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0000b + sys_encode_pmevcntr9_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01001b shl 3 + 0001b + sys_encode_pmevtyper0_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0000b + sys_encode_pmevtyper1_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0001b + sys_encode_pmevtyper10_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0010b + sys_encode_pmevtyper11_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0011b + sys_encode_pmevtyper12_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0100b + sys_encode_pmevtyper13_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0101b + sys_encode_pmevtyper14_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0110b + sys_encode_pmevtyper15_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0111b + sys_encode_pmevtyper16_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0000b + sys_encode_pmevtyper17_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0001b + sys_encode_pmevtyper18_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0010b + sys_encode_pmevtyper19_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0011b + sys_encode_pmevtyper2_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0010b + sys_encode_pmevtyper20_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0100b + sys_encode_pmevtyper21_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0101b + sys_encode_pmevtyper22_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0110b + sys_encode_pmevtyper23_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01110b shl 3 + 0111b + sys_encode_pmevtyper24_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0000b + sys_encode_pmevtyper25_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0001b + sys_encode_pmevtyper26_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0010b + sys_encode_pmevtyper27_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0011b + sys_encode_pmevtyper28_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0100b + sys_encode_pmevtyper29_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0101b + sys_encode_pmevtyper3_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0011b + sys_encode_pmevtyper30_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01111b shl 3 + 0110b + sys_encode_pmevtyper4_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0100b + sys_encode_pmevtyper5_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0101b + sys_encode_pmevtyper6_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0110b + sys_encode_pmevtyper7_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01100b shl 3 + 0111b + sys_encode_pmevtyper8_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0000b + sys_encode_pmevtyper9_el0: dw 011b shl 14 + 0011b shl 11 + 01110b shl 7 + 01101b shl 3 + 0001b + sys_encode_pmintenclr_el1: dw 011b shl 14 + 0000b shl 11 + 01001b shl 7 + 01110b shl 3 + 0010b + sys_encode_pmintenset_el1: dw 011b shl 14 + 0000b shl 11 + 01001b shl 7 + 01110b shl 3 + 0001b + sys_encode_pmovsclr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0011b + sys_encode_pmovsset_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01110b shl 3 + 0011b + sys_encode_pmselr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0101b + sys_encode_pmswinc_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01100b shl 3 + 0100b + sys_encode_pmuserenr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01110b shl 3 + 0000b + sys_encode_pmxevcntr_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01101b shl 3 + 0010b + sys_encode_pmxevtyper_el0: dw 011b shl 14 + 0011b shl 11 + 01001b shl 7 + 01101b shl 3 + 0001b + sys_encode_revidr_el1: dw 011b shl 14 + 0000b shl 11 + 00000b shl 7 + 00000b shl 3 + 0110b + sys_encode_rmr_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 00000b shl 3 + 0010b + sys_encode_rmr_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 00000b shl 3 + 0010b + sys_encode_rmr_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 00000b shl 3 + 0010b + sys_encode_rvbar_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 00000b shl 3 + 0001b + sys_encode_rvbar_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 00000b shl 3 + 0001b + sys_encode_rvbar_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 00000b shl 3 + 0001b + sys_encode_scr_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00001b shl 3 + 0000b + sys_encode_sctlr_el1: dw 011b shl 14 + 0000b shl 11 + 00001b shl 7 + 00000b shl 3 + 0000b + sys_encode_sctlr_el2: dw 011b shl 14 + 0100b shl 11 + 00001b shl 7 + 00000b shl 3 + 0000b + sys_encode_sctlr_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00000b shl 3 + 0000b + sys_encode_sder32_el3: dw 011b shl 14 + 0110b shl 11 + 00001b shl 7 + 00001b shl 3 + 0001b + sys_encode_sp_el0: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00001b shl 3 + 0000b + sys_encode_sp_el1: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00001b shl 3 + 0000b + sys_encode_sp_el2: dw 011b shl 14 + 0110b shl 11 + 00100b shl 7 + 00001b shl 3 + 0000b + sys_encode_spsel: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00010b shl 3 + 0000b + sys_encode_spsr_abt: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00011b shl 3 + 0001b + sys_encode_spsr_el1: dw 011b shl 14 + 0000b shl 11 + 00100b shl 7 + 00000b shl 3 + 0000b + sys_encode_spsr_el2: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00000b shl 3 + 0000b + sys_encode_spsr_el3: dw 011b shl 14 + 0110b shl 11 + 00100b shl 7 + 00000b shl 3 + 0000b + sys_encode_spsr_fiq: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00011b shl 3 + 0011b + sys_encode_spsr_irq: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00011b shl 3 + 0000b + sys_encode_spsr_und: dw 011b shl 14 + 0100b shl 11 + 00100b shl 7 + 00011b shl 3 + 0010b + sys_encode_tcr_el1: dw 011b shl 14 + 0000b shl 11 + 00010b shl 7 + 00000b shl 3 + 0010b + sys_encode_tcr_el2: dw 011b shl 14 + 0100b shl 11 + 00010b shl 7 + 00000b shl 3 + 0010b + sys_encode_tcr_el3: dw 011b shl 14 + 0110b shl 11 + 00010b shl 7 + 00000b shl 3 + 0010b + sys_encode_tpidr_el0: dw 011b shl 14 + 0011b shl 11 + 01101b shl 7 + 00000b shl 3 + 0010b + sys_encode_tpidr_el1: dw 011b shl 14 + 0000b shl 11 + 01101b shl 7 + 00000b shl 3 + 0100b + sys_encode_tpidr_el2: dw 011b shl 14 + 0100b shl 11 + 01101b shl 7 + 00000b shl 3 + 0010b + sys_encode_tpidr_el3: dw 011b shl 14 + 0110b shl 11 + 01101b shl 7 + 00000b shl 3 + 0010b + sys_encode_tpidrro_el0: dw 011b shl 14 + 0011b shl 11 + 01101b shl 7 + 00000b shl 3 + 0011b + sys_encode_ttbr0_el1: dw 011b shl 14 + 0000b shl 11 + 00010b shl 7 + 00000b shl 3 + 0000b + sys_encode_ttbr0_el2: dw 011b shl 14 + 0100b shl 11 + 00010b shl 7 + 00000b shl 3 + 0000b + sys_encode_ttbr0_el3: dw 011b shl 14 + 0110b shl 11 + 00010b shl 7 + 00000b shl 3 + 0000b + sys_encode_ttbr1_el1: dw 011b shl 14 + 0000b shl 11 + 00010b shl 7 + 00000b shl 3 + 0001b + sys_encode_vbar_el1: dw 011b shl 14 + 0000b shl 11 + 01100b shl 7 + 00000b shl 3 + 0000b + sys_encode_vbar_el2: dw 011b shl 14 + 0100b shl 11 + 01100b shl 7 + 00000b shl 3 + 0000b + sys_encode_vbar_el3: dw 011b shl 14 + 0110b shl 11 + 01100b shl 7 + 00000b shl 3 + 0000b + sys_encode_vmpidr_el2: dw 011b shl 14 + 0100b shl 11 + 00000b shl 7 + 00000b shl 3 + 0101b + sys_encode_vpidr_el2: dw 011b shl 14 + 0100b shl 11 + 00000b shl 7 + 00000b shl 3 + 0000b + sys_encode_vtcr_el2: dw 011b shl 14 + 0100b shl 11 + 00010b shl 7 + 00001b shl 3 + 0010b + sys_encode_vttbr_el2: dw 011b shl 14 + 0100b shl 11 + 00010b shl 7 + 00001b shl 3 + 0000b +sys_encode_table_pstate: + ;msr imm op0 op1 crn crm op2 + sys_pencode_daifclr: dw 000b shl 14 + 0011b shl 11 + 00100b shl 7 + 00000b shl 3 + 0111b + sys_pencode_daifset: dw 000b shl 14 + 0011b shl 11 + 00100b shl 7 + 00000b shl 3 + 0110b + sys_pencode_spsel: dw 000b shl 14 + 0000b shl 11 + 00100b shl 7 + 00000b shl 3 + 0101b + +data_directives: + dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3) + dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3) + dw data_directives_4-data_directives,(data_directives_end-data_directives_4)/(4+3) + +data_directives_2: + db 'db',1 + dw data_bytes-instruction_handler + db 'dd',8 + dw data_qwords-instruction_handler ;ARM dwords + db 'dh',2 + dw data_words-instruction_handler ;ARM hwords + db 'du',2 + dw data_unicode-instruction_handler + db 'dw',4 + dw data_dwords-instruction_handler ;ARM words + db 'rb',1 + dw reserve_bytes-instruction_handler + db 'rd',8 + dw reserve_qwords-instruction_handler ;ARM dwords + db 'rh',2 + dw reserve_words-instruction_handler ;ARM hwords + db 'rw',4 + dw reserve_dwords-instruction_handler ;ARM words +data_directives_3: +data_directives_4: + db 'file',1 + dw data_file-instruction_handler +data_directives_end: + +instructions: + dd instructions_1-instructions,(instructions_2-instructions_1)/(1+3) + dd instructions_2-instructions,(instructions_3-instructions_2)/(2+3) + dd instructions_3-instructions,(instructions_4-instructions_3)/(3+3) + dd instructions_4-instructions,(instructions_5-instructions_4)/(4+3) + dd instructions_5-instructions,(instructions_6-instructions_5)/(5+3) + dd instructions_6-instructions,(instructions_7-instructions_6)/(6+3) + dd instructions_7-instructions,(instructions_8-instructions_7)/(7+3) + dd instructions_8-instructions,(instructions_9-instructions_8)/(8+3) + dd instructions_9-instructions,(instructions_10-instructions_9)/(9+3) + dd instructions_10-instructions,(instructions_11-instructions_10)/(10+3) + dd instructions_11-instructions,(instructions_12-instructions_11)/(11+3) + dd instructions_12-instructions,(instructions_13-instructions_12)/(12+3) + dd instructions_13-instructions,(instructions_14-instructions_13)/(13+3) + dd instructions_14-instructions,(instructions_15-instructions_14)/(14+3) + dd instructions_15-instructions,(instructions_16-instructions_15)/(15+3) + dd instructions_16-instructions,(instructions_end-instructions_16)/(16+3) +instructions_1: + db 'b',0xe0 + dw ARM_instruction_b-instruction_handler + db 0 +instructions_2: + db 'at',0xf0 + dw ARM_instruction_at-instruction_handler + db 'bl',0xe0 + dw ARM_instruction_bl-instruction_handler + db 'br',0xf0 + dw ARM_instruction_br-instruction_handler + db 'bx',0xe0 + dw ARM_instruction_bx-instruction_handler + db 'dc',0xf0 + dw ARM_instruction_dc-instruction_handler + db 'hb',0xe0 + dw ARM_instruction_hb-instruction_handler + db 'ic',0xf0 + dw ARM_instruction_ic-instruction_handler + db 'if',0x00 + dw if_directive-instruction_handler + db 'it',0xf0 + dw ARM_instruction_it-instruction_handler + db 0 +instructions_3: + db 'abs',0xf0 + dw ARM_instruction_abs-instruction_handler + db 'adc',0xe0 + dw ARM_instruction_adc-instruction_handler + db 'add',0xe0 + dw ARM_instruction_add-instruction_handler + db 'adr',0xe0 + dw ARM_instruction_adr-instruction_handler + db 'and',0xe0 + dw ARM_instruction_and-instruction_handler + db 'asr',0xe0 + dw ARM_instruction_asr-instruction_handler + db 'b.n',0xe4 + dw ARM_instruction_b-instruction_handler + db 'b.w',0xe2 + dw ARM_instruction_b-instruction_handler + db 'bfc',0xe0 + dw ARM_instruction_bfc-instruction_handler + db 'bfi',0xe0 + dw ARM_instruction_bfi-instruction_handler + db 'bfm',0xf0 + dw ARM_instruction_bfm-instruction_handler + db 'bic',0xe0 + dw ARM_instruction_bic-instruction_handler + db 'bif',0xf0 + dw ARM_instruction_bif-instruction_handler + db 'bit',0xf0 + dw ARM_instruction_bit-instruction_handler + db 'blr',0xf0 + dw ARM_instruction_blr-instruction_handler + db 'blx',0xe0 + dw ARM_instruction_blx-instruction_handler + db 'brk',0xf0 + dw ARM_instruction_brk-instruction_handler + db 'bsl',0xf0 + dw ARM_instruction_bsl-instruction_handler + db 'bxj',0xe0 + dw ARM_instruction_bxj-instruction_handler + db 'b~~',0x00 + dw ARM_instruction_b-instruction_handler + db 'cbz',0xf0 + dw ARM_instruction_cbz-instruction_handler + db 'cdp',0xe0 + dw ARM_instruction_cdp-instruction_handler + db 'cls',0xf0 + dw ARM_instruction_cls-instruction_handler + db 'clz',0xe0 + dw ARM_instruction_clz-instruction_handler + db 'cmf',0xe0 + dw ARM_instruction_cmf-instruction_handler + db 'cmn',0xe0 + dw ARM_instruction_cmn-instruction_handler + db 'cmp',0xe0 + dw ARM_instruction_cmp-instruction_handler + db 'cnf',0xe0 + dw ARM_instruction_cnf-instruction_handler + db 'cnt',0xf0 + dw ARM_instruction_cnt-instruction_handler + db 'cps',0xf0 + dw ARM_instruction_cps-instruction_handler + db 'cpy',0xe0 + dw ARM_instruction_cpy-instruction_handler + db 'dbg',0xe0 + dw ARM_instruction_dbg-instruction_handler + db 'dmb',0xf0 + dw ARM_instruction_dmb-instruction_handler + db 'dsb',0xf0 + dw ARM_instruction_dsb-instruction_handler + db 'dup',0xf0 + dw ARM_instruction_dup-instruction_handler + db 'end',0x00 + dw end_directive-instruction_handler + db 'eon',0xf0 + dw ARM_instruction_eon-instruction_handler + db 'eor',0xe0 + dw ARM_instruction_eor-instruction_handler + db 'err',0x00 + dw err_directive-instruction_handler + db 'ext',0xf0 + dw ARM_instruction_ext-instruction_handler + db 'fix',0xe0 + dw ARM_instruction_fix-instruction_handler + db 'hbl',0xe0 + dw ARM_instruction_hbl-instruction_handler + db 'hbp',0xe0 + dw ARM_instruction_hbp-instruction_handler + db 'hlt',0xe0 + dw ARM_instruction_hlt-instruction_handler + db 'hvc',0xe0 + dw ARM_instruction_hvc-instruction_handler + db 'ins',0xf0 + dw ARM_instruction_ins-instruction_handler + db 'isb',0xf0 + dw ARM_instruction_isb-instruction_handler + db 'ite',0xf0 + dw ARM_instruction_ite-instruction_handler + db 'itt',0xf0 + dw ARM_instruction_itt-instruction_handler + db 'ld1',0xf0 + dw ARM_instruction_ld1-instruction_handler + db 'ld2',0xf0 + dw ARM_instruction_ld2-instruction_handler + db 'ld3',0xf0 + dw ARM_instruction_ld3-instruction_handler + db 'ld4',0xf0 + dw ARM_instruction_ld4-instruction_handler + db 'lda',0xe0 + dw ARM_instruction_lda-instruction_handler + db 'ldc',0xe0 + dw ARM_instruction_ldc-instruction_handler + db 'ldm',0xe0 + dw ARM_instruction_ldm-instruction_handler + db 'ldp',0xf0 + dw ARM_instruction_ldp-instruction_handler + db 'ldr',0xe0 + dw ARM_instruction_ldr-instruction_handler + db 'lfm',0xe0 + dw ARM_instruction_lfm-instruction_handler + db 'lsl',0xe0 + dw ARM_instruction_lsl-instruction_handler + db 'lsr',0xe0 + dw ARM_instruction_lsr-instruction_handler + db 'mar',0xe0 + dw ARM_instruction_mar-instruction_handler + db 'mcr',0xe0 + dw ARM_instruction_mcr-instruction_handler + db 'mia',0xe0 + dw ARM_instruction_mia-instruction_handler + db 'mla',0xe0 + dw ARM_instruction_mla-instruction_handler + db 'mls',0xe0 + dw ARM_instruction_mls-instruction_handler + db 'mov',0xe0 + dw ARM_instruction_mov-instruction_handler + db 'mra',0xe0 + dw ARM_instruction_mra-instruction_handler + db 'mrc',0xe0 + dw ARM_instruction_mrc-instruction_handler + db 'mrs',0xe0 + dw ARM_instruction_mrs-instruction_handler + db 'msr',0xe0 + dw ARM_instruction_msr-instruction_handler + db 'mul',0xe0 + dw ARM_instruction_mul-instruction_handler + db 'mvn',0xe0 + dw ARM_instruction_mvn-instruction_handler + db 'neg',0xe0 + dw ARM_instruction_neg-instruction_handler + db 'ngc',0xf0 + dw ARM_instruction_ngc-instruction_handler + db 'nop',0xe0 + dw ARM_instruction_nop-instruction_handler + db 'not',0xf0 + dw ARM_instruction_not-instruction_handler + db 'org',0x00 + dw ARM_org_directive-instruction_handler + db 'orn',0xe0 + dw ARM_instruction_orn-instruction_handler + db 'orr',0xe0 + dw ARM_instruction_orr-instruction_handler + db 'pld',0xe0 + dw ARM_instruction_pld-instruction_handler + db 'pli',0xe0 + dw ARM_instruction_pli-instruction_handler + db 'pop',0xe0 + dw ARM_instruction_pop-instruction_handler + db 'ret',0xf0 + dw ARM_instruction_ret-instruction_handler + db 'rev',0xe0 + dw ARM_instruction_rev-instruction_handler + db 'rfc',0xe0 + dw ARM_instruction_rfc-instruction_handler + db 'rfe',0xf0 + dw ARM_instruction_rfe-instruction_handler + db 'rfs',0xe0 + dw ARM_instruction_rfs-instruction_handler + db 'ror',0xe0 + dw ARM_instruction_ror-instruction_handler + db 'rrx',0xe0 + dw ARM_instruction_rrx-instruction_handler + db 'rsb',0xe0 + dw ARM_instruction_rsb-instruction_handler + db 'rsc',0xe0 + dw ARM_instruction_rsc-instruction_handler + db 'sbc',0xe0 + dw ARM_instruction_sbc-instruction_handler + db 'sel',0xe0 + dw ARM_instruction_sel-instruction_handler + db 'sev',0xe0 + dw ARM_instruction_sev-instruction_handler + db 'sfm',0xe0 + dw ARM_instruction_sfm-instruction_handler + db 'shl',0xf0 + dw ARM_instruction_shl-instruction_handler + db 'sli',0xf0 + dw ARM_instruction_sli-instruction_handler + db 'smc',0xe0 + dw ARM_instruction_smc-instruction_handler + db 'smi',0xe0 + dw ARM_instruction_smi-instruction_handler + db 'sri',0xf0 + dw ARM_instruction_sri-instruction_handler + db 'srs',0xf0 + dw ARM_instruction_srs-instruction_handler + db 'st1',0xf0 + dw ARM_instruction_st1-instruction_handler + db 'st2',0xf0 + dw ARM_instruction_st2-instruction_handler + db 'st3',0xf0 + dw ARM_instruction_st3-instruction_handler + db 'st4',0xf0 + dw ARM_instruction_st4-instruction_handler + db 'stc',0xe0 + dw ARM_instruction_stc-instruction_handler + db 'stl',0xe0 + dw ARM_instruction_stl-instruction_handler + db 'stm',0xe0 + dw ARM_instruction_stm-instruction_handler + db 'stp',0xf0 + dw ARM_instruction_stp-instruction_handler + db 'str',0xe0 + dw ARM_instruction_str-instruction_handler + db 'sub',0xe0 + dw ARM_instruction_sub-instruction_handler + db 'svc',0xe0 + dw ARM_instruction_svc-instruction_handler + db 'swi',0xe0 + dw ARM_instruction_swi-instruction_handler + db 'swp',0xe0 + dw ARM_instruction_swp-instruction_handler + db 'sys',0xf0 + dw ARM_instruction_sys-instruction_handler + db 'tbb',0xe0 + dw ARM_instruction_tbb-instruction_handler + db 'tbh',0xe0 + dw ARM_instruction_tbh-instruction_handler + db 'tbl',0xf0 + dw ARM_instruction_tbl-instruction_handler + db 'tbx',0xf0 + dw ARM_instruction_tbx-instruction_handler + db 'tbz',0xf0 + dw ARM_instruction_tbz-instruction_handler + db 'teq',0xe0 + dw ARM_instruction_teq-instruction_handler + db 'tst',0xe0 + dw ARM_instruction_tst-instruction_handler + db 'und',0xe0 + dw ARM_instruction_und-instruction_handler + db 'wfc',0xe0 + dw ARM_instruction_wfc-instruction_handler + db 'wfe',0xe0 + dw ARM_instruction_wfe-instruction_handler + db 'wfi',0xe0 + dw ARM_instruction_wfi-instruction_handler + db 'wfs',0xe0 + dw ARM_instruction_wfs-instruction_handler + db 'wor',0xe0 + dw ARM_instruction_wor-instruction_handler + db 'xtn',0xf0 + dw ARM_instruction_xtn-instruction_handler + db 0 +instructions_4: + db 'absd',0xe0 + dw ARM_instruction_absd-instruction_handler + db 'abse',0xe0 + dw ARM_instruction_abse-instruction_handler + db 'abss',0xe0 + dw ARM_instruction_abss-instruction_handler + db 'acsd',0xe0 + dw ARM_instruction_acsd-instruction_handler + db 'acse',0xe0 + dw ARM_instruction_acse-instruction_handler + db 'acss',0xe0 + dw ARM_instruction_acss-instruction_handler + db 'adcs',0xe1 + dw ARM_instruction_adc-instruction_handler + db 'addp',0xf0 + dw ARM_instruction_addp-instruction_handler + db 'adds',0xe1 + dw ARM_instruction_add-instruction_handler + db 'addv',0xf0 + dw ARM_instruction_addv-instruction_handler + db 'addw',0xe0 + dw ARM_instruction_addw-instruction_handler + db 'adfd',0xe0 + dw ARM_instruction_adfd-instruction_handler + db 'adfe',0xe0 + dw ARM_instruction_adfe-instruction_handler + db 'adfs',0xe0 + dw ARM_instruction_adfs-instruction_handler + db 'adrp',0xf0 + dw ARM_instruction_adrp-instruction_handler + db 'aesd',0xf0 + dw ARM_instruction_aesd-instruction_handler + db 'aese',0xf0 + dw ARM_instruction_aese-instruction_handler + db 'ands',0xe1 + dw ARM_instruction_and-instruction_handler + db 'asnd',0xe0 + dw ARM_instruction_asnd-instruction_handler + db 'asne',0xe0 + dw ARM_instruction_asne-instruction_handler + db 'asns',0xe0 + dw ARM_instruction_asns-instruction_handler + db 'asrs',0xe1 + dw ARM_instruction_asr-instruction_handler + db 'asrv',0xf0 + dw ARM_instruction_asrv-instruction_handler + db 'atnd',0xe0 + dw ARM_instruction_atnd-instruction_handler + db 'atne',0xe0 + dw ARM_instruction_atne-instruction_handler + db 'atns',0xe0 + dw ARM_instruction_atns-instruction_handler + db 'b.al',0xf0 + dw ARM_instruction_b.al-instruction_handler + db 'b.cc',0xf0 + dw ARM_instruction_b.cc-instruction_handler + db 'b.cs',0xf0 + dw ARM_instruction_b.cs-instruction_handler + db 'b.eq',0xf0 + dw ARM_instruction_b.eq-instruction_handler + db 'b.ge',0xf0 + dw ARM_instruction_b.ge-instruction_handler + db 'b.gt',0xf0 + dw ARM_instruction_b.gt-instruction_handler + db 'b.hi',0xf0 + dw ARM_instruction_b.hi-instruction_handler + db 'b.hs',0xf0 + dw ARM_instruction_b.hs-instruction_handler + db 'b.le',0xf0 + dw ARM_instruction_b.le-instruction_handler + db 'b.lo',0xf0 + dw ARM_instruction_b.lo-instruction_handler + db 'b.ls',0xf0 + dw ARM_instruction_b.ls-instruction_handler + db 'b.lt',0xf0 + dw ARM_instruction_b.lt-instruction_handler + db 'b.mi',0xf0 + dw ARM_instruction_b.mi-instruction_handler + db 'b.ne',0xf0 + dw ARM_instruction_b.ne-instruction_handler + db 'b.nv',0xf0 + dw ARM_instruction_b.nv-instruction_handler + db 'b.pl',0xf0 + dw ARM_instruction_b.pl-instruction_handler + db 'b.vc',0xf0 + dw ARM_instruction_b.vc-instruction_handler + db 'b.vs',0xf0 + dw ARM_instruction_b.vs-instruction_handler + db 'bics',0xe1 + dw ARM_instruction_bic-instruction_handler + db 'bkpt',0xe0 + dw ARM_instruction_bkpt-instruction_handler + db 'bl~~',0x00 + dw ARM_instruction_bl-instruction_handler + db 'bx.n',0xe4 + dw ARM_instruction_bx-instruction_handler + db 'bx.w',0xe2 + dw ARM_instruction_bx-instruction_handler + db 'bx~~',0x00 + dw ARM_instruction_bx-instruction_handler + db 'cbnz',0xf0 + dw ARM_instruction_cbnz-instruction_handler + db 'ccmn',0xf0 + dw ARM_instruction_ccmn-instruction_handler + db 'ccmp',0xf0 + dw ARM_instruction_ccmp-instruction_handler + db 'cdp2',0xe0 + dw ARM_instruction_cdp2-instruction_handler + db 'chka',0xe0 + dw ARM_instruction_chka-instruction_handler + db 'cinc',0xf0 + dw ARM_instruction_cinc-instruction_handler + db 'cinv',0xf0 + dw ARM_instruction_cinv-instruction_handler + db 'cmeq',0xf0 + dw ARM_instruction_cmeq-instruction_handler + db 'cmfe',0xe0 + dw ARM_instruction_cmfe-instruction_handler + db 'cmge',0xf0 + dw ARM_instruction_cmge-instruction_handler + db 'cmgt',0xf0 + dw ARM_instruction_cmgt-instruction_handler + db 'cmhi',0xf0 + dw ARM_instruction_cmhi-instruction_handler + db 'cmhs',0xf0 + dw ARM_instruction_cmhs-instruction_handler + db 'cmle',0xf0 + dw ARM_instruction_cmle-instruction_handler + db 'cmlt',0xf0 + dw ARM_instruction_cmlt-instruction_handler + db 'cmnp',0xe0 + dw ARM_instruction_cmnp-instruction_handler + db 'cmpp',0xe0 + dw ARM_instruction_cmpp-instruction_handler + db 'cneg',0xf0 + dw ARM_instruction_cneg-instruction_handler + db 'cnfe',0xe0 + dw ARM_instruction_cnfe-instruction_handler + db 'cosd',0xe0 + dw ARM_instruction_cosd-instruction_handler + db 'cose',0xe0 + dw ARM_instruction_cose-instruction_handler + db 'coss',0xe0 + dw ARM_instruction_coss-instruction_handler + db 'csel',0xf0 + dw ARM_instruction_csel-instruction_handler + db 'cset',0xf0 + dw ARM_instruction_cset-instruction_handler + db 'data',0x00 + dw data_directive-instruction_handler + db 'drps',0xf0 + dw ARM_instruction_drps-instruction_handler + db 'dvfd',0xe0 + dw ARM_instruction_dvfd-instruction_handler + db 'dvfe',0xe0 + dw ARM_instruction_dvfe-instruction_handler + db 'dvfs',0xe0 + dw ARM_instruction_dvfs-instruction_handler + db 'else',0x00 + dw else_directive-instruction_handler + db 'eors',0xe1 + dw ARM_instruction_eor-instruction_handler + db 'eret',0xe0 + dw ARM_instruction_eret-instruction_handler + db 'expd',0xe0 + dw ARM_instruction_expd-instruction_handler + db 'expe',0xe0 + dw ARM_instruction_expe-instruction_handler + db 'exps',0xe0 + dw ARM_instruction_exps-instruction_handler + db 'extr',0xf0 + dw ARM_instruction_extr-instruction_handler + db 'fabd',0xf0 + dw ARM_instruction_fabd-instruction_handler + db 'fabs',0xf0 + dw ARM_instruction_fabs-instruction_handler + db 'fadd',0xf0 + dw ARM_instruction_fadd-instruction_handler + db 'fcmp',0xf0 + dw ARM_instruction_fcmp-instruction_handler + db 'fcvt',0xf0 + dw ARM_instruction_fcvt-instruction_handler + db 'fdiv',0xf0 + dw ARM_instruction_fdiv-instruction_handler + db 'fdvd',0xe0 + dw ARM_instruction_fdvd-instruction_handler + db 'fdve',0xe0 + dw ARM_instruction_fdve-instruction_handler + db 'fdvs',0xe0 + dw ARM_instruction_fdvs-instruction_handler + db 'fixm',0xe0 + dw ARM_instruction_fixm-instruction_handler + db 'fixp',0xe0 + dw ARM_instruction_fixp-instruction_handler + db 'fixz',0xe0 + dw ARM_instruction_fixz-instruction_handler + db 'fldd',0xe0 + dw ARM_instruction_fldd-instruction_handler + db 'flds',0xe0 + dw ARM_instruction_flds-instruction_handler + db 'fltd',0xe0 + dw ARM_instruction_fltd-instruction_handler + db 'flte',0xe0 + dw ARM_instruction_flte-instruction_handler + db 'flts',0xe0 + dw ARM_instruction_flts-instruction_handler + db 'fmax',0xf0 + dw ARM_instruction_fmax-instruction_handler + db 'fmin',0xf0 + dw ARM_instruction_fmin-instruction_handler + db 'fmla',0xf0 + dw ARM_instruction_fmla-instruction_handler + db 'fmld',0xe0 + dw ARM_instruction_fmld-instruction_handler + db 'fmle',0xe0 + dw ARM_instruction_fmle-instruction_handler + db 'fmls',0xe0 + dw ARM_instruction_fmls-instruction_handler + db 'fmov',0xf0 + dw ARM_instruction_fmov-instruction_handler + db 'fmrs',0xe0 + dw ARM_instruction_fmrs-instruction_handler + db 'fmrx',0xe0 + dw ARM_instruction_fmrx-instruction_handler + db 'fmsr',0xe0 + dw ARM_instruction_fmsr-instruction_handler + db 'fmul',0xf0 + dw ARM_instruction_fmul-instruction_handler + db 'fmxr',0xe0 + dw ARM_instruction_fmxr-instruction_handler + db 'fneg',0xf0 + dw ARM_instruction_fneg-instruction_handler + db 'frdd',0xe0 + dw ARM_instruction_frdd-instruction_handler + db 'frde',0xe0 + dw ARM_instruction_frde-instruction_handler + db 'frds',0xe0 + dw ARM_instruction_frds-instruction_handler + db 'fstd',0xe0 + dw ARM_instruction_fstd-instruction_handler + db 'fsts',0xe0 + dw ARM_instruction_fsts-instruction_handler + db 'fsub',0xf0 + dw ARM_instruction_fsub-instruction_handler + db 'hblp',0xe0 + dw ARM_instruction_hblp-instruction_handler + db 'hb~~',0x00 + dw ARM_instruction_hb-instruction_handler + db 'heap',0x00 + dw heap_directive-instruction_handler + db 'hint',0xf0 + dw ARM_instruction_hint-instruction_handler + db 'itee',0xf0 + dw ARM_instruction_itee-instruction_handler + db 'itet',0xf0 + dw ARM_instruction_itet-instruction_handler + db 'itte',0xf0 + dw ARM_instruction_itte-instruction_handler + db 'ittt',0xf0 + dw ARM_instruction_ittt-instruction_handler + db 'ld1r',0xf0 + dw ARM_instruction_ld1r-instruction_handler + db 'ld2r',0xf0 + dw ARM_instruction_ld2r-instruction_handler + db 'ld3r',0xf0 + dw ARM_instruction_ld3r-instruction_handler + db 'ld4r',0xf0 + dw ARM_instruction_ld4r-instruction_handler + db 'ldab',0xe0 + dw ARM_instruction_ldab-instruction_handler + db 'ldah',0xe0 + dw ARM_instruction_ldah-instruction_handler + db 'ldar',0xf0 + dw ARM_instruction_ldar-instruction_handler + db 'ldc2',0xe0 + dw ARM_instruction_ldc2-instruction_handler + db 'ldcl',0xe0 + dw ARM_instruction_ldcl-instruction_handler + db 'ldfd',0xe0 + dw ARM_instruction_ldfd-instruction_handler + db 'ldfe',0xe0 + dw ARM_instruction_ldfe-instruction_handler + db 'ldfp',0xe0 + dw ARM_instruction_ldfp-instruction_handler + db 'ldfs',0xe0 + dw ARM_instruction_ldfs-instruction_handler + db 'ldnp',0xf0 + dw ARM_instruction_ldnp-instruction_handler + db 'ldrb',0xe0 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrd',0xe0 + dw ARM_instruction_ldrd-instruction_handler + db 'ldrh',0xe0 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrt',0xe0 + dw ARM_instruction_ldrt-instruction_handler + db 'ldtr',0xf0 + dw ARM_instruction_ldtr-instruction_handler + db 'ldur',0xf0 + dw ARM_instruction_ldur-instruction_handler + db 'ldxp',0xf0 + dw ARM_instruction_ldxp-instruction_handler + db 'ldxr',0xf0 + dw ARM_instruction_ldxr-instruction_handler + db 'lgnd',0xe0 + dw ARM_instruction_lgnd-instruction_handler + db 'lgne',0xe0 + dw ARM_instruction_lgne-instruction_handler + db 'lgns',0xe0 + dw ARM_instruction_lgns-instruction_handler + db 'load',0x00 + dw load_directive-instruction_handler + db 'logd',0xe0 + dw ARM_instruction_logd-instruction_handler + db 'loge',0xe0 + dw ARM_instruction_loge-instruction_handler + db 'logs',0xe0 + dw ARM_instruction_logs-instruction_handler + db 'lsls',0xe1 + dw ARM_instruction_lsl-instruction_handler + db 'lslv',0xf0 + dw ARM_instruction_lslv-instruction_handler + db 'lsrs',0xe1 + dw ARM_instruction_lsr-instruction_handler + db 'lsrv',0xf0 + dw ARM_instruction_lsrv-instruction_handler + db 'madd',0xf0 + dw ARM_instruction_madd-instruction_handler + db 'mcr2',0xe0 + dw ARM_instruction_mcr2-instruction_handler + db 'mcrr',0xe0 + dw ARM_instruction_mcrr-instruction_handler + db 'mlas',0xe1 + dw ARM_instruction_mla-instruction_handler + db 'mneg',0xf0 + dw ARM_instruction_mneg-instruction_handler + db 'mnfd',0xe0 + dw ARM_instruction_mnfd-instruction_handler + db 'mnfe',0xe0 + dw ARM_instruction_mnfe-instruction_handler + db 'mnfs',0xe0 + dw ARM_instruction_mnfs-instruction_handler + db 'movi',0xf0 + dw ARM_instruction_movi-instruction_handler + db 'movk',0xf0 + dw ARM_instruction_movk-instruction_handler + db 'movn',0xf0 + dw ARM_instruction_movn-instruction_handler + db 'movs',0xe1 + dw ARM_instruction_mov-instruction_handler + db 'movt',0xe0 + dw ARM_instruction_movt-instruction_handler + db 'movw',0xe0 + dw ARM_instruction_movw-instruction_handler + db 'movz',0xf0 + dw ARM_instruction_movz-instruction_handler + db 'mrc2',0xe0 + dw ARM_instruction_mrc2-instruction_handler + db 'mrrc',0xe0 + dw ARM_instruction_mrrc-instruction_handler + db 'msub',0xf0 + dw ARM_instruction_msub-instruction_handler + db 'mufd',0xe0 + dw ARM_instruction_mufd-instruction_handler + db 'mufe',0xe0 + dw ARM_instruction_mufe-instruction_handler + db 'mufs',0xe0 + dw ARM_instruction_mufs-instruction_handler + db 'muls',0xe1 + dw ARM_instruction_mul-instruction_handler + db 'mvfd',0xe0 + dw ARM_instruction_mvfd-instruction_handler + db 'mvfe',0xe0 + dw ARM_instruction_mvfe-instruction_handler + db 'mvfs',0xe0 + dw ARM_instruction_mvfs-instruction_handler + db 'mvni',0xf0 + dw ARM_instruction_mvni-instruction_handler + db 'mvns',0xe1 + dw ARM_instruction_mvn-instruction_handler + db 'negs',0xe1 + dw ARM_instruction_neg-instruction_handler + db 'ngcs',0xf1 + dw ARM_instruction_ngc-instruction_handler + db 'nrmd',0xe0 + dw ARM_instruction_nrmd-instruction_handler + db 'nrme',0xe0 + dw ARM_instruction_nrme-instruction_handler + db 'nrms',0xe0 + dw ARM_instruction_nrms-instruction_handler + db 'orns',0xe1 + dw ARM_instruction_orn-instruction_handler + db 'orrs',0xe1 + dw ARM_instruction_orr-instruction_handler + db 'pldw',0xe0 + dw ARM_instruction_pldw-instruction_handler + db 'pmul',0xf0 + dw ARM_instruction_pmul-instruction_handler + db 'pold',0xe0 + dw ARM_instruction_pold-instruction_handler + db 'pole',0xe0 + dw ARM_instruction_pole-instruction_handler + db 'pols',0xe0 + dw ARM_instruction_pols-instruction_handler + db 'powd',0xe0 + dw ARM_instruction_powd-instruction_handler + db 'powe',0xe0 + dw ARM_instruction_powe-instruction_handler + db 'pows',0xe0 + dw ARM_instruction_pows-instruction_handler + db 'prfm',0xf0 + dw ARM_instruction_prfm-instruction_handler + db 'push',0xe0 + dw ARM_instruction_push-instruction_handler + db 'qadd',0xe0 + dw ARM_instruction_qadd-instruction_handler + db 'qasx',0xe0 + dw ARM_instruction_qasx-instruction_handler + db 'qsax',0xe0 + dw ARM_instruction_qsax-instruction_handler + db 'qsub',0xe0 + dw ARM_instruction_qsub-instruction_handler + db 'rbit',0xe0 + dw ARM_instruction_rbit-instruction_handler + db 'rdfd',0xe0 + dw ARM_instruction_rdfd-instruction_handler + db 'rdfe',0xe0 + dw ARM_instruction_rdfe-instruction_handler + db 'rdfs',0xe0 + dw ARM_instruction_rdfs-instruction_handler + db 'rmfd',0xe0 + dw ARM_instruction_rmfd-instruction_handler + db 'rmfe',0xe0 + dw ARM_instruction_rmfe-instruction_handler + db 'rmfs',0xe0 + dw ARM_instruction_rmfs-instruction_handler + db 'rndd',0xe0 + dw ARM_instruction_rndd-instruction_handler + db 'rnde',0xe0 + dw ARM_instruction_rnde-instruction_handler + db 'rnds',0xe0 + dw ARM_instruction_rnds-instruction_handler + db 'rors',0xe1 + dw ARM_instruction_ror-instruction_handler + db 'rorv',0xf0 + dw ARM_instruction_rorv-instruction_handler + db 'rpwd',0xe0 + dw ARM_instruction_rpwd-instruction_handler + db 'rpwe',0xe0 + dw ARM_instruction_rpwe-instruction_handler + db 'rpws',0xe0 + dw ARM_instruction_rpws-instruction_handler + db 'rrxs',0xe1 + dw ARM_instruction_rrx-instruction_handler + db 'rsbs',0xe1 + dw ARM_instruction_rsb-instruction_handler + db 'rscs',0xe1 + dw ARM_instruction_rsc-instruction_handler + db 'rsfd',0xe0 + dw ARM_instruction_rsfd-instruction_handler + db 'rsfe',0xe0 + dw ARM_instruction_rsfe-instruction_handler + db 'rsfs',0xe0 + dw ARM_instruction_rsfs-instruction_handler + db 'saba',0xf0 + dw ARM_instruction_saba-instruction_handler + db 'sabd',0xf0 + dw ARM_instruction_sabd-instruction_handler + db 'sasx',0xe0 + dw ARM_instruction_sasx-instruction_handler + db 'sbcs',0xe1 + dw ARM_instruction_sbc-instruction_handler + db 'sbfm',0xf0 + dw ARM_instruction_sbfm-instruction_handler + db 'sbfx',0xe0 + dw ARM_instruction_sbfx-instruction_handler + db 'sdiv',0xe0 + dw ARM_instruction_sdiv-instruction_handler + db 'sevl',0xe0 + dw ARM_instruction_sevl-instruction_handler + db 'shll',0xf0 + dw ARM_instruction_shll-instruction_handler + db 'shrn',0xf0 + dw ARM_instruction_shrn-instruction_handler + db 'sind',0xe0 + dw ARM_instruction_sind-instruction_handler + db 'sine',0xe0 + dw ARM_instruction_sine-instruction_handler + db 'sins',0xe0 + dw ARM_instruction_sins-instruction_handler + db 'smax',0xf0 + dw ARM_instruction_smax-instruction_handler + db 'smin',0xf0 + dw ARM_instruction_smin-instruction_handler + db 'smov',0xf0 + dw ARM_instruction_smov-instruction_handler + db 'sqtd',0xe0 + dw ARM_instruction_sqtd-instruction_handler + db 'sqte',0xe0 + dw ARM_instruction_sqte-instruction_handler + db 'sqts',0xe0 + dw ARM_instruction_sqts-instruction_handler + db 'ssat',0xe0 + dw ARM_instruction_ssat-instruction_handler + db 'ssax',0xe0 + dw ARM_instruction_ssax-instruction_handler + db 'sshl',0xf0 + dw ARM_instruction_sshl-instruction_handler + db 'sshr',0xf0 + dw ARM_instruction_sshr-instruction_handler + db 'ssra',0xf0 + dw ARM_instruction_ssra-instruction_handler + db 'stc2',0xe0 + dw ARM_instruction_stc2-instruction_handler + db 'stcl',0xe0 + dw ARM_instruction_stcl-instruction_handler + db 'stfd',0xe0 + dw ARM_instruction_stfd-instruction_handler + db 'stfe',0xe0 + dw ARM_instruction_stfe-instruction_handler + db 'stfp',0xe0 + dw ARM_instruction_stfp-instruction_handler + db 'stfs',0xe0 + dw ARM_instruction_stfs-instruction_handler + db 'stlb',0xe0 + dw ARM_instruction_stlb-instruction_handler + db 'stlh',0xe0 + dw ARM_instruction_stlh-instruction_handler + db 'stlr',0xf0 + dw ARM_instruction_stlr-instruction_handler + db 'stnp',0xf0 + dw ARM_instruction_stnp-instruction_handler + db 'strb',0xe0 + dw ARM_instruction_strb-instruction_handler + db 'strd',0xe0 + dw ARM_instruction_strd-instruction_handler + db 'strh',0xe0 + dw ARM_instruction_strh-instruction_handler + db 'strt',0xe0 + dw ARM_instruction_strt-instruction_handler + db 'sttr',0xf0 + dw ARM_instruction_sttr-instruction_handler + db 'stur',0xf0 + dw ARM_instruction_stur-instruction_handler + db 'stxp',0xf0 + dw ARM_instruction_stxp-instruction_handler + db 'stxr',0xf0 + dw ARM_instruction_stxr-instruction_handler + db 'subs',0xe1 + dw ARM_instruction_sub-instruction_handler + db 'subw',0xe0 + dw ARM_instruction_subw-instruction_handler + db 'sufd',0xe0 + dw ARM_instruction_sufd-instruction_handler + db 'sufe',0xe0 + dw ARM_instruction_sufe-instruction_handler + db 'sufs',0xe0 + dw ARM_instruction_sufs-instruction_handler + db 'swpb',0xe0 + dw ARM_instruction_swpb-instruction_handler + db 'sxtb',0xe0 + dw ARM_instruction_sxtb-instruction_handler + db 'sxth',0xe0 + dw ARM_instruction_sxth-instruction_handler + db 'sxtl',0xf0 + dw ARM_instruction_sxtl-instruction_handler + db 'sxtw',0xf0 + dw ARM_instruction_sxtw-instruction_handler + db 'sysl',0xf0 + dw ARM_instruction_sysl-instruction_handler + db 'tand',0xe0 + dw ARM_instruction_tand-instruction_handler + db 'tane',0xe0 + dw ARM_instruction_tane-instruction_handler + db 'tans',0xe0 + dw ARM_instruction_tans-instruction_handler + db 'tbnz',0xf0 + dw ARM_instruction_tbnz-instruction_handler + db 'teqp',0xe0 + dw ARM_instruction_teqp-instruction_handler + db 'tlbi',0xf0 + dw ARM_instruction_tlbi-instruction_handler + db 'tmcr',0xe0 + dw ARM_instruction_tmcr-instruction_handler + db 'tmia',0xe0 + dw ARM_instruction_tmia-instruction_handler + db 'tmrc',0xe0 + dw ARM_instruction_tmrc-instruction_handler + db 'trn1',0xf0 + dw ARM_instruction_trn1-instruction_handler + db 'trn2',0xf0 + dw ARM_instruction_trn2-instruction_handler + db 'tstp',0xe0 + dw ARM_instruction_tstp-instruction_handler + db 'uaba',0xf0 + dw ARM_instruction_uaba-instruction_handler + db 'uabd',0xf0 + dw ARM_instruction_uabd-instruction_handler + db 'uasx',0xe0 + dw ARM_instruction_uasx-instruction_handler + db 'ubfm',0xf0 + dw ARM_instruction_ubfm-instruction_handler + db 'ubfx',0xe0 + dw ARM_instruction_ubfx-instruction_handler + db 'udiv',0xe0 + dw ARM_instruction_udiv-instruction_handler + db 'umax',0xf0 + dw ARM_instruction_umax-instruction_handler + db 'umin',0xf0 + dw ARM_instruction_umin-instruction_handler + db 'umov',0xf0 + dw ARM_instruction_umov-instruction_handler + db 'urdd',0xe0 + dw ARM_instruction_urdd-instruction_handler + db 'urde',0xe0 + dw ARM_instruction_urde-instruction_handler + db 'urds',0xe0 + dw ARM_instruction_urds-instruction_handler + db 'usat',0xe0 + dw ARM_instruction_usat-instruction_handler + db 'usax',0xe0 + dw ARM_instruction_usax-instruction_handler + db 'ushl',0xf0 + dw ARM_instruction_ushl-instruction_handler + db 'ushr',0xf0 + dw ARM_instruction_ushr-instruction_handler + db 'usra',0xf0 + dw ARM_instruction_usra-instruction_handler + db 'uxtb',0xe0 + dw ARM_instruction_uxtb-instruction_handler + db 'uxth',0xe0 + dw ARM_instruction_uxth-instruction_handler + db 'uxtl',0xf0 + dw ARM_instruction_uxtl-instruction_handler + db 'uzp1',0xf0 + dw ARM_instruction_uzp1-instruction_handler + db 'uzp2',0xf0 + dw ARM_instruction_uzp2-instruction_handler + db 'vand',0xe0 + dw ARM_instruction_vand-instruction_handler + db 'vbic',0xe0 + dw ARM_instruction_vbic-instruction_handler + db 'vbif',0xe0 + dw ARM_instruction_vbif-instruction_handler + db 'vbit',0xe0 + dw ARM_instruction_vbit-instruction_handler + db 'vbsl',0xe0 + dw ARM_instruction_vbsl-instruction_handler + db 'veor',0xe0 + dw ARM_instruction_veor-instruction_handler + db 'vldm',0xe0 + dw ARM_instruction_vldm-instruction_handler + db 'vldr',0xe0 + dw ARM_instruction_vldr-instruction_handler + db 'vmov',0xe0 + dw ARM_instruction_vmov-instruction_handler + db 'vmrs',0xe0 + dw ARM_instruction_vmrs-instruction_handler + db 'vmsr',0xe0 + dw ARM_instruction_vmsr-instruction_handler + db 'vmvn',0xe0 + dw ARM_instruction_vmvn-instruction_handler + db 'vorn',0xe0 + dw ARM_instruction_vorn-instruction_handler + db 'vorr',0xe0 + dw ARM_instruction_vorr-instruction_handler + db 'vpop',0xe0 + dw ARM_instruction_vpop-instruction_handler + db 'vstm',0xe0 + dw ARM_instruction_vstm-instruction_handler + db 'vstr',0xe0 + dw ARM_instruction_vstr-instruction_handler + db 'vswp',0xe0 + dw ARM_instruction_vswp-instruction_handler + db 'wand',0xe0 + dw ARM_instruction_wand-instruction_handler + db 'wmov',0xe0 + dw ARM_instruction_wmov-instruction_handler + db 'wxor',0xe0 + dw ARM_instruction_wxor-instruction_handler + db 'xtn2',0xf0 + dw ARM_instruction_xtn2-instruction_handler + db 'zip1',0xf0 + dw ARM_instruction_zip1-instruction_handler + db 'zip2',0xf0 + dw ARM_instruction_zip2-instruction_handler + db 0 +instructions_5: + db 'absdm',0xe0 + dw ARM_instruction_absdm-instruction_handler + db 'absdp',0xe0 + dw ARM_instruction_absdp-instruction_handler + db 'absdz',0xe0 + dw ARM_instruction_absdz-instruction_handler + db 'absem',0xe0 + dw ARM_instruction_absem-instruction_handler + db 'absep',0xe0 + dw ARM_instruction_absep-instruction_handler + db 'absez',0xe0 + dw ARM_instruction_absez-instruction_handler + db 'abssm',0xe0 + dw ARM_instruction_abssm-instruction_handler + db 'abssp',0xe0 + dw ARM_instruction_abssp-instruction_handler + db 'abssz',0xe0 + dw ARM_instruction_abssz-instruction_handler + db 'acsdm',0xe0 + dw ARM_instruction_acsdm-instruction_handler + db 'acsdp',0xe0 + dw ARM_instruction_acsdp-instruction_handler + db 'acsdz',0xe0 + dw ARM_instruction_acsdz-instruction_handler + db 'acsem',0xe0 + dw ARM_instruction_acsem-instruction_handler + db 'acsep',0xe0 + dw ARM_instruction_acsep-instruction_handler + db 'acsez',0xe0 + dw ARM_instruction_acsez-instruction_handler + db 'acssm',0xe0 + dw ARM_instruction_acssm-instruction_handler + db 'acssp',0xe0 + dw ARM_instruction_acssp-instruction_handler + db 'acssz',0xe0 + dw ARM_instruction_acssz-instruction_handler + db 'adc.n',0xe4 + dw ARM_instruction_adc-instruction_handler + db 'adc.w',0xe2 + dw ARM_instruction_adc-instruction_handler + db 'adc~~',0x00 + dw ARM_instruction_adc-instruction_handler + db 'add.n',0xe4 + dw ARM_instruction_add-instruction_handler + db 'add.w',0xe2 + dw ARM_instruction_add-instruction_handler + db 'addhn',0xf0 + dw ARM_instruction_addhn-instruction_handler + db 'add~~',0x00 + dw ARM_instruction_add-instruction_handler + db 'adfdm',0xe0 + dw ARM_instruction_adfdm-instruction_handler + db 'adfdp',0xe0 + dw ARM_instruction_adfdp-instruction_handler + db 'adfdz',0xe0 + dw ARM_instruction_adfdz-instruction_handler + db 'adfem',0xe0 + dw ARM_instruction_adfem-instruction_handler + db 'adfep',0xe0 + dw ARM_instruction_adfep-instruction_handler + db 'adfez',0xe0 + dw ARM_instruction_adfez-instruction_handler + db 'adfsm',0xe0 + dw ARM_instruction_adfsm-instruction_handler + db 'adfsp',0xe0 + dw ARM_instruction_adfsp-instruction_handler + db 'adfsz',0xe0 + dw ARM_instruction_adfsz-instruction_handler + db 'adr.n',0xe4 + dw ARM_instruction_adr-instruction_handler + db 'adr.w',0xe2 + dw ARM_instruction_adr-instruction_handler + db 'adr~~',0x00 + dw ARM_instruction_adr-instruction_handler + db 'aesmc',0xf0 + dw ARM_instruction_aesmc-instruction_handler + db 'align',0x00 + dw align_directive-instruction_handler + db 'and.n',0xe4 + dw ARM_instruction_and-instruction_handler + db 'and.w',0xe2 + dw ARM_instruction_and-instruction_handler + db 'and~~',0x00 + dw ARM_instruction_and-instruction_handler + db 'asndm',0xe0 + dw ARM_instruction_asndm-instruction_handler + db 'asndp',0xe0 + dw ARM_instruction_asndp-instruction_handler + db 'asndz',0xe0 + dw ARM_instruction_asndz-instruction_handler + db 'asnem',0xe0 + dw ARM_instruction_asnem-instruction_handler + db 'asnep',0xe0 + dw ARM_instruction_asnep-instruction_handler + db 'asnez',0xe0 + dw ARM_instruction_asnez-instruction_handler + db 'asnsm',0xe0 + dw ARM_instruction_asnsm-instruction_handler + db 'asnsp',0xe0 + dw ARM_instruction_asnsp-instruction_handler + db 'asnsz',0xe0 + dw ARM_instruction_asnsz-instruction_handler + db 'asr.n',0xe4 + dw ARM_instruction_asr-instruction_handler + db 'asr.w',0xe2 + dw ARM_instruction_asr-instruction_handler + db 'asr~~',0x00 + dw ARM_instruction_asr-instruction_handler + db 'atndm',0xe0 + dw ARM_instruction_atndm-instruction_handler + db 'atndp',0xe0 + dw ARM_instruction_atndp-instruction_handler + db 'atndz',0xe0 + dw ARM_instruction_atndz-instruction_handler + db 'atnem',0xe0 + dw ARM_instruction_atnem-instruction_handler + db 'atnep',0xe0 + dw ARM_instruction_atnep-instruction_handler + db 'atnez',0xe0 + dw ARM_instruction_atnez-instruction_handler + db 'atnsm',0xe0 + dw ARM_instruction_atnsm-instruction_handler + db 'atnsp',0xe0 + dw ARM_instruction_atnsp-instruction_handler + db 'atnsz',0xe0 + dw ARM_instruction_atnsz-instruction_handler + db 'bfc~~',0x00 + dw ARM_instruction_bfc-instruction_handler + db 'bfi~~',0x00 + dw ARM_instruction_bfi-instruction_handler + db 'bfxil',0xf0 + dw ARM_instruction_bfxil-instruction_handler + db 'bic.n',0xe4 + dw ARM_instruction_bic-instruction_handler + db 'bic.w',0xe2 + dw ARM_instruction_bic-instruction_handler + db 'bic~~',0x00 + dw ARM_instruction_bic-instruction_handler + db 'blx.n',0xe4 + dw ARM_instruction_blx-instruction_handler + db 'blx.w',0xe2 + dw ARM_instruction_blx-instruction_handler + db 'blx~~',0x00 + dw ARM_instruction_blx-instruction_handler + db 'break',0x00 + dw break_directive-instruction_handler + db 'bxj~~',0x00 + dw ARM_instruction_bxj-instruction_handler + db 'b~~.n',0x04 + dw ARM_instruction_b-instruction_handler + db 'b~~.w',0x02 + dw ARM_instruction_b-instruction_handler + db 'cbz.n',0xf4 + dw ARM_instruction_cbz-instruction_handler + db 'cbz.w',0xf2 + dw ARM_instruction_cbz-instruction_handler + db 'cdp~~',0x00 + dw ARM_instruction_cdp-instruction_handler + db 'clrex',0xe0 + dw ARM_instruction_clrex-instruction_handler + db 'clz~~',0x00 + dw ARM_instruction_clz-instruction_handler + db 'cmf~~',0x00 + dw ARM_instruction_cmf-instruction_handler + db 'cmn.n',0xe4 + dw ARM_instruction_cmn-instruction_handler + db 'cmn.w',0xe2 + dw ARM_instruction_cmn-instruction_handler + db 'cmn~~',0x00 + dw ARM_instruction_cmn-instruction_handler + db 'cmp.n',0xe4 + dw ARM_instruction_cmp-instruction_handler + db 'cmp.w',0xe2 + dw ARM_instruction_cmp-instruction_handler + db 'cmp~~',0x00 + dw ARM_instruction_cmp-instruction_handler + db 'cmtst',0xf0 + dw ARM_instruction_cmtst-instruction_handler + db 'cnf~~',0x00 + dw ARM_instruction_cnf-instruction_handler + db 'cosdm',0xe0 + dw ARM_instruction_cosdm-instruction_handler + db 'cosdp',0xe0 + dw ARM_instruction_cosdp-instruction_handler + db 'cosdz',0xe0 + dw ARM_instruction_cosdz-instruction_handler + db 'cosem',0xe0 + dw ARM_instruction_cosem-instruction_handler + db 'cosep',0xe0 + dw ARM_instruction_cosep-instruction_handler + db 'cosez',0xe0 + dw ARM_instruction_cosez-instruction_handler + db 'cossm',0xe0 + dw ARM_instruction_cossm-instruction_handler + db 'cossp',0xe0 + dw ARM_instruction_cossp-instruction_handler + db 'cossz',0xe0 + dw ARM_instruction_cossz-instruction_handler + db 'cps.n',0xf4 + dw ARM_instruction_cps-instruction_handler + db 'cps.w',0xf2 + dw ARM_instruction_cps-instruction_handler + db 'cpsid',0xf0 + dw ARM_instruction_cpsid-instruction_handler + db 'cpsie',0xf0 + dw ARM_instruction_cpsie-instruction_handler + db 'cpy.n',0xe4 + dw ARM_instruction_cpy-instruction_handler + db 'cpy.w',0xe2 + dw ARM_instruction_cpy-instruction_handler + db 'cpy~~',0x00 + dw ARM_instruction_cpy-instruction_handler + db 'crc32',0xf0 + dw ARM_instruction_crc32-instruction_handler + db 'csetm',0xf0 + dw ARM_instruction_csetm-instruction_handler + db 'csinc',0xf0 + dw ARM_instruction_csinc-instruction_handler + db 'csinv',0xf0 + dw ARM_instruction_csinv-instruction_handler + db 'csneg',0xf0 + dw ARM_instruction_csneg-instruction_handler + db 'dbg~~',0x00 + dw ARM_instruction_dbg-instruction_handler + db 'dcps1',0xe0 + dw ARM_instruction_dcps1-instruction_handler + db 'dcps2',0xe0 + dw ARM_instruction_dcps2-instruction_handler + db 'dcps3',0xe0 + dw ARM_instruction_dcps3-instruction_handler + db 'dvfdm',0xe0 + dw ARM_instruction_dvfdm-instruction_handler + db 'dvfdp',0xe0 + dw ARM_instruction_dvfdp-instruction_handler + db 'dvfdz',0xe0 + dw ARM_instruction_dvfdz-instruction_handler + db 'dvfem',0xe0 + dw ARM_instruction_dvfem-instruction_handler + db 'dvfep',0xe0 + dw ARM_instruction_dvfep-instruction_handler + db 'dvfez',0xe0 + dw ARM_instruction_dvfez-instruction_handler + db 'dvfsm',0xe0 + dw ARM_instruction_dvfsm-instruction_handler + db 'dvfsp',0xe0 + dw ARM_instruction_dvfsp-instruction_handler + db 'dvfsz',0xe0 + dw ARM_instruction_dvfsz-instruction_handler + db 'entry',0x00 + dw entry_directive-instruction_handler + db 'eor.n',0xe4 + dw ARM_instruction_eor-instruction_handler + db 'eor.w',0xe2 + dw ARM_instruction_eor-instruction_handler + db 'eor~~',0x00 + dw ARM_instruction_eor-instruction_handler + db 'expdm',0xe0 + dw ARM_instruction_expdm-instruction_handler + db 'expdp',0xe0 + dw ARM_instruction_expdp-instruction_handler + db 'expdz',0xe0 + dw ARM_instruction_expdz-instruction_handler + db 'expem',0xe0 + dw ARM_instruction_expem-instruction_handler + db 'expep',0xe0 + dw ARM_instruction_expep-instruction_handler + db 'expez',0xe0 + dw ARM_instruction_expez-instruction_handler + db 'expsm',0xe0 + dw ARM_instruction_expsm-instruction_handler + db 'expsp',0xe0 + dw ARM_instruction_expsp-instruction_handler + db 'expsz',0xe0 + dw ARM_instruction_expsz-instruction_handler + db 'extrn',0x00 + dw extrn_directive-instruction_handler + db 'fabsd',0xe0 + dw ARM_instruction_fabsd-instruction_handler + db 'fabss',0xe0 + dw ARM_instruction_fabss-instruction_handler + db 'facge',0xf0 + dw ARM_instruction_facge-instruction_handler + db 'facgt',0xf0 + dw ARM_instruction_facgt-instruction_handler + db 'faddd',0xe0 + dw ARM_instruction_faddd-instruction_handler + db 'faddp',0xf0 + dw ARM_instruction_faddp-instruction_handler + db 'fadds',0xe0 + dw ARM_instruction_fadds-instruction_handler + db 'fccmp',0xf0 + dw ARM_instruction_fccmp-instruction_handler + db 'fcmeq',0xf0 + dw ARM_instruction_fcmeq-instruction_handler + db 'fcmge',0xf0 + dw ARM_instruction_fcmge-instruction_handler + db 'fcmgt',0xf0 + dw ARM_instruction_fcmgt-instruction_handler + db 'fcmle',0xf0 + dw ARM_instruction_fcmle-instruction_handler + db 'fcmlt',0xf0 + dw ARM_instruction_fcmlt-instruction_handler + db 'fcmpd',0xe0 + dw ARM_instruction_fcmpd-instruction_handler + db 'fcmpe',0xf0 + dw ARM_instruction_fcmpe-instruction_handler + db 'fcmps',0xe0 + dw ARM_instruction_fcmps-instruction_handler + db 'fcpyd',0xe0 + dw ARM_instruction_fcpyd-instruction_handler + db 'fcpys',0xe0 + dw ARM_instruction_fcpys-instruction_handler + db 'fcsel',0xf0 + dw ARM_instruction_fcsel-instruction_handler + db 'fcvtl',0xf0 + dw ARM_instruction_fcvtl-instruction_handler + db 'fcvtn',0xf0 + dw ARM_instruction_fcvtn-instruction_handler + db 'fdivd',0xe0 + dw ARM_instruction_fdivd-instruction_handler + db 'fdivs',0xe0 + dw ARM_instruction_fdivs-instruction_handler + db 'fdvdm',0xe0 + dw ARM_instruction_fdvdm-instruction_handler + db 'fdvdp',0xe0 + dw ARM_instruction_fdvdp-instruction_handler + db 'fdvdz',0xe0 + dw ARM_instruction_fdvdz-instruction_handler + db 'fdvem',0xe0 + dw ARM_instruction_fdvem-instruction_handler + db 'fdvep',0xe0 + dw ARM_instruction_fdvep-instruction_handler + db 'fdvez',0xe0 + dw ARM_instruction_fdvez-instruction_handler + db 'fdvsm',0xe0 + dw ARM_instruction_fdvsm-instruction_handler + db 'fdvsp',0xe0 + dw ARM_instruction_fdvsp-instruction_handler + db 'fdvsz',0xe0 + dw ARM_instruction_fdvsz-instruction_handler + db 'fix~~',0x00 + dw ARM_instruction_fix-instruction_handler + db 'fldmd',0xe0 + dw ARM_instruction_fldmd-instruction_handler + db 'fldms',0xe0 + dw ARM_instruction_fldms-instruction_handler + db 'fldmx',0xe0 + dw ARM_instruction_fldmx-instruction_handler + db 'fltdm',0xe0 + dw ARM_instruction_fltdm-instruction_handler + db 'fltdp',0xe0 + dw ARM_instruction_fltdp-instruction_handler + db 'fltdz',0xe0 + dw ARM_instruction_fltdz-instruction_handler + db 'fltem',0xe0 + dw ARM_instruction_fltem-instruction_handler + db 'fltep',0xe0 + dw ARM_instruction_fltep-instruction_handler + db 'fltez',0xe0 + dw ARM_instruction_fltez-instruction_handler + db 'fltsm',0xe0 + dw ARM_instruction_fltsm-instruction_handler + db 'fltsp',0xe0 + dw ARM_instruction_fltsp-instruction_handler + db 'fltsz',0xe0 + dw ARM_instruction_fltsz-instruction_handler + db 'fmacd',0xe0 + dw ARM_instruction_fmacd-instruction_handler + db 'fmacs',0xe0 + dw ARM_instruction_fmacs-instruction_handler + db 'fmadd',0xf0 + dw ARM_instruction_fmadd-instruction_handler + db 'fmaxp',0xf0 + dw ARM_instruction_fmaxp-instruction_handler + db 'fmaxv',0xf0 + dw ARM_instruction_fmaxv-instruction_handler + db 'fmdhr',0xe0 + dw ARM_instruction_fmdhr-instruction_handler + db 'fmdlr',0xe0 + dw ARM_instruction_fmdlr-instruction_handler + db 'fmdrr',0xe0 + dw ARM_instruction_fmdrr-instruction_handler + db 'fminp',0xf0 + dw ARM_instruction_fminp-instruction_handler + db 'fminv',0xf0 + dw ARM_instruction_fminv-instruction_handler + db 'fmldm',0xe0 + dw ARM_instruction_fmldm-instruction_handler + db 'fmldp',0xe0 + dw ARM_instruction_fmldp-instruction_handler + db 'fmldz',0xe0 + dw ARM_instruction_fmldz-instruction_handler + db 'fmlem',0xe0 + dw ARM_instruction_fmlem-instruction_handler + db 'fmlep',0xe0 + dw ARM_instruction_fmlep-instruction_handler + db 'fmlez',0xe0 + dw ARM_instruction_fmlez-instruction_handler + db 'fmlsm',0xe0 + dw ARM_instruction_fmlsm-instruction_handler + db 'fmlsp',0xe0 + dw ARM_instruction_fmlsp-instruction_handler + db 'fmlsz',0xe0 + dw ARM_instruction_fmlsz-instruction_handler + db 'fmrdh',0xe0 + dw ARM_instruction_fmrdh-instruction_handler + db 'fmrdl',0xe0 + dw ARM_instruction_fmrdl-instruction_handler + db 'fmrrd',0xe0 + dw ARM_instruction_fmrrd-instruction_handler + db 'fmrrs',0xe0 + dw ARM_instruction_fmrrs-instruction_handler + db 'fmscd',0xe0 + dw ARM_instruction_fmscd-instruction_handler + db 'fmscs',0xe0 + dw ARM_instruction_fmscs-instruction_handler + db 'fmsrr',0xe0 + dw ARM_instruction_fmsrr-instruction_handler + db 'fmsub',0xf0 + dw ARM_instruction_fmsub-instruction_handler + db 'fmuld',0xe0 + dw ARM_instruction_fmuld-instruction_handler + db 'fmuls',0xe0 + dw ARM_instruction_fmuls-instruction_handler + db 'fmulx',0xf0 + dw ARM_instruction_fmulx-instruction_handler + db 'fnegd',0xe0 + dw ARM_instruction_fnegd-instruction_handler + db 'fnegs',0xe0 + dw ARM_instruction_fnegs-instruction_handler + db 'fnmul',0xf0 + dw ARM_instruction_fnmul-instruction_handler + db 'frddm',0xe0 + dw ARM_instruction_frddm-instruction_handler + db 'frddp',0xe0 + dw ARM_instruction_frddp-instruction_handler + db 'frddz',0xe0 + dw ARM_instruction_frddz-instruction_handler + db 'frdem',0xe0 + dw ARM_instruction_frdem-instruction_handler + db 'frdep',0xe0 + dw ARM_instruction_frdep-instruction_handler + db 'frdez',0xe0 + dw ARM_instruction_frdez-instruction_handler + db 'frdsm',0xe0 + dw ARM_instruction_frdsm-instruction_handler + db 'frdsp',0xe0 + dw ARM_instruction_frdsp-instruction_handler + db 'frdsz',0xe0 + dw ARM_instruction_frdsz-instruction_handler + db 'fsqrt',0xf0 + dw ARM_instruction_fsqrt-instruction_handler + db 'fstmd',0xe0 + dw ARM_instruction_fstmd-instruction_handler + db 'fstms',0xe0 + dw ARM_instruction_fstms-instruction_handler + db 'fstmx',0xe0 + dw ARM_instruction_fstmx-instruction_handler + db 'fsubd',0xe0 + dw ARM_instruction_fsubd-instruction_handler + db 'fsubs',0xe0 + dw ARM_instruction_fsubs-instruction_handler + db 'hbl~~',0x00 + dw ARM_instruction_hbl-instruction_handler + db 'hbp~~',0x00 + dw ARM_instruction_hbp-instruction_handler + db 'iteee',0xf0 + dw ARM_instruction_iteee-instruction_handler + db 'iteet',0xf0 + dw ARM_instruction_iteet-instruction_handler + db 'itete',0xf0 + dw ARM_instruction_itete-instruction_handler + db 'itett',0xf0 + dw ARM_instruction_itett-instruction_handler + db 'ittee',0xf0 + dw ARM_instruction_ittee-instruction_handler + db 'ittet',0xf0 + dw ARM_instruction_ittet-instruction_handler + db 'ittte',0xf0 + dw ARM_instruction_ittte-instruction_handler + db 'itttt',0xf0 + dw ARM_instruction_itttt-instruction_handler + db 'label',0x00 + dw label_directive-instruction_handler + db 'ldaex',0xe0 + dw ARM_instruction_ldaex-instruction_handler + db 'ldarb',0xf0 + dw ARM_instruction_ldarb-instruction_handler + db 'ldarh',0xf0 + dw ARM_instruction_ldarh-instruction_handler + db 'ldaxp',0xf0 + dw ARM_instruction_ldaxp-instruction_handler + db 'ldaxr',0xf0 + dw ARM_instruction_ldaxr-instruction_handler + db 'lda~~',0x00 + dw ARM_instruction_lda-instruction_handler + db 'ldc2l',0xe0 + dw ARM_instruction_ldc2l-instruction_handler + db 'ldc~~',0x00 + dw ARM_instruction_ldc-instruction_handler + db 'ldm.n',0xe4 + dw ARM_instruction_ldm-instruction_handler + db 'ldm.w',0xe2 + dw ARM_instruction_ldm-instruction_handler + db 'ldmda',0xe0 + dw ARM_instruction_ldmda-instruction_handler + db 'ldmdb',0xe0 + dw ARM_instruction_ldmdb-instruction_handler + db 'ldmea',0xe0 + dw ARM_instruction_ldmea-instruction_handler + db 'ldmed',0xe0 + dw ARM_instruction_ldmed-instruction_handler + db 'ldmfa',0xe0 + dw ARM_instruction_ldmfa-instruction_handler + db 'ldmfd',0xe0 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmia',0xe0 + dw ARM_instruction_ldmia-instruction_handler + db 'ldmib',0xe0 + dw ARM_instruction_ldmib-instruction_handler + db 'ldm~~',0x00 + dw ARM_instruction_ldm-instruction_handler + db 'ldpsw',0xf0 + dw ARM_instruction_ldpsw-instruction_handler + db 'ldr.n',0xe4 + dw ARM_instruction_ldr-instruction_handler + db 'ldr.w',0xe2 + dw ARM_instruction_ldr-instruction_handler + db 'ldrbt',0xe0 + dw ARM_instruction_ldrbt-instruction_handler + db 'ldrex',0xe0 + dw ARM_instruction_ldrex-instruction_handler + db 'ldrht',0xe0 + dw ARM_instruction_ldrht-instruction_handler + db 'ldrsb',0xe0 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsh',0xe0 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldrsw',0xf0 + dw ARM_instruction_ldrsw-instruction_handler + db 'ldr~~',0x00 + dw ARM_instruction_ldr-instruction_handler + db 'ldtrb',0xf0 + dw ARM_instruction_ldtrb-instruction_handler + db 'ldtrh',0xf0 + dw ARM_instruction_ldtrh-instruction_handler + db 'ldurb',0xf0 + dw ARM_instruction_ldurb-instruction_handler + db 'ldurh',0xf0 + dw ARM_instruction_ldurh-instruction_handler + db 'ldxrb',0xf0 + dw ARM_instruction_ldxrb-instruction_handler + db 'ldxrh',0xf0 + dw ARM_instruction_ldxrh-instruction_handler + db 'lfmea',0xe0 + dw ARM_instruction_lfmea-instruction_handler + db 'lfmfd',0xe0 + dw ARM_instruction_lfmfd-instruction_handler + db 'lfm~~',0x00 + dw ARM_instruction_lfm-instruction_handler + db 'lgndm',0xe0 + dw ARM_instruction_lgndm-instruction_handler + db 'lgndp',0xe0 + dw ARM_instruction_lgndp-instruction_handler + db 'lgndz',0xe0 + dw ARM_instruction_lgndz-instruction_handler + db 'lgnem',0xe0 + dw ARM_instruction_lgnem-instruction_handler + db 'lgnep',0xe0 + dw ARM_instruction_lgnep-instruction_handler + db 'lgnez',0xe0 + dw ARM_instruction_lgnez-instruction_handler + db 'lgnsm',0xe0 + dw ARM_instruction_lgnsm-instruction_handler + db 'lgnsp',0xe0 + dw ARM_instruction_lgnsp-instruction_handler + db 'lgnsz',0xe0 + dw ARM_instruction_lgnsz-instruction_handler + db 'logdm',0xe0 + dw ARM_instruction_logdm-instruction_handler + db 'logdp',0xe0 + dw ARM_instruction_logdp-instruction_handler + db 'logdz',0xe0 + dw ARM_instruction_logdz-instruction_handler + db 'logem',0xe0 + dw ARM_instruction_logem-instruction_handler + db 'logep',0xe0 + dw ARM_instruction_logep-instruction_handler + db 'logez',0xe0 + dw ARM_instruction_logez-instruction_handler + db 'logsm',0xe0 + dw ARM_instruction_logsm-instruction_handler + db 'logsp',0xe0 + dw ARM_instruction_logsp-instruction_handler + db 'logsz',0xe0 + dw ARM_instruction_logsz-instruction_handler + db 'lsl.n',0xe4 + dw ARM_instruction_lsl-instruction_handler + db 'lsl.w',0xe2 + dw ARM_instruction_lsl-instruction_handler + db 'lsl~~',0x00 + dw ARM_instruction_lsl-instruction_handler + db 'lsr.n',0xe4 + dw ARM_instruction_lsr-instruction_handler + db 'lsr.w',0xe2 + dw ARM_instruction_lsr-instruction_handler + db 'lsr~~',0x00 + dw ARM_instruction_lsr-instruction_handler + db 'mar~~',0x00 + dw ARM_instruction_mar-instruction_handler + db 'mcrr2',0xe0 + dw ARM_instruction_mcrr2-instruction_handler + db 'mcr~~',0x00 + dw ARM_instruction_mcr-instruction_handler + db 'miabb',0xe0 + dw ARM_instruction_miabb-instruction_handler + db 'miabt',0xe0 + dw ARM_instruction_miabt-instruction_handler + db 'miaph',0xe0 + dw ARM_instruction_miaph-instruction_handler + db 'miatb',0xe0 + dw ARM_instruction_miatb-instruction_handler + db 'miatt',0xe0 + dw ARM_instruction_miatt-instruction_handler + db 'mia~~',0x00 + dw ARM_instruction_mia-instruction_handler + db 'mla~~',0x00 + dw ARM_instruction_mla-instruction_handler + db 'mls~~',0x00 + dw ARM_instruction_mls-instruction_handler + db 'mnfdm',0xe0 + dw ARM_instruction_mnfdm-instruction_handler + db 'mnfdp',0xe0 + dw ARM_instruction_mnfdp-instruction_handler + db 'mnfdz',0xe0 + dw ARM_instruction_mnfdz-instruction_handler + db 'mnfem',0xe0 + dw ARM_instruction_mnfem-instruction_handler + db 'mnfep',0xe0 + dw ARM_instruction_mnfep-instruction_handler + db 'mnfez',0xe0 + dw ARM_instruction_mnfez-instruction_handler + db 'mnfsm',0xe0 + dw ARM_instruction_mnfsm-instruction_handler + db 'mnfsp',0xe0 + dw ARM_instruction_mnfsp-instruction_handler + db 'mnfsz',0xe0 + dw ARM_instruction_mnfsz-instruction_handler + db 'mov.n',0xe4 + dw ARM_instruction_mov-instruction_handler + db 'mov.w',0xe2 + dw ARM_instruction_mov-instruction_handler + db 'mov~~',0x00 + dw ARM_instruction_mov-instruction_handler + db 'mra~~',0x00 + dw ARM_instruction_mra-instruction_handler + db 'mrc~~',0x00 + dw ARM_instruction_mrc-instruction_handler + db 'mrrc2',0xe0 + dw ARM_instruction_mrrc2-instruction_handler + db 'mrs~~',0x00 + dw ARM_instruction_mrs-instruction_handler + db 'msr~~',0x00 + dw ARM_instruction_msr-instruction_handler + db 'mufdm',0xe0 + dw ARM_instruction_mufdm-instruction_handler + db 'mufdp',0xe0 + dw ARM_instruction_mufdp-instruction_handler + db 'mufdz',0xe0 + dw ARM_instruction_mufdz-instruction_handler + db 'mufem',0xe0 + dw ARM_instruction_mufem-instruction_handler + db 'mufep',0xe0 + dw ARM_instruction_mufep-instruction_handler + db 'mufez',0xe0 + dw ARM_instruction_mufez-instruction_handler + db 'mufsm',0xe0 + dw ARM_instruction_mufsm-instruction_handler + db 'mufsp',0xe0 + dw ARM_instruction_mufsp-instruction_handler + db 'mufsz',0xe0 + dw ARM_instruction_mufsz-instruction_handler + db 'mul.n',0xe4 + dw ARM_instruction_mul-instruction_handler + db 'mul.w',0xe2 + dw ARM_instruction_mul-instruction_handler + db 'mul~~',0x00 + dw ARM_instruction_mul-instruction_handler + db 'mvfdm',0xe0 + dw ARM_instruction_mvfdm-instruction_handler + db 'mvfdp',0xe0 + dw ARM_instruction_mvfdp-instruction_handler + db 'mvfdz',0xe0 + dw ARM_instruction_mvfdz-instruction_handler + db 'mvfem',0xe0 + dw ARM_instruction_mvfem-instruction_handler + db 'mvfep',0xe0 + dw ARM_instruction_mvfep-instruction_handler + db 'mvfez',0xe0 + dw ARM_instruction_mvfez-instruction_handler + db 'mvfsm',0xe0 + dw ARM_instruction_mvfsm-instruction_handler + db 'mvfsp',0xe0 + dw ARM_instruction_mvfsp-instruction_handler + db 'mvfsz',0xe0 + dw ARM_instruction_mvfsz-instruction_handler + db 'mvn.n',0xe4 + dw ARM_instruction_mvn-instruction_handler + db 'mvn.w',0xe2 + dw ARM_instruction_mvn-instruction_handler + db 'mvn~~',0x00 + dw ARM_instruction_mvn-instruction_handler + db 'neg.n',0xe4 + dw ARM_instruction_neg-instruction_handler + db 'neg.w',0xe2 + dw ARM_instruction_neg-instruction_handler + db 'neg~~',0x00 + dw ARM_instruction_neg-instruction_handler + db 'nop.n',0xe4 + dw ARM_instruction_nop-instruction_handler + db 'nop.w',0xe2 + dw ARM_instruction_nop-instruction_handler + db 'nop~~',0x00 + dw ARM_instruction_nop-instruction_handler + db 'nrmdm',0xe0 + dw ARM_instruction_nrmdm-instruction_handler + db 'nrmdp',0xe0 + dw ARM_instruction_nrmdp-instruction_handler + db 'nrmdz',0xe0 + dw ARM_instruction_nrmdz-instruction_handler + db 'nrmem',0xe0 + dw ARM_instruction_nrmem-instruction_handler + db 'nrmep',0xe0 + dw ARM_instruction_nrmep-instruction_handler + db 'nrmez',0xe0 + dw ARM_instruction_nrmez-instruction_handler + db 'nrmsm',0xe0 + dw ARM_instruction_nrmsm-instruction_handler + db 'nrmsp',0xe0 + dw ARM_instruction_nrmsp-instruction_handler + db 'nrmsz',0xe0 + dw ARM_instruction_nrmsz-instruction_handler + db 'orn~~',0x00 + dw ARM_instruction_orn-instruction_handler + db 'orr.n',0xe4 + dw ARM_instruction_orr-instruction_handler + db 'orr.w',0xe2 + dw ARM_instruction_orr-instruction_handler + db 'orr~~',0x00 + dw ARM_instruction_orr-instruction_handler + db 'pkhbt',0xe0 + dw ARM_instruction_pkhbt-instruction_handler + db 'pkhtb',0xe0 + dw ARM_instruction_pkhtb-instruction_handler + db 'pld~~',0x00 + dw ARM_instruction_pld-instruction_handler + db 'pli~~',0x00 + dw ARM_instruction_pli-instruction_handler + db 'pmull',0xf0 + dw ARM_instruction_pmull-instruction_handler + db 'poldm',0xe0 + dw ARM_instruction_poldm-instruction_handler + db 'poldp',0xe0 + dw ARM_instruction_poldp-instruction_handler + db 'poldz',0xe0 + dw ARM_instruction_poldz-instruction_handler + db 'polem',0xe0 + dw ARM_instruction_polem-instruction_handler + db 'polep',0xe0 + dw ARM_instruction_polep-instruction_handler + db 'polez',0xe0 + dw ARM_instruction_polez-instruction_handler + db 'polsm',0xe0 + dw ARM_instruction_polsm-instruction_handler + db 'polsp',0xe0 + dw ARM_instruction_polsp-instruction_handler + db 'polsz',0xe0 + dw ARM_instruction_polsz-instruction_handler + db 'pop.n',0xe4 + dw ARM_instruction_pop-instruction_handler + db 'pop.w',0xe2 + dw ARM_instruction_pop-instruction_handler + db 'pop~~',0x00 + dw ARM_instruction_pop-instruction_handler + db 'powdm',0xe0 + dw ARM_instruction_powdm-instruction_handler + db 'powdp',0xe0 + dw ARM_instruction_powdp-instruction_handler + db 'powdz',0xe0 + dw ARM_instruction_powdz-instruction_handler + db 'powem',0xe0 + dw ARM_instruction_powem-instruction_handler + db 'powep',0xe0 + dw ARM_instruction_powep-instruction_handler + db 'powez',0xe0 + dw ARM_instruction_powez-instruction_handler + db 'powsm',0xe0 + dw ARM_instruction_powsm-instruction_handler + db 'powsp',0xe0 + dw ARM_instruction_powsp-instruction_handler + db 'powsz',0xe0 + dw ARM_instruction_powsz-instruction_handler + db 'qadd8',0xe0 + dw ARM_instruction_qadd8-instruction_handler + db 'qdadd',0xe0 + dw ARM_instruction_qdadd-instruction_handler + db 'qdsub',0xe0 + dw ARM_instruction_qdsub-instruction_handler + db 'qsub8',0xe0 + dw ARM_instruction_qsub8-instruction_handler + db 'rdfdm',0xe0 + dw ARM_instruction_rdfdm-instruction_handler + db 'rdfdp',0xe0 + dw ARM_instruction_rdfdp-instruction_handler + db 'rdfdz',0xe0 + dw ARM_instruction_rdfdz-instruction_handler + db 'rdfem',0xe0 + dw ARM_instruction_rdfem-instruction_handler + db 'rdfep',0xe0 + dw ARM_instruction_rdfep-instruction_handler + db 'rdfez',0xe0 + dw ARM_instruction_rdfez-instruction_handler + db 'rdfsm',0xe0 + dw ARM_instruction_rdfsm-instruction_handler + db 'rdfsp',0xe0 + dw ARM_instruction_rdfsp-instruction_handler + db 'rdfsz',0xe0 + dw ARM_instruction_rdfsz-instruction_handler + db 'rev.n',0xe4 + dw ARM_instruction_rev-instruction_handler + db 'rev.w',0xe2 + dw ARM_instruction_rev-instruction_handler + db 'rev16',0xe0 + dw ARM_instruction_rev16-instruction_handler + db 'rev32',0xf0 + dw ARM_instruction_rev32-instruction_handler + db 'rev64',0xf0 + dw ARM_instruction_rev64-instruction_handler + db 'revsh',0xe0 + dw ARM_instruction_revsh-instruction_handler + db 'rev~~',0x00 + dw ARM_instruction_rev-instruction_handler + db 'rfc~~',0x00 + dw ARM_instruction_rfc-instruction_handler + db 'rfeda',0xf0 + dw ARM_instruction_rfeda-instruction_handler + db 'rfedb',0xf0 + dw ARM_instruction_rfedb-instruction_handler + db 'rfeea',0xf0 + dw ARM_instruction_rfeea-instruction_handler + db 'rfeed',0xf0 + dw ARM_instruction_rfeed-instruction_handler + db 'rfefa',0xf0 + dw ARM_instruction_rfefa-instruction_handler + db 'rfefd',0xf0 + dw ARM_instruction_rfefd-instruction_handler + db 'rfeia',0xf0 + dw ARM_instruction_rfeia-instruction_handler + db 'rfeib',0xf0 + dw ARM_instruction_rfeib-instruction_handler + db 'rfs~~',0x00 + dw ARM_instruction_rfs-instruction_handler + db 'rmfdm',0xe0 + dw ARM_instruction_rmfdm-instruction_handler + db 'rmfdp',0xe0 + dw ARM_instruction_rmfdp-instruction_handler + db 'rmfdz',0xe0 + dw ARM_instruction_rmfdz-instruction_handler + db 'rmfem',0xe0 + dw ARM_instruction_rmfem-instruction_handler + db 'rmfep',0xe0 + dw ARM_instruction_rmfep-instruction_handler + db 'rmfez',0xe0 + dw ARM_instruction_rmfez-instruction_handler + db 'rmfsm',0xe0 + dw ARM_instruction_rmfsm-instruction_handler + db 'rmfsp',0xe0 + dw ARM_instruction_rmfsp-instruction_handler + db 'rmfsz',0xe0 + dw ARM_instruction_rmfsz-instruction_handler + db 'rnddm',0xe0 + dw ARM_instruction_rnddm-instruction_handler + db 'rnddp',0xe0 + dw ARM_instruction_rnddp-instruction_handler + db 'rnddz',0xe0 + dw ARM_instruction_rnddz-instruction_handler + db 'rndem',0xe0 + dw ARM_instruction_rndem-instruction_handler + db 'rndep',0xe0 + dw ARM_instruction_rndep-instruction_handler + db 'rndez',0xe0 + dw ARM_instruction_rndez-instruction_handler + db 'rndsm',0xe0 + dw ARM_instruction_rndsm-instruction_handler + db 'rndsp',0xe0 + dw ARM_instruction_rndsp-instruction_handler + db 'rndsz',0xe0 + dw ARM_instruction_rndsz-instruction_handler + db 'ror.n',0xe4 + dw ARM_instruction_ror-instruction_handler + db 'ror.w',0xe2 + dw ARM_instruction_ror-instruction_handler + db 'ror~~',0x00 + dw ARM_instruction_ror-instruction_handler + db 'rpwdm',0xe0 + dw ARM_instruction_rpwdm-instruction_handler + db 'rpwdp',0xe0 + dw ARM_instruction_rpwdp-instruction_handler + db 'rpwdz',0xe0 + dw ARM_instruction_rpwdz-instruction_handler + db 'rpwem',0xe0 + dw ARM_instruction_rpwem-instruction_handler + db 'rpwep',0xe0 + dw ARM_instruction_rpwep-instruction_handler + db 'rpwez',0xe0 + dw ARM_instruction_rpwez-instruction_handler + db 'rpwsm',0xe0 + dw ARM_instruction_rpwsm-instruction_handler + db 'rpwsp',0xe0 + dw ARM_instruction_rpwsp-instruction_handler + db 'rpwsz',0xe0 + dw ARM_instruction_rpwsz-instruction_handler + db 'rrx~~',0x00 + dw ARM_instruction_rrx-instruction_handler + db 'rsb.n',0xe4 + dw ARM_instruction_rsb-instruction_handler + db 'rsb.w',0xe2 + dw ARM_instruction_rsb-instruction_handler + db 'rsb~~',0x00 + dw ARM_instruction_rsb-instruction_handler + db 'rsc~~',0x00 + dw ARM_instruction_rsc-instruction_handler + db 'rsfdm',0xe0 + dw ARM_instruction_rsfdm-instruction_handler + db 'rsfdp',0xe0 + dw ARM_instruction_rsfdp-instruction_handler + db 'rsfdz',0xe0 + dw ARM_instruction_rsfdz-instruction_handler + db 'rsfem',0xe0 + dw ARM_instruction_rsfem-instruction_handler + db 'rsfep',0xe0 + dw ARM_instruction_rsfep-instruction_handler + db 'rsfez',0xe0 + dw ARM_instruction_rsfez-instruction_handler + db 'rsfsm',0xe0 + dw ARM_instruction_rsfsm-instruction_handler + db 'rsfsp',0xe0 + dw ARM_instruction_rsfsp-instruction_handler + db 'rsfsz',0xe0 + dw ARM_instruction_rsfsz-instruction_handler + db 'rshrn',0xf0 + dw ARM_instruction_rshrn-instruction_handler + db 'sabal',0xf0 + dw ARM_instruction_sabal-instruction_handler + db 'sabdl',0xf0 + dw ARM_instruction_sabdl-instruction_handler + db 'sadd8',0xe0 + dw ARM_instruction_sadd8-instruction_handler + db 'saddl',0xf0 + dw ARM_instruction_saddl-instruction_handler + db 'saddw',0xf0 + dw ARM_instruction_saddw-instruction_handler + db 'sbc.n',0xe4 + dw ARM_instruction_sbc-instruction_handler + db 'sbc.w',0xe2 + dw ARM_instruction_sbc-instruction_handler + db 'sbc~~',0x00 + dw ARM_instruction_sbc-instruction_handler + db 'sbfiz',0xf0 + dw ARM_instruction_sbfiz-instruction_handler + db 'scvtf',0xf0 + dw ARM_instruction_scvtf-instruction_handler + db 'sel~~',0x00 + dw ARM_instruction_sel-instruction_handler + db 'sev.n',0xe4 + dw ARM_instruction_sev-instruction_handler + db 'sev.w',0xe2 + dw ARM_instruction_sev-instruction_handler + db 'sev~~',0x00 + dw ARM_instruction_sev-instruction_handler + db 'sfmea',0xe0 + dw ARM_instruction_sfmea-instruction_handler + db 'sfmfd',0xe0 + dw ARM_instruction_sfmfd-instruction_handler + db 'sfm~~',0x00 + dw ARM_instruction_sfm-instruction_handler + db 'sha1c',0xf0 + dw ARM_instruction_sha1c-instruction_handler + db 'sha1h',0xf0 + dw ARM_instruction_sha1h-instruction_handler + db 'sha1m',0xf0 + dw ARM_instruction_sha1m-instruction_handler + db 'sha1p',0xf0 + dw ARM_instruction_sha1p-instruction_handler + db 'shadd',0xf0 + dw ARM_instruction_shadd-instruction_handler + db 'shasx',0xe0 + dw ARM_instruction_shasx-instruction_handler + db 'shll2',0xf0 + dw ARM_instruction_shll2-instruction_handler + db 'shrn2',0xf0 + dw ARM_instruction_shrn2-instruction_handler + db 'shsax',0xe0 + dw ARM_instruction_shsax-instruction_handler + db 'shsub',0xf0 + dw ARM_instruction_shsub-instruction_handler + db 'sindm',0xe0 + dw ARM_instruction_sindm-instruction_handler + db 'sindp',0xe0 + dw ARM_instruction_sindp-instruction_handler + db 'sindz',0xe0 + dw ARM_instruction_sindz-instruction_handler + db 'sinem',0xe0 + dw ARM_instruction_sinem-instruction_handler + db 'sinep',0xe0 + dw ARM_instruction_sinep-instruction_handler + db 'sinez',0xe0 + dw ARM_instruction_sinez-instruction_handler + db 'sinsm',0xe0 + dw ARM_instruction_sinsm-instruction_handler + db 'sinsp',0xe0 + dw ARM_instruction_sinsp-instruction_handler + db 'sinsz',0xe0 + dw ARM_instruction_sinsz-instruction_handler + db 'smaxp',0xf0 + dw ARM_instruction_smaxp-instruction_handler + db 'smaxv',0xf0 + dw ARM_instruction_smaxv-instruction_handler + db 'smc~~',0x00 + dw ARM_instruction_smc-instruction_handler + db 'sminp',0xf0 + dw ARM_instruction_sminp-instruction_handler + db 'sminv',0xf0 + dw ARM_instruction_sminv-instruction_handler + db 'smi~~',0x00 + dw ARM_instruction_smi-instruction_handler + db 'smlad',0xe0 + dw ARM_instruction_smlad-instruction_handler + db 'smlal',0xe0 + dw ARM_instruction_smlal-instruction_handler + db 'smlsd',0xe0 + dw ARM_instruction_smlsd-instruction_handler + db 'smlsl',0xf0 + dw ARM_instruction_smlsl-instruction_handler + db 'smmla',0xe0 + dw ARM_instruction_smmla-instruction_handler + db 'smmls',0xe0 + dw ARM_instruction_smmls-instruction_handler + db 'smmul',0xe0 + dw ARM_instruction_smmul-instruction_handler + db 'smuad',0xe0 + dw ARM_instruction_smuad-instruction_handler + db 'smulh',0xf0 + dw ARM_instruction_smulh-instruction_handler + db 'smull',0xe0 + dw ARM_instruction_smull-instruction_handler + db 'smusd',0xe0 + dw ARM_instruction_smusd-instruction_handler + db 'sqabs',0xf0 + dw ARM_instruction_sqabs-instruction_handler + db 'sqadd',0xf0 + dw ARM_instruction_sqadd-instruction_handler + db 'sqneg',0xf0 + dw ARM_instruction_sqneg-instruction_handler + db 'sqshl',0xf0 + dw ARM_instruction_sqshl-instruction_handler + db 'sqsub',0xf0 + dw ARM_instruction_sqsub-instruction_handler + db 'sqtdm',0xe0 + dw ARM_instruction_sqtdm-instruction_handler + db 'sqtdp',0xe0 + dw ARM_instruction_sqtdp-instruction_handler + db 'sqtdz',0xe0 + dw ARM_instruction_sqtdz-instruction_handler + db 'sqtem',0xe0 + dw ARM_instruction_sqtem-instruction_handler + db 'sqtep',0xe0 + dw ARM_instruction_sqtep-instruction_handler + db 'sqtez',0xe0 + dw ARM_instruction_sqtez-instruction_handler + db 'sqtsm',0xe0 + dw ARM_instruction_sqtsm-instruction_handler + db 'sqtsp',0xe0 + dw ARM_instruction_sqtsp-instruction_handler + db 'sqtsz',0xe0 + dw ARM_instruction_sqtsz-instruction_handler + db 'sqxtn',0xf0 + dw ARM_instruction_sqxtn-instruction_handler + db 'srsda',0xf0 + dw ARM_instruction_srsda-instruction_handler + db 'srsdb',0xf0 + dw ARM_instruction_srsdb-instruction_handler + db 'srsea',0xf0 + dw ARM_instruction_srsea-instruction_handler + db 'srsed',0xf0 + dw ARM_instruction_srsed-instruction_handler + db 'srsfa',0xf0 + dw ARM_instruction_srsfa-instruction_handler + db 'srsfd',0xf0 + dw ARM_instruction_srsfd-instruction_handler + db 'srshl',0xf0 + dw ARM_instruction_srshl-instruction_handler + db 'srshr',0xf0 + dw ARM_instruction_srshr-instruction_handler + db 'srsia',0xf0 + dw ARM_instruction_srsia-instruction_handler + db 'srsib',0xf0 + dw ARM_instruction_srsib-instruction_handler + db 'srsra',0xf0 + dw ARM_instruction_srsra-instruction_handler + db 'sshll',0xf0 + dw ARM_instruction_sshll-instruction_handler + db 'ssub8',0xe0 + dw ARM_instruction_ssub8-instruction_handler + db 'ssubl',0xf0 + dw ARM_instruction_ssubl-instruction_handler + db 'ssubw',0xf0 + dw ARM_instruction_ssubw-instruction_handler + db 'stack',0x00 + dw stack_directive-instruction_handler + db 'stc2l',0xe0 + dw ARM_instruction_stc2l-instruction_handler + db 'stc~~',0x00 + dw ARM_instruction_stc-instruction_handler + db 'stlex',0xe0 + dw ARM_instruction_stlex-instruction_handler + db 'stlrb',0xf0 + dw ARM_instruction_stlrb-instruction_handler + db 'stlrh',0xf0 + dw ARM_instruction_stlrh-instruction_handler + db 'stlxp',0xf0 + dw ARM_instruction_stlxp-instruction_handler + db 'stlxr',0xf0 + dw ARM_instruction_stlxr-instruction_handler + db 'stl~~',0x00 + dw ARM_instruction_stl-instruction_handler + db 'stm.n',0xe4 + dw ARM_instruction_stm-instruction_handler + db 'stm.w',0xe2 + dw ARM_instruction_stm-instruction_handler + db 'stmda',0xe0 + dw ARM_instruction_stmda-instruction_handler + db 'stmdb',0xe0 + dw ARM_instruction_stmdb-instruction_handler + db 'stmea',0xe0 + dw ARM_instruction_stmea-instruction_handler + db 'stmed',0xe0 + dw ARM_instruction_stmed-instruction_handler + db 'stmfa',0xe0 + dw ARM_instruction_stmfa-instruction_handler + db 'stmfd',0xe0 + dw ARM_instruction_stmfd-instruction_handler + db 'stmia',0xe0 + dw ARM_instruction_stmia-instruction_handler + db 'stmib',0xe0 + dw ARM_instruction_stmib-instruction_handler + db 'stm~~',0x00 + dw ARM_instruction_stm-instruction_handler + db 'store',0x00 + dw store_directive-instruction_handler + db 'str.n',0xe4 + dw ARM_instruction_str-instruction_handler + db 'str.w',0xe2 + dw ARM_instruction_str-instruction_handler + db 'strbt',0xe0 + dw ARM_instruction_strbt-instruction_handler + db 'strex',0xe0 + dw ARM_instruction_strex-instruction_handler + db 'strht',0xe0 + dw ARM_instruction_strht-instruction_handler + db 'str~~',0x00 + dw ARM_instruction_str-instruction_handler + db 'sttrb',0xf0 + dw ARM_instruction_sttrb-instruction_handler + db 'sttrh',0xf0 + dw ARM_instruction_sttrh-instruction_handler + db 'sturb',0xf0 + dw ARM_instruction_sturb-instruction_handler + db 'sturh',0xf0 + dw ARM_instruction_sturh-instruction_handler + db 'stxrb',0xf0 + dw ARM_instruction_stxrb-instruction_handler + db 'stxrh',0xf0 + dw ARM_instruction_stxrh-instruction_handler + db 'sub.n',0xe4 + dw ARM_instruction_sub-instruction_handler + db 'sub.w',0xe2 + dw ARM_instruction_sub-instruction_handler + db 'subhn',0xf0 + dw ARM_instruction_subhn-instruction_handler + db 'sub~~',0x00 + dw ARM_instruction_sub-instruction_handler + db 'sufdm',0xe0 + dw ARM_instruction_sufdm-instruction_handler + db 'sufdp',0xe0 + dw ARM_instruction_sufdp-instruction_handler + db 'sufdz',0xe0 + dw ARM_instruction_sufdz-instruction_handler + db 'sufem',0xe0 + dw ARM_instruction_sufem-instruction_handler + db 'sufep',0xe0 + dw ARM_instruction_sufep-instruction_handler + db 'sufez',0xe0 + dw ARM_instruction_sufez-instruction_handler + db 'sufsm',0xe0 + dw ARM_instruction_sufsm-instruction_handler + db 'sufsp',0xe0 + dw ARM_instruction_sufsp-instruction_handler + db 'sufsz',0xe0 + dw ARM_instruction_sufsz-instruction_handler + db 'svc.n',0xe4 + dw ARM_instruction_svc-instruction_handler + db 'svc.w',0xe2 + dw ARM_instruction_svc-instruction_handler + db 'svc~~',0x00 + dw ARM_instruction_svc-instruction_handler + db 'swi.n',0xe4 + dw ARM_instruction_swi-instruction_handler + db 'swi.w',0xe2 + dw ARM_instruction_swi-instruction_handler + db 'swi~~',0x00 + dw ARM_instruction_swi-instruction_handler + db 'swp~~',0x00 + dw ARM_instruction_swp-instruction_handler + db 'sxtab',0xe0 + dw ARM_instruction_sxtab-instruction_handler + db 'sxtah',0xe0 + dw ARM_instruction_sxtah-instruction_handler + db 'sxtl2',0xf0 + dw ARM_instruction_sxtl2-instruction_handler + db 'tandm',0xe0 + dw ARM_instruction_tandm-instruction_handler + db 'tandp',0xe0 + dw ARM_instruction_tandp-instruction_handler + db 'tandz',0xe0 + dw ARM_instruction_tandz-instruction_handler + db 'tanem',0xe0 + dw ARM_instruction_tanem-instruction_handler + db 'tanep',0xe0 + dw ARM_instruction_tanep-instruction_handler + db 'tanez',0xe0 + dw ARM_instruction_tanez-instruction_handler + db 'tansm',0xe0 + dw ARM_instruction_tansm-instruction_handler + db 'tansp',0xe0 + dw ARM_instruction_tansp-instruction_handler + db 'tansz',0xe0 + dw ARM_instruction_tansz-instruction_handler + db 'tbb~~',0x00 + dw ARM_instruction_tbb-instruction_handler + db 'tbh~~',0x00 + dw ARM_instruction_tbh-instruction_handler + db 'teq~~',0x00 + dw ARM_instruction_teq-instruction_handler + db 'thumb',0x00 + dw ARM_thumb_directive-instruction_handler + db 'times',0x00 + dw times_directive-instruction_handler + db 'tmcrr',0xe0 + dw ARM_instruction_tmcrr-instruction_handler + db 'tmrrc',0xe0 + dw ARM_instruction_tmrrc-instruction_handler + db 'torcb',0xe0 + dw ARM_instruction_torcb-instruction_handler + db 'torch',0xe0 + dw ARM_instruction_torch-instruction_handler + db 'torcw',0xe0 + dw ARM_instruction_torcw-instruction_handler + db 'tst.n',0xe4 + dw ARM_instruction_tst-instruction_handler + db 'tst.w',0xe2 + dw ARM_instruction_tst-instruction_handler + db 'tst~~',0x00 + dw ARM_instruction_tst-instruction_handler + db 'uabal',0xf0 + dw ARM_instruction_uabal-instruction_handler + db 'uabdl',0xf0 + dw ARM_instruction_uabdl-instruction_handler + db 'uadd8',0xe0 + dw ARM_instruction_uadd8-instruction_handler + db 'uaddl',0xf0 + dw ARM_instruction_uaddl-instruction_handler + db 'uaddw',0xf0 + dw ARM_instruction_uaddw-instruction_handler + db 'ubfiz',0xf0 + dw ARM_instruction_ubfiz-instruction_handler + db 'ucvtf',0xf0 + dw ARM_instruction_ucvtf-instruction_handler + db 'uhadd',0xf0 + dw ARM_instruction_uhadd-instruction_handler + db 'uhasx',0xe0 + dw ARM_instruction_uhasx-instruction_handler + db 'uhsax',0xe0 + dw ARM_instruction_uhsax-instruction_handler + db 'uhsub',0xf0 + dw ARM_instruction_uhsub-instruction_handler + db 'umaal',0xe0 + dw ARM_instruction_umaal-instruction_handler + db 'umaxp',0xf0 + dw ARM_instruction_umaxp-instruction_handler + db 'umaxv',0xf0 + dw ARM_instruction_umaxv-instruction_handler + db 'uminp',0xf0 + dw ARM_instruction_uminp-instruction_handler + db 'uminv',0xf0 + dw ARM_instruction_uminv-instruction_handler + db 'umlal',0xe0 + dw ARM_instruction_umlal-instruction_handler + db 'umlsl',0xf0 + dw ARM_instruction_umlsl-instruction_handler + db 'umulh',0xf0 + dw ARM_instruction_umulh-instruction_handler + db 'umull',0xe0 + dw ARM_instruction_umull-instruction_handler + db 'und.n',0xe4 + dw ARM_instruction_und-instruction_handler + db 'und.w',0xe2 + dw ARM_instruction_und-instruction_handler + db 'und~~',0x00 + dw ARM_instruction_und-instruction_handler + db 'uqadd',0xf0 + dw ARM_instruction_uqadd-instruction_handler + db 'uqasx',0xe0 + dw ARM_instruction_uqasx-instruction_handler + db 'uqsax',0xe0 + dw ARM_instruction_uqsax-instruction_handler + db 'uqshl',0xf0 + dw ARM_instruction_uqshl-instruction_handler + db 'uqsub',0xf0 + dw ARM_instruction_uqsub-instruction_handler + db 'uqxtn',0xf0 + dw ARM_instruction_uqxtn-instruction_handler + db 'urddm',0xe0 + dw ARM_instruction_urddm-instruction_handler + db 'urddp',0xe0 + dw ARM_instruction_urddp-instruction_handler + db 'urddz',0xe0 + dw ARM_instruction_urddz-instruction_handler + db 'urdem',0xe0 + dw ARM_instruction_urdem-instruction_handler + db 'urdep',0xe0 + dw ARM_instruction_urdep-instruction_handler + db 'urdez',0xe0 + dw ARM_instruction_urdez-instruction_handler + db 'urdsm',0xe0 + dw ARM_instruction_urdsm-instruction_handler + db 'urdsp',0xe0 + dw ARM_instruction_urdsp-instruction_handler + db 'urdsz',0xe0 + dw ARM_instruction_urdsz-instruction_handler + db 'urshl',0xf0 + dw ARM_instruction_urshl-instruction_handler + db 'urshr',0xf0 + dw ARM_instruction_urshr-instruction_handler + db 'ursra',0xf0 + dw ARM_instruction_ursra-instruction_handler + db 'usad8',0xe0 + dw ARM_instruction_usad8-instruction_handler + db 'use16',0x00 + dw ARM_code16_directive-instruction_handler + db 'use32',0x00 + dw ARM_code32_directive-instruction_handler + db 'use64',0x00 + dw ARM_code64_directive-instruction_handler + db 'ushll',0xf0 + dw ARM_instruction_ushll-instruction_handler + db 'usub8',0xe0 + dw ARM_instruction_usub8-instruction_handler + db 'usubl',0xf0 + dw ARM_instruction_usubl-instruction_handler + db 'usubw',0xf0 + dw ARM_instruction_usubw-instruction_handler + db 'uxtab',0xe0 + dw ARM_instruction_uxtab-instruction_handler + db 'uxtah',0xe0 + dw ARM_instruction_uxtah-instruction_handler + db 'uxtl2',0xf0 + dw ARM_instruction_uxtl2-instruction_handler + db 'vpush',0xe0 + dw ARM_instruction_vpush-instruction_handler + db 'wabsb',0xe0 + dw ARM_instruction_wabsb-instruction_handler + db 'wabsh',0xe0 + dw ARM_instruction_wabsh-instruction_handler + db 'wabsw',0xe0 + dw ARM_instruction_wabsw-instruction_handler + db 'waccb',0xe0 + dw ARM_instruction_waccb-instruction_handler + db 'wacch',0xe0 + dw ARM_instruction_wacch-instruction_handler + db 'waccw',0xe0 + dw ARM_instruction_waccw-instruction_handler + db 'waddb',0xe0 + dw ARM_instruction_waddb-instruction_handler + db 'waddh',0xe0 + dw ARM_instruction_waddh-instruction_handler + db 'waddw',0xe0 + dw ARM_instruction_waddw-instruction_handler + db 'wandn',0xe0 + dw ARM_instruction_wandn-instruction_handler + db 'wavg4',0xe0 + dw ARM_instruction_wavg4-instruction_handler + db 'wfc~~',0x00 + dw ARM_instruction_wfc-instruction_handler + db 'wfe.n',0xe4 + dw ARM_instruction_wfe-instruction_handler + db 'wfe.w',0xe2 + dw ARM_instruction_wfe-instruction_handler + db 'wfe~~',0x00 + dw ARM_instruction_wfe-instruction_handler + db 'wfi.n',0xe4 + dw ARM_instruction_wfi-instruction_handler + db 'wfi.w',0xe2 + dw ARM_instruction_wfi-instruction_handler + db 'wfi~~',0x00 + dw ARM_instruction_wfi-instruction_handler + db 'wfs~~',0x00 + dw ARM_instruction_wfs-instruction_handler + db 'while',0x00 + dw while_directive-instruction_handler + db 'wldrb',0xe0 + dw ARM_instruction_wldrb-instruction_handler + db 'wldrd',0xe0 + dw ARM_instruction_wldrd-instruction_handler + db 'wldrh',0xe0 + dw ARM_instruction_wldrh-instruction_handler + db 'wldrw',0xe0 + dw ARM_instruction_wldrw-instruction_handler + db 'wmacs',0xe0 + dw ARM_instruction_wmacs-instruction_handler + db 'wmacu',0xe0 + dw ARM_instruction_wmacu-instruction_handler + db 'wor~~',0x00 + dw ARM_instruction_wor-instruction_handler + db 'wrord',0xe0 + dw ARM_instruction_wrord-instruction_handler + db 'wrorh',0xe0 + dw ARM_instruction_wrorh-instruction_handler + db 'wrorw',0xe0 + dw ARM_instruction_wrorw-instruction_handler + db 'wsadb',0xe0 + dw ARM_instruction_wsadb-instruction_handler + db 'wsadh',0xe0 + dw ARM_instruction_wsadh-instruction_handler + db 'wslld',0xe0 + dw ARM_instruction_wslld-instruction_handler + db 'wsllh',0xe0 + dw ARM_instruction_wsllh-instruction_handler + db 'wsllw',0xe0 + dw ARM_instruction_wsllw-instruction_handler + db 'wsrad',0xe0 + dw ARM_instruction_wsrad-instruction_handler + db 'wsrah',0xe0 + dw ARM_instruction_wsrah-instruction_handler + db 'wsraw',0xe0 + dw ARM_instruction_wsraw-instruction_handler + db 'wsrld',0xe0 + dw ARM_instruction_wsrld-instruction_handler + db 'wsrlh',0xe0 + dw ARM_instruction_wsrlh-instruction_handler + db 'wsrlw',0xe0 + dw ARM_instruction_wsrlw-instruction_handler + db 'wstrb',0xe0 + dw ARM_instruction_wstrb-instruction_handler + db 'wstrd',0xe0 + dw ARM_instruction_wstrd-instruction_handler + db 'wstrh',0xe0 + dw ARM_instruction_wstrh-instruction_handler + db 'wstrw',0xe0 + dw ARM_instruction_wstrw-instruction_handler + db 'wsubb',0xe0 + dw ARM_instruction_wsubb-instruction_handler + db 'wsubh',0xe0 + dw ARM_instruction_wsubh-instruction_handler + db 'wsubw',0xe0 + dw ARM_instruction_wsubw-instruction_handler + db 'wzero',0xe0 + dw ARM_instruction_wzero-instruction_handler + db 'yield',0xe0 + dw ARM_instruction_yield-instruction_handler + db 0 +instructions_6: + db 'abs~~d',0x00 + dw ARM_instruction_absd-instruction_handler + db 'abs~~e',0x00 + dw ARM_instruction_abse-instruction_handler + db 'abs~~s',0x00 + dw ARM_instruction_abss-instruction_handler + db 'acs~~d',0x00 + dw ARM_instruction_acsd-instruction_handler + db 'acs~~e',0x00 + dw ARM_instruction_acse-instruction_handler + db 'acs~~s',0x00 + dw ARM_instruction_acss-instruction_handler + db 'adcs.n',0xe5 + dw ARM_instruction_adc-instruction_handler + db 'adcs.w',0xe3 + dw ARM_instruction_adc-instruction_handler + db 'adcs~~',0x01 + dw ARM_instruction_adc-instruction_handler + db 'adc~~s',0x01 + dw ARM_instruction_adc-instruction_handler + db 'addhn2',0xf0 + dw ARM_instruction_addhn2-instruction_handler + db 'adds.n',0xe5 + dw ARM_instruction_add-instruction_handler + db 'adds.w',0xe3 + dw ARM_instruction_add-instruction_handler + db 'adds~~',0x01 + dw ARM_instruction_add-instruction_handler + db 'addw~~',0x00 + dw ARM_instruction_addw-instruction_handler + db 'add~~s',0x01 + dw ARM_instruction_add-instruction_handler + db 'adf~~d',0x00 + dw ARM_instruction_adfd-instruction_handler + db 'adf~~e',0x00 + dw ARM_instruction_adfe-instruction_handler + db 'adf~~s',0x00 + dw ARM_instruction_adfs-instruction_handler + db 'aesd.8',0xf0 + dw ARM_instruction_aesd.8-instruction_handler + db 'aese.8',0xf0 + dw ARM_instruction_aese.8-instruction_handler + db 'aesimc',0xf0 + dw ARM_instruction_aesimc-instruction_handler + db 'ands.n',0xe5 + dw ARM_instruction_and-instruction_handler + db 'ands.w',0xe3 + dw ARM_instruction_and-instruction_handler + db 'ands~~',0x01 + dw ARM_instruction_and-instruction_handler + db 'and~~s',0x01 + dw ARM_instruction_and-instruction_handler + db 'asn~~d',0x00 + dw ARM_instruction_asnd-instruction_handler + db 'asn~~e',0x00 + dw ARM_instruction_asne-instruction_handler + db 'asn~~s',0x00 + dw ARM_instruction_asns-instruction_handler + db 'asrs.n',0xe5 + dw ARM_instruction_asr-instruction_handler + db 'asrs.w',0xe3 + dw ARM_instruction_asr-instruction_handler + db 'asrs~~',0x01 + dw ARM_instruction_asr-instruction_handler + db 'asr~~s',0x01 + dw ARM_instruction_asr-instruction_handler + db 'assert',0x00 + dw assert_directive-instruction_handler + db 'atn~~d',0x00 + dw ARM_instruction_atnd-instruction_handler + db 'atn~~e',0x00 + dw ARM_instruction_atne-instruction_handler + db 'atn~~s',0x00 + dw ARM_instruction_atns-instruction_handler + db 'bics.n',0xe5 + dw ARM_instruction_bic-instruction_handler + db 'bics.w',0xe3 + dw ARM_instruction_bic-instruction_handler + db 'bics~~',0x01 + dw ARM_instruction_bic-instruction_handler + db 'bic~~s',0x01 + dw ARM_instruction_bic-instruction_handler + db 'bx~~.n',0x04 + dw ARM_instruction_bx-instruction_handler + db 'bx~~.w',0x02 + dw ARM_instruction_bx-instruction_handler + db 'cbnz.n',0xf4 + dw ARM_instruction_cbnz-instruction_handler + db 'cbnz.w',0xf2 + dw ARM_instruction_cbnz-instruction_handler + db 'cdp2~~',0x00 + dw ARM_instruction_cdp2-instruction_handler + db 'cfabsd',0xe0 + dw ARM_instruction_cfabsd-instruction_handler + db 'cfabss',0xe0 + dw ARM_instruction_cfabss-instruction_handler + db 'cfaddd',0xe0 + dw ARM_instruction_cfaddd-instruction_handler + db 'cfadds',0xe0 + dw ARM_instruction_cfadds-instruction_handler + db 'cfcmpd',0xe0 + dw ARM_instruction_cfcmpd-instruction_handler + db 'cfcmps',0xe0 + dw ARM_instruction_cfcmps-instruction_handler + db 'cfcpyd',0xe0 + dw ARM_instruction_cfcpyd-instruction_handler + db 'cfcpys',0xe0 + dw ARM_instruction_cfcpys-instruction_handler + db 'cfldrd',0xe0 + dw ARM_instruction_cfldrd-instruction_handler + db 'cfldrs',0xe0 + dw ARM_instruction_cfldrs-instruction_handler + db 'cfmuld',0xe0 + dw ARM_instruction_cfmuld-instruction_handler + db 'cfmuls',0xe0 + dw ARM_instruction_cfmuls-instruction_handler + db 'cfmvrs',0xe0 + dw ARM_instruction_cfmvrs-instruction_handler + db 'cfmvsr',0xe0 + dw ARM_instruction_cfmvsr-instruction_handler + db 'cfnegd',0xe0 + dw ARM_instruction_cfnegd-instruction_handler + db 'cfnegs',0xe0 + dw ARM_instruction_cfnegs-instruction_handler + db 'cfsh32',0xe0 + dw ARM_instruction_cfsh32-instruction_handler + db 'cfsh64',0xe0 + dw ARM_instruction_cfsh64-instruction_handler + db 'cfstrd',0xe0 + dw ARM_instruction_cfstrd-instruction_handler + db 'cfstrs',0xe0 + dw ARM_instruction_cfstrs-instruction_handler + db 'cfsubd',0xe0 + dw ARM_instruction_cfsubd-instruction_handler + db 'cfsubs',0xe0 + dw ARM_instruction_cfsubs-instruction_handler + db 'chka~~',0x00 + dw ARM_instruction_chka-instruction_handler + db 'cmfe~~',0x00 + dw ARM_instruction_cmfe-instruction_handler + db 'cmnp~~',0x00 + dw ARM_instruction_cmnp-instruction_handler + db 'cmn~~p',0x00 + dw ARM_instruction_cmnp-instruction_handler + db 'cmpp~~',0x00 + dw ARM_instruction_cmpp-instruction_handler + db 'cmp~~p',0x00 + dw ARM_instruction_cmpp-instruction_handler + db 'cnfe~~',0x00 + dw ARM_instruction_cnfe-instruction_handler + db 'code16',0x00 + dw ARM_code16_directive-instruction_handler + db 'code32',0x00 + dw ARM_code32_directive-instruction_handler + db 'code64',0x00 + dw ARM_code64_directive-instruction_handler + db 'cos~~d',0x00 + dw ARM_instruction_cosd-instruction_handler + db 'cos~~e',0x00 + dw ARM_instruction_cose-instruction_handler + db 'cos~~s',0x00 + dw ARM_instruction_coss-instruction_handler + db 'crc32b',0xf0 + dw ARM_instruction_crc32b-instruction_handler + db 'crc32h',0xf0 + dw ARM_instruction_crc32h-instruction_handler + db 'crc32w',0xf0 + dw ARM_instruction_crc32w-instruction_handler + db 'crc32x',0xf0 + dw ARM_instruction_crc32x-instruction_handler + db 'dvf~~d',0x00 + dw ARM_instruction_dvfd-instruction_handler + db 'dvf~~e',0x00 + dw ARM_instruction_dvfe-instruction_handler + db 'dvf~~s',0x00 + dw ARM_instruction_dvfs-instruction_handler + db 'enterx',0xf0 + dw ARM_instruction_enterx-instruction_handler + db 'eors.n',0xe5 + dw ARM_instruction_eor-instruction_handler + db 'eors.w',0xe3 + dw ARM_instruction_eor-instruction_handler + db 'eors~~',0x01 + dw ARM_instruction_eor-instruction_handler + db 'eor~~s',0x01 + dw ARM_instruction_eor-instruction_handler + db 'eret~~',0x00 + dw ARM_instruction_eret-instruction_handler + db 'exp~~d',0x00 + dw ARM_instruction_expd-instruction_handler + db 'exp~~e',0x00 + dw ARM_instruction_expe-instruction_handler + db 'exp~~s',0x00 + dw ARM_instruction_exps-instruction_handler + db 'fccmpe',0xf0 + dw ARM_instruction_fccmpe-instruction_handler + db 'fcmped',0xe0 + dw ARM_instruction_fcmped-instruction_handler + db 'fcmpes',0xe0 + dw ARM_instruction_fcmpes-instruction_handler + db 'fcmpzd',0xe0 + dw ARM_instruction_fcmpzd-instruction_handler + db 'fcmpzs',0xe0 + dw ARM_instruction_fcmpzs-instruction_handler + db 'fcvtas',0xf0 + dw ARM_instruction_fcvtas-instruction_handler + db 'fcvtau',0xf0 + dw ARM_instruction_fcvtau-instruction_handler + db 'fcvtds',0xe0 + dw ARM_instruction_fcvtds-instruction_handler + db 'fcvtl2',0xf0 + dw ARM_instruction_fcvtl2-instruction_handler + db 'fcvtms',0xf0 + dw ARM_instruction_fcvtms-instruction_handler + db 'fcvtmu',0xf0 + dw ARM_instruction_fcvtmu-instruction_handler + db 'fcvtn2',0xf0 + dw ARM_instruction_fcvtn2-instruction_handler + db 'fcvtns',0xf0 + dw ARM_instruction_fcvtns-instruction_handler + db 'fcvtnu',0xf0 + dw ARM_instruction_fcvtnu-instruction_handler + db 'fcvtps',0xf0 + dw ARM_instruction_fcvtps-instruction_handler + db 'fcvtpu',0xf0 + dw ARM_instruction_fcvtpu-instruction_handler + db 'fcvtsd',0xe0 + dw ARM_instruction_fcvtsd-instruction_handler + db 'fcvtxn',0xf0 + dw ARM_instruction_fcvtxn-instruction_handler + db 'fcvtzs',0xf0 + dw ARM_instruction_fcvtzs-instruction_handler + db 'fcvtzu',0xf0 + dw ARM_instruction_fcvtzu-instruction_handler + db 'fdv~~d',0x00 + dw ARM_instruction_fdvd-instruction_handler + db 'fdv~~e',0x00 + dw ARM_instruction_fdve-instruction_handler + db 'fdv~~s',0x00 + dw ARM_instruction_fdvs-instruction_handler + db 'fix~~m',0x00 + dw ARM_instruction_fixm-instruction_handler + db 'fix~~p',0x00 + dw ARM_instruction_fixp-instruction_handler + db 'fix~~z',0x00 + dw ARM_instruction_fixz-instruction_handler + db 'fldd~~',0x00 + dw ARM_instruction_fldd-instruction_handler + db 'flds~~',0x00 + dw ARM_instruction_flds-instruction_handler + db 'flt~~d',0x00 + dw ARM_instruction_fltd-instruction_handler + db 'flt~~e',0x00 + dw ARM_instruction_flte-instruction_handler + db 'flt~~s',0x00 + dw ARM_instruction_flts-instruction_handler + db 'fmaxnm',0xf0 + dw ARM_instruction_fmaxnm-instruction_handler + db 'fminnm',0xf0 + dw ARM_instruction_fminnm-instruction_handler + db 'fml~~d',0x00 + dw ARM_instruction_fmld-instruction_handler + db 'fml~~e',0x00 + dw ARM_instruction_fmle-instruction_handler + db 'fml~~s',0x00 + dw ARM_instruction_fmls-instruction_handler + db 'fmrs~~',0x00 + dw ARM_instruction_fmrs-instruction_handler + db 'fmrx~~',0x00 + dw ARM_instruction_fmrx-instruction_handler + db 'fmsr~~',0x00 + dw ARM_instruction_fmsr-instruction_handler + db 'fmstat',0xe0 + dw ARM_instruction_fmstat-instruction_handler + db 'fmxr~~',0x00 + dw ARM_instruction_fmxr-instruction_handler + db 'fnmacd',0xe0 + dw ARM_instruction_fnmacd-instruction_handler + db 'fnmacs',0xe0 + dw ARM_instruction_fnmacs-instruction_handler + db 'fnmadd',0xf0 + dw ARM_instruction_fnmadd-instruction_handler + db 'fnmscd',0xe0 + dw ARM_instruction_fnmscd-instruction_handler + db 'fnmscs',0xe0 + dw ARM_instruction_fnmscs-instruction_handler + db 'fnmsub',0xf0 + dw ARM_instruction_fnmsub-instruction_handler + db 'fnmuld',0xe0 + dw ARM_instruction_fnmuld-instruction_handler + db 'fnmuls',0xe0 + dw ARM_instruction_fnmuls-instruction_handler + db 'format',0x00 + dw ARM_format_directive-instruction_handler + db 'frd~~d',0x00 + dw ARM_instruction_frdd-instruction_handler + db 'frd~~e',0x00 + dw ARM_instruction_frde-instruction_handler + db 'frd~~s',0x00 + dw ARM_instruction_frds-instruction_handler + db 'frecpe',0xf0 + dw ARM_instruction_frecpe-instruction_handler + db 'frecps',0xf0 + dw ARM_instruction_frecps-instruction_handler + db 'frecpx',0xf0 + dw ARM_instruction_frecpx-instruction_handler + db 'frinta',0xf0 + dw ARM_instruction_frinta-instruction_handler + db 'frinti',0xf0 + dw ARM_instruction_frinti-instruction_handler + db 'frintm',0xf0 + dw ARM_instruction_frintm-instruction_handler + db 'frintn',0xf0 + dw ARM_instruction_frintn-instruction_handler + db 'frintp',0xf0 + dw ARM_instruction_frintp-instruction_handler + db 'frintx',0xf0 + dw ARM_instruction_frintx-instruction_handler + db 'frintz',0xf0 + dw ARM_instruction_frintz-instruction_handler + db 'fshtod',0xe0 + dw ARM_instruction_fshtod-instruction_handler + db 'fshtos',0xe0 + dw ARM_instruction_fshtos-instruction_handler + db 'fsitod',0xe0 + dw ARM_instruction_fsitod-instruction_handler + db 'fsitos',0xe0 + dw ARM_instruction_fsitos-instruction_handler + db 'fsltod',0xe0 + dw ARM_instruction_fsltod-instruction_handler + db 'fsltos',0xe0 + dw ARM_instruction_fsltos-instruction_handler + db 'fsqrtd',0xe0 + dw ARM_instruction_fsqrtd-instruction_handler + db 'fsqrts',0xe0 + dw ARM_instruction_fsqrts-instruction_handler + db 'fstd~~',0x00 + dw ARM_instruction_fstd-instruction_handler + db 'fsts~~',0x00 + dw ARM_instruction_fsts-instruction_handler + db 'ftoshd',0xe0 + dw ARM_instruction_ftoshd-instruction_handler + db 'ftoshs',0xe0 + dw ARM_instruction_ftoshs-instruction_handler + db 'ftosid',0xe0 + dw ARM_instruction_ftosid-instruction_handler + db 'ftosis',0xe0 + dw ARM_instruction_ftosis-instruction_handler + db 'ftosld',0xe0 + dw ARM_instruction_ftosld-instruction_handler + db 'ftosls',0xe0 + dw ARM_instruction_ftosls-instruction_handler + db 'ftouhd',0xe0 + dw ARM_instruction_ftouhd-instruction_handler + db 'ftouhs',0xe0 + dw ARM_instruction_ftouhs-instruction_handler + db 'ftouid',0xe0 + dw ARM_instruction_ftouid-instruction_handler + db 'ftouis',0xe0 + dw ARM_instruction_ftouis-instruction_handler + db 'ftould',0xe0 + dw ARM_instruction_ftould-instruction_handler + db 'ftouls',0xe0 + dw ARM_instruction_ftouls-instruction_handler + db 'fuhtod',0xe0 + dw ARM_instruction_fuhtod-instruction_handler + db 'fuhtos',0xe0 + dw ARM_instruction_fuhtos-instruction_handler + db 'fuitod',0xe0 + dw ARM_instruction_fuitod-instruction_handler + db 'fuitos',0xe0 + dw ARM_instruction_fuitos-instruction_handler + db 'fultod',0xe0 + dw ARM_instruction_fultod-instruction_handler + db 'fultos',0xe0 + dw ARM_instruction_fultos-instruction_handler + db 'hblp~~',0x00 + dw ARM_instruction_hblp-instruction_handler + db 'itauto',0x00 + dw ARM_itauto_directive-instruction_handler + db 'ldab~~',0x00 + dw ARM_instruction_ldab-instruction_handler + db 'ldaexb',0xe0 + dw ARM_instruction_ldaexb-instruction_handler + db 'ldaexd',0xe0 + dw ARM_instruction_ldaexd-instruction_handler + db 'ldaexh',0xe0 + dw ARM_instruction_ldaexh-instruction_handler + db 'ldah~~',0x00 + dw ARM_instruction_ldah-instruction_handler + db 'ldaxrb',0xf0 + dw ARM_instruction_ldaxrb-instruction_handler + db 'ldaxrh',0xf0 + dw ARM_instruction_ldaxrh-instruction_handler + db 'lda~~b',0x00 + dw ARM_instruction_ldab-instruction_handler + db 'lda~~h',0x00 + dw ARM_instruction_ldah-instruction_handler + db 'ldc2~~',0x00 + dw ARM_instruction_ldc2-instruction_handler + db 'ldcl~~',0x00 + dw ARM_instruction_ldcl-instruction_handler + db 'ldc~~l',0x00 + dw ARM_instruction_ldcl-instruction_handler + db 'ldf~~d',0x00 + dw ARM_instruction_ldfd-instruction_handler + db 'ldf~~e',0x00 + dw ARM_instruction_ldfe-instruction_handler + db 'ldf~~p',0x00 + dw ARM_instruction_ldfp-instruction_handler + db 'ldf~~s',0x00 + dw ARM_instruction_ldfs-instruction_handler + db 'ldrb.n',0xe4 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrb.w',0xe2 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrb~~',0x00 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrd~~',0x00 + dw ARM_instruction_ldrd-instruction_handler + db 'ldrexb',0xe0 + dw ARM_instruction_ldrexb-instruction_handler + db 'ldrexd',0xe0 + dw ARM_instruction_ldrexd-instruction_handler + db 'ldrexh',0xe0 + dw ARM_instruction_ldrexh-instruction_handler + db 'ldrh.n',0xe4 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrh.w',0xe2 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrh~~',0x00 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrsbt',0xe0 + dw ARM_instruction_ldrsbt-instruction_handler + db 'ldrsht',0xe0 + dw ARM_instruction_ldrsht-instruction_handler + db 'ldrt~~',0x00 + dw ARM_instruction_ldrt-instruction_handler + db 'ldr~~b',0x00 + dw ARM_instruction_ldrb-instruction_handler + db 'ldr~~d',0x00 + dw ARM_instruction_ldrd-instruction_handler + db 'ldr~~h',0x00 + dw ARM_instruction_ldrh-instruction_handler + db 'ldr~~t',0x00 + dw ARM_instruction_ldrt-instruction_handler + db 'ldtrsb',0xf0 + dw ARM_instruction_ldtrsb-instruction_handler + db 'ldtrsh',0xf0 + dw ARM_instruction_ldtrsh-instruction_handler + db 'ldtrsw',0xf0 + dw ARM_instruction_ldtrsw-instruction_handler + db 'ldursb',0xf0 + dw ARM_instruction_ldursb-instruction_handler + db 'ldursh',0xf0 + dw ARM_instruction_ldursh-instruction_handler + db 'ldursw',0xf0 + dw ARM_instruction_ldursw-instruction_handler + db 'leavex',0xf0 + dw ARM_instruction_leavex-instruction_handler + db 'lgn~~d',0x00 + dw ARM_instruction_lgnd-instruction_handler + db 'lgn~~e',0x00 + dw ARM_instruction_lgne-instruction_handler + db 'lgn~~s',0x00 + dw ARM_instruction_lgns-instruction_handler + db 'log~~d',0x00 + dw ARM_instruction_logd-instruction_handler + db 'log~~e',0x00 + dw ARM_instruction_loge-instruction_handler + db 'log~~s',0x00 + dw ARM_instruction_logs-instruction_handler + db 'lsls.n',0xe5 + dw ARM_instruction_lsl-instruction_handler + db 'lsls.w',0xe3 + dw ARM_instruction_lsl-instruction_handler + db 'lsls~~',0x01 + dw ARM_instruction_lsl-instruction_handler + db 'lsl~~s',0x01 + dw ARM_instruction_lsl-instruction_handler + db 'lsrs.n',0xe5 + dw ARM_instruction_lsr-instruction_handler + db 'lsrs.w',0xe3 + dw ARM_instruction_lsr-instruction_handler + db 'lsrs~~',0x01 + dw ARM_instruction_lsr-instruction_handler + db 'lsr~~s',0x01 + dw ARM_instruction_lsr-instruction_handler + db 'mcr2~~',0x00 + dw ARM_instruction_mcr2-instruction_handler + db 'mcrr~~',0x00 + dw ARM_instruction_mcrr-instruction_handler + db 'mlas~~',0x01 + dw ARM_instruction_mla-instruction_handler + db 'mla~~s',0x01 + dw ARM_instruction_mla-instruction_handler + db 'mnf~~d',0x00 + dw ARM_instruction_mnfd-instruction_handler + db 'mnf~~e',0x00 + dw ARM_instruction_mnfe-instruction_handler + db 'mnf~~s',0x00 + dw ARM_instruction_mnfs-instruction_handler + db 'movs.n',0xe5 + dw ARM_instruction_mov-instruction_handler + db 'movs.w',0xe3 + dw ARM_instruction_mov-instruction_handler + db 'movs~~',0x01 + dw ARM_instruction_mov-instruction_handler + db 'movt~~',0x00 + dw ARM_instruction_movt-instruction_handler + db 'movw~~',0x00 + dw ARM_instruction_movw-instruction_handler + db 'mov~~s',0x01 + dw ARM_instruction_mov-instruction_handler + db 'mrc2~~',0x00 + dw ARM_instruction_mrc2-instruction_handler + db 'mrrc~~',0x00 + dw ARM_instruction_mrrc-instruction_handler + db 'muf~~d',0x00 + dw ARM_instruction_mufd-instruction_handler + db 'muf~~e',0x00 + dw ARM_instruction_mufe-instruction_handler + db 'muf~~s',0x00 + dw ARM_instruction_mufs-instruction_handler + db 'muls.n',0xe5 + dw ARM_instruction_mul-instruction_handler + db 'muls.w',0xe3 + dw ARM_instruction_mul-instruction_handler + db 'muls~~',0x01 + dw ARM_instruction_mul-instruction_handler + db 'mul~~s',0x01 + dw ARM_instruction_mul-instruction_handler + db 'mvf~~d',0x00 + dw ARM_instruction_mvfd-instruction_handler + db 'mvf~~e',0x00 + dw ARM_instruction_mvfe-instruction_handler + db 'mvf~~s',0x00 + dw ARM_instruction_mvfs-instruction_handler + db 'mvns.n',0xe5 + dw ARM_instruction_mvn-instruction_handler + db 'mvns.w',0xe3 + dw ARM_instruction_mvn-instruction_handler + db 'mvns~~',0x01 + dw ARM_instruction_mvn-instruction_handler + db 'mvn~~s',0x01 + dw ARM_instruction_mvn-instruction_handler + db 'negs.n',0xe5 + dw ARM_instruction_neg-instruction_handler + db 'negs.w',0xe3 + dw ARM_instruction_neg-instruction_handler + db 'negs~~',0x01 + dw ARM_instruction_neg-instruction_handler + db 'neg~~s',0x01 + dw ARM_instruction_neg-instruction_handler + db 'nrm~~d',0x00 + dw ARM_instruction_nrmd-instruction_handler + db 'nrm~~e',0x00 + dw ARM_instruction_nrme-instruction_handler + db 'nrm~~s',0x00 + dw ARM_instruction_nrms-instruction_handler + db 'orns~~',0x01 + dw ARM_instruction_orn-instruction_handler + db 'orn~~s',0x01 + dw ARM_instruction_orn-instruction_handler + db 'orrs.n',0xe5 + dw ARM_instruction_orr-instruction_handler + db 'orrs.w',0xe3 + dw ARM_instruction_orr-instruction_handler + db 'orrs~~',0x01 + dw ARM_instruction_orr-instruction_handler + db 'orr~~s',0x01 + dw ARM_instruction_orr-instruction_handler + db 'pldw~~',0x00 + dw ARM_instruction_pldw-instruction_handler + db 'pmull2',0xf0 + dw ARM_instruction_pmull2-instruction_handler + db 'pol~~d',0x00 + dw ARM_instruction_pold-instruction_handler + db 'pol~~e',0x00 + dw ARM_instruction_pole-instruction_handler + db 'pol~~s',0x00 + dw ARM_instruction_pols-instruction_handler + db 'pow~~d',0x00 + dw ARM_instruction_powd-instruction_handler + db 'pow~~e',0x00 + dw ARM_instruction_powe-instruction_handler + db 'pow~~s',0x00 + dw ARM_instruction_pows-instruction_handler + db 'public',0x00 + dw public_directive-instruction_handler + db 'push.n',0xe4 + dw ARM_instruction_push-instruction_handler + db 'push.w',0xe2 + dw ARM_instruction_push-instruction_handler + db 'push~~',0x00 + dw ARM_instruction_push-instruction_handler + db 'qadd16',0xe0 + dw ARM_instruction_qadd16-instruction_handler + db 'qadd~~',0x00 + dw ARM_instruction_qadd-instruction_handler + db 'qasx~~',0x00 + dw ARM_instruction_qasx-instruction_handler + db 'qsax~~',0x00 + dw ARM_instruction_qsax-instruction_handler + db 'qsub16',0xe0 + dw ARM_instruction_qsub16-instruction_handler + db 'qsub~~',0x00 + dw ARM_instruction_qsub-instruction_handler + db 'raddhn',0xf0 + dw ARM_instruction_raddhn-instruction_handler + db 'rbit~~',0x00 + dw ARM_instruction_rbit-instruction_handler + db 'rdf~~d',0x00 + dw ARM_instruction_rdfd-instruction_handler + db 'rdf~~e',0x00 + dw ARM_instruction_rdfe-instruction_handler + db 'rdf~~s',0x00 + dw ARM_instruction_rdfs-instruction_handler + db 'repeat',0x00 + dw repeat_directive-instruction_handler + db 'rmf~~d',0x00 + dw ARM_instruction_rmfd-instruction_handler + db 'rmf~~e',0x00 + dw ARM_instruction_rmfe-instruction_handler + db 'rmf~~s',0x00 + dw ARM_instruction_rmfs-instruction_handler + db 'rnd~~d',0x00 + dw ARM_instruction_rndd-instruction_handler + db 'rnd~~e',0x00 + dw ARM_instruction_rnde-instruction_handler + db 'rnd~~s',0x00 + dw ARM_instruction_rnds-instruction_handler + db 'rors.n',0xe5 + dw ARM_instruction_ror-instruction_handler + db 'rors.w',0xe3 + dw ARM_instruction_ror-instruction_handler + db 'rors~~',0x01 + dw ARM_instruction_ror-instruction_handler + db 'ror~~s',0x01 + dw ARM_instruction_ror-instruction_handler + db 'rpw~~d',0x00 + dw ARM_instruction_rpwd-instruction_handler + db 'rpw~~e',0x00 + dw ARM_instruction_rpwe-instruction_handler + db 'rpw~~s',0x00 + dw ARM_instruction_rpws-instruction_handler + db 'rrxs~~',0x01 + dw ARM_instruction_rrx-instruction_handler + db 'rrx~~s',0x01 + dw ARM_instruction_rrx-instruction_handler + db 'rsbs.n',0xe5 + dw ARM_instruction_rsb-instruction_handler + db 'rsbs.w',0xe3 + dw ARM_instruction_rsb-instruction_handler + db 'rsbs~~',0x01 + dw ARM_instruction_rsb-instruction_handler + db 'rsb~~s',0x01 + dw ARM_instruction_rsb-instruction_handler + db 'rscs~~',0x01 + dw ARM_instruction_rsc-instruction_handler + db 'rsc~~s',0x01 + dw ARM_instruction_rsc-instruction_handler + db 'rsf~~d',0x00 + dw ARM_instruction_rsfd-instruction_handler + db 'rsf~~e',0x00 + dw ARM_instruction_rsfe-instruction_handler + db 'rsf~~s',0x00 + dw ARM_instruction_rsfs-instruction_handler + db 'rshrn2',0xf0 + dw ARM_instruction_rshrn2-instruction_handler + db 'rsubhn',0xf0 + dw ARM_instruction_rsubhn-instruction_handler + db 'sabal2',0xf0 + dw ARM_instruction_sabal2-instruction_handler + db 'sabdl2',0xf0 + dw ARM_instruction_sabdl2-instruction_handler + db 'sadalp',0xf0 + dw ARM_instruction_sadalp-instruction_handler + db 'sadd16',0xe0 + dw ARM_instruction_sadd16-instruction_handler + db 'saddl2',0xf0 + dw ARM_instruction_saddl2-instruction_handler + db 'saddlp',0xf0 + dw ARM_instruction_saddlp-instruction_handler + db 'saddlv',0xf0 + dw ARM_instruction_saddlv-instruction_handler + db 'saddw2',0xf0 + dw ARM_instruction_saddw2-instruction_handler + db 'sasx~~',0x00 + dw ARM_instruction_sasx-instruction_handler + db 'sbcs.n',0xe5 + dw ARM_instruction_sbc-instruction_handler + db 'sbcs.w',0xe3 + dw ARM_instruction_sbc-instruction_handler + db 'sbcs~~',0x01 + dw ARM_instruction_sbc-instruction_handler + db 'sbc~~s',0x01 + dw ARM_instruction_sbc-instruction_handler + db 'sbfx~~',0x00 + dw ARM_instruction_sbfx-instruction_handler + db 'sdiv~~',0x00 + dw ARM_instruction_sdiv-instruction_handler + db 'setend',0xf0 + dw ARM_instruction_setend-instruction_handler + db 'sevl.n',0xe4 + dw ARM_instruction_sevl-instruction_handler + db 'sevl.w',0xe2 + dw ARM_instruction_sevl-instruction_handler + db 'sevl~~',0x00 + dw ARM_instruction_sevl-instruction_handler + db 'shadd8',0xe0 + dw ARM_instruction_shadd8-instruction_handler + db 'shsub8',0xe0 + dw ARM_instruction_shsub8-instruction_handler + db 'sin~~d',0x00 + dw ARM_instruction_sind-instruction_handler + db 'sin~~e',0x00 + dw ARM_instruction_sine-instruction_handler + db 'sin~~s',0x00 + dw ARM_instruction_sins-instruction_handler + db 'smaddl',0xf0 + dw ARM_instruction_smaddl-instruction_handler + db 'smlabb',0xe0 + dw ARM_instruction_smlabb-instruction_handler + db 'smlabt',0xe0 + dw ARM_instruction_smlabt-instruction_handler + db 'smladx',0xe0 + dw ARM_instruction_smladx-instruction_handler + db 'smlal2',0xf0 + dw ARM_instruction_smlal2-instruction_handler + db 'smlald',0xe0 + dw ARM_instruction_smlald-instruction_handler + db 'smlals',0xe1 + dw ARM_instruction_smlal-instruction_handler + db 'smlatb',0xe0 + dw ARM_instruction_smlatb-instruction_handler + db 'smlatt',0xe0 + dw ARM_instruction_smlatt-instruction_handler + db 'smlawb',0xe0 + dw ARM_instruction_smlawb-instruction_handler + db 'smlawt',0xe0 + dw ARM_instruction_smlawt-instruction_handler + db 'smlsdx',0xe0 + dw ARM_instruction_smlsdx-instruction_handler + db 'smlsl2',0xf0 + dw ARM_instruction_smlsl2-instruction_handler + db 'smlsld',0xe0 + dw ARM_instruction_smlsld-instruction_handler + db 'smmlar',0xe0 + dw ARM_instruction_smmlar-instruction_handler + db 'smmlsr',0xe0 + dw ARM_instruction_smmlsr-instruction_handler + db 'smmulr',0xe0 + dw ARM_instruction_smmulr-instruction_handler + db 'smnegl',0xf0 + dw ARM_instruction_smnegl-instruction_handler + db 'smsubl',0xf0 + dw ARM_instruction_smsubl-instruction_handler + db 'smuadx',0xe0 + dw ARM_instruction_smuadx-instruction_handler + db 'smulbb',0xe0 + dw ARM_instruction_smulbb-instruction_handler + db 'smulbt',0xe0 + dw ARM_instruction_smulbt-instruction_handler + db 'smull2',0xf0 + dw ARM_instruction_smull2-instruction_handler + db 'smulls',0xe1 + dw ARM_instruction_smull-instruction_handler + db 'smultb',0xe0 + dw ARM_instruction_smultb-instruction_handler + db 'smultt',0xe0 + dw ARM_instruction_smultt-instruction_handler + db 'smulwb',0xe0 + dw ARM_instruction_smulwb-instruction_handler + db 'smulwt',0xe0 + dw ARM_instruction_smulwt-instruction_handler + db 'smusdx',0xe0 + dw ARM_instruction_smusdx-instruction_handler + db 'sqrshl',0xf0 + dw ARM_instruction_sqrshl-instruction_handler + db 'sqshlu',0xf0 + dw ARM_instruction_sqshlu-instruction_handler + db 'sqshrn',0xf0 + dw ARM_instruction_sqshrn-instruction_handler + db 'sqt~~d',0x00 + dw ARM_instruction_sqtd-instruction_handler + db 'sqt~~e',0x00 + dw ARM_instruction_sqte-instruction_handler + db 'sqt~~s',0x00 + dw ARM_instruction_sqts-instruction_handler + db 'sqxtn2',0xf0 + dw ARM_instruction_sqxtn2-instruction_handler + db 'sqxtun',0xf0 + dw ARM_instruction_sqxtun-instruction_handler + db 'srhadd',0xf0 + dw ARM_instruction_srhadd-instruction_handler + db 'ssat16',0xe0 + dw ARM_instruction_ssat16-instruction_handler + db 'ssat~~',0x00 + dw ARM_instruction_ssat-instruction_handler + db 'ssax~~',0x00 + dw ARM_instruction_ssax-instruction_handler + db 'sshll2',0xf0 + dw ARM_instruction_sshll2-instruction_handler + db 'ssub16',0xe0 + dw ARM_instruction_ssub16-instruction_handler + db 'ssubl2',0xf0 + dw ARM_instruction_ssubl2-instruction_handler + db 'ssubw2',0xf0 + dw ARM_instruction_ssubw2-instruction_handler + db 'stc2~~',0x00 + dw ARM_instruction_stc2-instruction_handler + db 'stcl~~',0x00 + dw ARM_instruction_stcl-instruction_handler + db 'stc~~l',0x00 + dw ARM_instruction_stcl-instruction_handler + db 'stf~~d',0x00 + dw ARM_instruction_stfd-instruction_handler + db 'stf~~e',0x00 + dw ARM_instruction_stfe-instruction_handler + db 'stf~~p',0x00 + dw ARM_instruction_stfp-instruction_handler + db 'stf~~s',0x00 + dw ARM_instruction_stfs-instruction_handler + db 'stlb~~',0x00 + dw ARM_instruction_stlb-instruction_handler + db 'stlexb',0xe0 + dw ARM_instruction_stlexb-instruction_handler + db 'stlexd',0xe0 + dw ARM_instruction_stlexd-instruction_handler + db 'stlexh',0xe0 + dw ARM_instruction_stlexh-instruction_handler + db 'stlh~~',0x00 + dw ARM_instruction_stlh-instruction_handler + db 'stlxrb',0xf0 + dw ARM_instruction_stlxrb-instruction_handler + db 'stlxrh',0xf0 + dw ARM_instruction_stlxrh-instruction_handler + db 'stl~~b',0x00 + dw ARM_instruction_stlb-instruction_handler + db 'stl~~h',0x00 + dw ARM_instruction_stlh-instruction_handler + db 'strb.n',0xe4 + dw ARM_instruction_strb-instruction_handler + db 'strb.w',0xe2 + dw ARM_instruction_strb-instruction_handler + db 'strb~~',0x00 + dw ARM_instruction_strb-instruction_handler + db 'strd~~',0x00 + dw ARM_instruction_strd-instruction_handler + db 'strexb',0xe0 + dw ARM_instruction_strexb-instruction_handler + db 'strexd',0xe0 + dw ARM_instruction_strexd-instruction_handler + db 'strexh',0xe0 + dw ARM_instruction_strexh-instruction_handler + db 'strh.n',0xe4 + dw ARM_instruction_strh-instruction_handler + db 'strh.w',0xe2 + dw ARM_instruction_strh-instruction_handler + db 'strh~~',0x00 + dw ARM_instruction_strh-instruction_handler + db 'strt~~',0x00 + dw ARM_instruction_strt-instruction_handler + db 'str~~b',0x00 + dw ARM_instruction_strb-instruction_handler + db 'str~~d',0x00 + dw ARM_instruction_strd-instruction_handler + db 'str~~h',0x00 + dw ARM_instruction_strh-instruction_handler + db 'str~~t',0x00 + dw ARM_instruction_strt-instruction_handler + db 'subhn2',0xf0 + dw ARM_instruction_subhn2-instruction_handler + db 'subs.n',0xe5 + dw ARM_instruction_sub-instruction_handler + db 'subs.w',0xe3 + dw ARM_instruction_sub-instruction_handler + db 'subs~~',0x01 + dw ARM_instruction_sub-instruction_handler + db 'subw~~',0x00 + dw ARM_instruction_subw-instruction_handler + db 'sub~~s',0x01 + dw ARM_instruction_sub-instruction_handler + db 'suf~~d',0x00 + dw ARM_instruction_sufd-instruction_handler + db 'suf~~e',0x00 + dw ARM_instruction_sufe-instruction_handler + db 'suf~~s',0x00 + dw ARM_instruction_sufs-instruction_handler + db 'suqadd',0xf0 + dw ARM_instruction_suqadd-instruction_handler + db 'swpb~~',0x00 + dw ARM_instruction_swpb-instruction_handler + db 'swp~~b',0x00 + dw ARM_instruction_swpb-instruction_handler + db 'sxtb.n',0xe4 + dw ARM_instruction_sxtb-instruction_handler + db 'sxtb.w',0xe2 + dw ARM_instruction_sxtb-instruction_handler + db 'sxtb16',0xe0 + dw ARM_instruction_sxtb16-instruction_handler + db 'sxtb~~',0x00 + dw ARM_instruction_sxtb-instruction_handler + db 'sxth.n',0xe4 + dw ARM_instruction_sxth-instruction_handler + db 'sxth.w',0xe2 + dw ARM_instruction_sxth-instruction_handler + db 'sxth~~',0x00 + dw ARM_instruction_sxth-instruction_handler + db 'tandcb',0xe0 + dw ARM_instruction_tandcb-instruction_handler + db 'tandch',0xe0 + dw ARM_instruction_tandch-instruction_handler + db 'tandcw',0xe0 + dw ARM_instruction_tandcw-instruction_handler + db 'tan~~d',0x00 + dw ARM_instruction_tand-instruction_handler + db 'tan~~e',0x00 + dw ARM_instruction_tane-instruction_handler + db 'tan~~s',0x00 + dw ARM_instruction_tans-instruction_handler + db 'tbcstb',0xe0 + dw ARM_instruction_tbcstb-instruction_handler + db 'tbcsth',0xe0 + dw ARM_instruction_tbcsth-instruction_handler + db 'tbcstw',0xe0 + dw ARM_instruction_tbcstw-instruction_handler + db 'teqp~~',0x00 + dw ARM_instruction_teqp-instruction_handler + db 'teq~~p',0x00 + dw ARM_instruction_teqp-instruction_handler + db 'tinsrb',0xe0 + dw ARM_instruction_tinsrb-instruction_handler + db 'tinsrh',0xe0 + dw ARM_instruction_tinsrh-instruction_handler + db 'tinsrw',0xe0 + dw ARM_instruction_tinsrw-instruction_handler + db 'tmcr~~',0x00 + dw ARM_instruction_tmcr-instruction_handler + db 'tmiabb',0xe0 + dw ARM_instruction_tmiabb-instruction_handler + db 'tmiabt',0xe0 + dw ARM_instruction_tmiabt-instruction_handler + db 'tmiaph',0xe0 + dw ARM_instruction_tmiaph-instruction_handler + db 'tmiatb',0xe0 + dw ARM_instruction_tmiatb-instruction_handler + db 'tmiatt',0xe0 + dw ARM_instruction_tmiatt-instruction_handler + db 'tmia~~',0x00 + dw ARM_instruction_tmia-instruction_handler + db 'tmrc~~',0x00 + dw ARM_instruction_tmrc-instruction_handler + db 'tstp~~',0x00 + dw ARM_instruction_tstp-instruction_handler + db 'tst~~p',0x00 + dw ARM_instruction_tstp-instruction_handler + db 'uabal2',0xf0 + dw ARM_instruction_uabal2-instruction_handler + db 'uabdl2',0xf0 + dw ARM_instruction_uabdl2-instruction_handler + db 'uadalp',0xf0 + dw ARM_instruction_uadalp-instruction_handler + db 'uadd16',0xe0 + dw ARM_instruction_uadd16-instruction_handler + db 'uaddl2',0xf0 + dw ARM_instruction_uaddl2-instruction_handler + db 'uaddlp',0xf0 + dw ARM_instruction_uaddlp-instruction_handler + db 'uaddlv',0xf0 + dw ARM_instruction_uaddlv-instruction_handler + db 'uaddw2',0xf0 + dw ARM_instruction_uaddw2-instruction_handler + db 'uasx~~',0x00 + dw ARM_instruction_uasx-instruction_handler + db 'ubfx~~',0x00 + dw ARM_instruction_ubfx-instruction_handler + db 'udiv~~',0x00 + dw ARM_instruction_udiv-instruction_handler + db 'uhadd8',0xe0 + dw ARM_instruction_uhadd8-instruction_handler + db 'uhsub8',0xe0 + dw ARM_instruction_uhsub8-instruction_handler + db 'umaddl',0xf0 + dw ARM_instruction_umaddl-instruction_handler + db 'umlal2',0xf0 + dw ARM_instruction_umlal2-instruction_handler + db 'umlals',0xe1 + dw ARM_instruction_umlal-instruction_handler + db 'umlsl2',0xf0 + dw ARM_instruction_umlsl2-instruction_handler + db 'umnegl',0xf0 + dw ARM_instruction_umnegl-instruction_handler + db 'umsubl',0xf0 + dw ARM_instruction_umsubl-instruction_handler + db 'umull2',0xf0 + dw ARM_instruction_umull2-instruction_handler + db 'umulls',0xe1 + dw ARM_instruction_umull-instruction_handler + db 'uqadd8',0xe0 + dw ARM_instruction_uqadd8-instruction_handler + db 'uqrshl',0xf0 + dw ARM_instruction_uqrshl-instruction_handler + db 'uqshrn',0xf0 + dw ARM_instruction_uqshrn-instruction_handler + db 'uqsub8',0xe0 + dw ARM_instruction_uqsub8-instruction_handler + db 'uqxtn2',0xf0 + dw ARM_instruction_uqxtn2-instruction_handler + db 'urd~~d',0x00 + dw ARM_instruction_urdd-instruction_handler + db 'urd~~e',0x00 + dw ARM_instruction_urde-instruction_handler + db 'urd~~s',0x00 + dw ARM_instruction_urds-instruction_handler + db 'urecpe',0xf0 + dw ARM_instruction_urecpe-instruction_handler + db 'urhadd',0xf0 + dw ARM_instruction_urhadd-instruction_handler + db 'usada8',0xe0 + dw ARM_instruction_usada8-instruction_handler + db 'usat16',0xe0 + dw ARM_instruction_usat16-instruction_handler + db 'usat~~',0x00 + dw ARM_instruction_usat-instruction_handler + db 'usax~~',0x00 + dw ARM_instruction_usax-instruction_handler + db 'ushll2',0xf0 + dw ARM_instruction_ushll2-instruction_handler + db 'usqadd',0xf0 + dw ARM_instruction_usqadd-instruction_handler + db 'usub16',0xe0 + dw ARM_instruction_usub16-instruction_handler + db 'usubl2',0xf0 + dw ARM_instruction_usubl2-instruction_handler + db 'usubw2',0xf0 + dw ARM_instruction_usubw2-instruction_handler + db 'uxtb.n',0xe4 + dw ARM_instruction_uxtb-instruction_handler + db 'uxtb.w',0xe2 + dw ARM_instruction_uxtb-instruction_handler + db 'uxtb16',0xe0 + dw ARM_instruction_uxtb16-instruction_handler + db 'uxtb~~',0x00 + dw ARM_instruction_uxtb-instruction_handler + db 'uxth.n',0xe4 + dw ARM_instruction_uxth-instruction_handler + db 'uxth.w',0xe2 + dw ARM_instruction_uxth-instruction_handler + db 'uxth~~',0x00 + dw ARM_instruction_uxth-instruction_handler + db 'vand~~',0x00 + dw ARM_instruction_vand-instruction_handler + db 'vbic~~',0x00 + dw ARM_instruction_vbic-instruction_handler + db 'vbif~~',0x00 + dw ARM_instruction_vbif-instruction_handler + db 'vbit~~',0x00 + dw ARM_instruction_vbit-instruction_handler + db 'vbsl~~',0x00 + dw ARM_instruction_vbsl-instruction_handler + db 'vcnt.8',0xe0 + dw ARM_instruction_vcnt.8-instruction_handler + db 'vdup.8',0xe0 + dw ARM_instruction_vdup.8-instruction_handler + db 'veor~~',0x00 + dw ARM_instruction_veor-instruction_handler + db 'vext.8',0xe0 + dw ARM_instruction_vext.8-instruction_handler + db 'vld1.8',0xe0 + dw ARM_instruction_vld1.8-instruction_handler + db 'vld2.8',0xe0 + dw ARM_instruction_vld2.8-instruction_handler + db 'vld3.8',0xe0 + dw ARM_instruction_vld3.8-instruction_handler + db 'vld4.8',0xe0 + dw ARM_instruction_vld4.8-instruction_handler + db 'vldmdb',0xe0 + dw ARM_instruction_vldmdb-instruction_handler + db 'vldmea',0xe0 + dw ARM_instruction_vldmea-instruction_handler + db 'vldmfd',0xe0 + dw ARM_instruction_vldmfd-instruction_handler + db 'vldmia',0xe0 + dw ARM_instruction_vldmia-instruction_handler + db 'vldm~~',0x00 + dw ARM_instruction_vldm-instruction_handler + db 'vldr~~',0x00 + dw ARM_instruction_vldr-instruction_handler + db 'vmov.8',0xe0 + dw ARM_instruction_vmov.8-instruction_handler + db 'vmov~~',0x00 + dw ARM_instruction_vmov-instruction_handler + db 'vmrs~~',0x00 + dw ARM_instruction_vmrs-instruction_handler + db 'vmsr~~',0x00 + dw ARM_instruction_vmsr-instruction_handler + db 'vmvn~~',0x00 + dw ARM_instruction_vmvn-instruction_handler + db 'vorn~~',0x00 + dw ARM_instruction_vorn-instruction_handler + db 'vorr~~',0x00 + dw ARM_instruction_vorr-instruction_handler + db 'vpop~~',0x00 + dw ARM_instruction_vpop-instruction_handler + db 'vsli.8',0xe0 + dw ARM_instruction_vsli.8-instruction_handler + db 'vsri.8',0xe0 + dw ARM_instruction_vsri.8-instruction_handler + db 'vst1.8',0xe0 + dw ARM_instruction_vst1.8-instruction_handler + db 'vst2.8',0xe0 + dw ARM_instruction_vst2.8-instruction_handler + db 'vst3.8',0xe0 + dw ARM_instruction_vst3.8-instruction_handler + db 'vst4.8',0xe0 + dw ARM_instruction_vst4.8-instruction_handler + db 'vstmdb',0xe0 + dw ARM_instruction_vstmdb-instruction_handler + db 'vstmea',0xe0 + dw ARM_instruction_vstmea-instruction_handler + db 'vstmfd',0xe0 + dw ARM_instruction_vstmfd-instruction_handler + db 'vstmia',0xe0 + dw ARM_instruction_vstmia-instruction_handler + db 'vstm~~',0x00 + dw ARM_instruction_vstm-instruction_handler + db 'vstr~~',0x00 + dw ARM_instruction_vstr-instruction_handler + db 'vswp~~',0x00 + dw ARM_instruction_vswp-instruction_handler + db 'vtbl.8',0xe0 + dw ARM_instruction_vtbl.8-instruction_handler + db 'vtbx.8',0xe0 + dw ARM_instruction_vtbx.8-instruction_handler + db 'vtrn.8',0xe0 + dw ARM_instruction_vtrn.8-instruction_handler + db 'vtst.8',0xe0 + dw ARM_instruction_vtst.8-instruction_handler + db 'vuzp.8',0xe0 + dw ARM_instruction_vuzp.8-instruction_handler + db 'vzip.8',0xe0 + dw ARM_instruction_vzip.8-instruction_handler + db 'waddhc',0xe0 + dw ARM_instruction_waddhc-instruction_handler + db 'waddwc',0xe0 + dw ARM_instruction_waddwc-instruction_handler + db 'wand~~',0x00 + dw ARM_instruction_wand-instruction_handler + db 'wavg2b',0xe0 + dw ARM_instruction_wavg2b-instruction_handler + db 'wavg2h',0xe0 + dw ARM_instruction_wavg2h-instruction_handler + db 'wavg4r',0xe0 + dw ARM_instruction_wavg4r-instruction_handler + db 'wmacsz',0xe0 + dw ARM_instruction_wmacsz-instruction_handler + db 'wmacuz',0xe0 + dw ARM_instruction_wmacuz-instruction_handler + db 'wmadds',0xe0 + dw ARM_instruction_wmadds-instruction_handler + db 'wmaddu',0xe0 + dw ARM_instruction_wmaddu-instruction_handler + db 'wmaxsb',0xe0 + dw ARM_instruction_wmaxsb-instruction_handler + db 'wmaxsh',0xe0 + dw ARM_instruction_wmaxsh-instruction_handler + db 'wmaxsw',0xe0 + dw ARM_instruction_wmaxsw-instruction_handler + db 'wmaxub',0xe0 + dw ARM_instruction_wmaxub-instruction_handler + db 'wmaxuh',0xe0 + dw ARM_instruction_wmaxuh-instruction_handler + db 'wmaxuw',0xe0 + dw ARM_instruction_wmaxuw-instruction_handler + db 'wmerge',0xe0 + dw ARM_instruction_wmerge-instruction_handler + db 'wmiabb',0xe0 + dw ARM_instruction_wmiabb-instruction_handler + db 'wmiabt',0xe0 + dw ARM_instruction_wmiabt-instruction_handler + db 'wmiatb',0xe0 + dw ARM_instruction_wmiatb-instruction_handler + db 'wmiatt',0xe0 + dw ARM_instruction_wmiatt-instruction_handler + db 'wminsb',0xe0 + dw ARM_instruction_wminsb-instruction_handler + db 'wminsh',0xe0 + dw ARM_instruction_wminsh-instruction_handler + db 'wminsw',0xe0 + dw ARM_instruction_wminsw-instruction_handler + db 'wminub',0xe0 + dw ARM_instruction_wminub-instruction_handler + db 'wminuh',0xe0 + dw ARM_instruction_wminuh-instruction_handler + db 'wminuw',0xe0 + dw ARM_instruction_wminuw-instruction_handler + db 'wmov~~',0x00 + dw ARM_instruction_wmov-instruction_handler + db 'wmulsl',0xe0 + dw ARM_instruction_wmulsl-instruction_handler + db 'wmulsm',0xe0 + dw ARM_instruction_wmulsm-instruction_handler + db 'wmulul',0xe0 + dw ARM_instruction_wmulul-instruction_handler + db 'wmulum',0xe0 + dw ARM_instruction_wmulum-instruction_handler + db 'wmulwl',0xe0 + dw ARM_instruction_wmulwl-instruction_handler + db 'wqmulm',0xe0 + dw ARM_instruction_wqmulm-instruction_handler + db 'wrordg',0xe0 + dw ARM_instruction_wrordg-instruction_handler + db 'wrorhg',0xe0 + dw ARM_instruction_wrorhg-instruction_handler + db 'wrorwg',0xe0 + dw ARM_instruction_wrorwg-instruction_handler + db 'wsadbz',0xe0 + dw ARM_instruction_wsadbz-instruction_handler + db 'wsadhz',0xe0 + dw ARM_instruction_wsadhz-instruction_handler + db 'wshufh',0xe0 + dw ARM_instruction_wshufh-instruction_handler + db 'wslldg',0xe0 + dw ARM_instruction_wslldg-instruction_handler + db 'wsllhg',0xe0 + dw ARM_instruction_wsllhg-instruction_handler + db 'wsllwg',0xe0 + dw ARM_instruction_wsllwg-instruction_handler + db 'wsradg',0xe0 + dw ARM_instruction_wsradg-instruction_handler + db 'wsrahg',0xe0 + dw ARM_instruction_wsrahg-instruction_handler + db 'wsrawg',0xe0 + dw ARM_instruction_wsrawg-instruction_handler + db 'wsrldg',0xe0 + dw ARM_instruction_wsrldg-instruction_handler + db 'wsrlhg',0xe0 + dw ARM_instruction_wsrlhg-instruction_handler + db 'wsrlwg',0xe0 + dw ARM_instruction_wsrlwg-instruction_handler + db 'wxor~~',0x00 + dw ARM_instruction_wxor-instruction_handler + db 0 +instructions_7: + db 'abs~~dm',0x00 + dw ARM_instruction_absdm-instruction_handler + db 'abs~~dp',0x00 + dw ARM_instruction_absdp-instruction_handler + db 'abs~~dz',0x00 + dw ARM_instruction_absdz-instruction_handler + db 'abs~~em',0x00 + dw ARM_instruction_absem-instruction_handler + db 'abs~~ep',0x00 + dw ARM_instruction_absep-instruction_handler + db 'abs~~ez',0x00 + dw ARM_instruction_absez-instruction_handler + db 'abs~~sm',0x00 + dw ARM_instruction_abssm-instruction_handler + db 'abs~~sp',0x00 + dw ARM_instruction_abssp-instruction_handler + db 'abs~~sz',0x00 + dw ARM_instruction_abssz-instruction_handler + db 'acs~~dm',0x00 + dw ARM_instruction_acsdm-instruction_handler + db 'acs~~dp',0x00 + dw ARM_instruction_acsdp-instruction_handler + db 'acs~~dz',0x00 + dw ARM_instruction_acsdz-instruction_handler + db 'acs~~em',0x00 + dw ARM_instruction_acsem-instruction_handler + db 'acs~~ep',0x00 + dw ARM_instruction_acsep-instruction_handler + db 'acs~~ez',0x00 + dw ARM_instruction_acsez-instruction_handler + db 'acs~~sm',0x00 + dw ARM_instruction_acssm-instruction_handler + db 'acs~~sp',0x00 + dw ARM_instruction_acssp-instruction_handler + db 'acs~~sz',0x00 + dw ARM_instruction_acssz-instruction_handler + db 'adc~~.n',0x04 + dw ARM_instruction_adc-instruction_handler + db 'adc~~.w',0x02 + dw ARM_instruction_adc-instruction_handler + db 'add~~.n',0x04 + dw ARM_instruction_add-instruction_handler + db 'add~~.w',0x02 + dw ARM_instruction_add-instruction_handler + db 'adf~~dm',0x00 + dw ARM_instruction_adfdm-instruction_handler + db 'adf~~dp',0x00 + dw ARM_instruction_adfdp-instruction_handler + db 'adf~~dz',0x00 + dw ARM_instruction_adfdz-instruction_handler + db 'adf~~em',0x00 + dw ARM_instruction_adfem-instruction_handler + db 'adf~~ep',0x00 + dw ARM_instruction_adfep-instruction_handler + db 'adf~~ez',0x00 + dw ARM_instruction_adfez-instruction_handler + db 'adf~~sm',0x00 + dw ARM_instruction_adfsm-instruction_handler + db 'adf~~sp',0x00 + dw ARM_instruction_adfsp-instruction_handler + db 'adf~~sz',0x00 + dw ARM_instruction_adfsz-instruction_handler + db 'adr~~.n',0x04 + dw ARM_instruction_adr-instruction_handler + db 'adr~~.w',0x02 + dw ARM_instruction_adr-instruction_handler + db 'aesmc.8',0xf0 + dw ARM_instruction_aesmc.8-instruction_handler + db 'and~~.n',0x04 + dw ARM_instruction_and-instruction_handler + db 'and~~.w',0x02 + dw ARM_instruction_and-instruction_handler + db 'asn~~dm',0x00 + dw ARM_instruction_asndm-instruction_handler + db 'asn~~dp',0x00 + dw ARM_instruction_asndp-instruction_handler + db 'asn~~dz',0x00 + dw ARM_instruction_asndz-instruction_handler + db 'asn~~em',0x00 + dw ARM_instruction_asnem-instruction_handler + db 'asn~~ep',0x00 + dw ARM_instruction_asnep-instruction_handler + db 'asn~~ez',0x00 + dw ARM_instruction_asnez-instruction_handler + db 'asn~~sm',0x00 + dw ARM_instruction_asnsm-instruction_handler + db 'asn~~sp',0x00 + dw ARM_instruction_asnsp-instruction_handler + db 'asn~~sz',0x00 + dw ARM_instruction_asnsz-instruction_handler + db 'asr~~.n',0x04 + dw ARM_instruction_asr-instruction_handler + db 'asr~~.w',0x02 + dw ARM_instruction_asr-instruction_handler + db 'atn~~dm',0x00 + dw ARM_instruction_atndm-instruction_handler + db 'atn~~dp',0x00 + dw ARM_instruction_atndp-instruction_handler + db 'atn~~dz',0x00 + dw ARM_instruction_atndz-instruction_handler + db 'atn~~em',0x00 + dw ARM_instruction_atnem-instruction_handler + db 'atn~~ep',0x00 + dw ARM_instruction_atnep-instruction_handler + db 'atn~~ez',0x00 + dw ARM_instruction_atnez-instruction_handler + db 'atn~~sm',0x00 + dw ARM_instruction_atnsm-instruction_handler + db 'atn~~sp',0x00 + dw ARM_instruction_atnsp-instruction_handler + db 'atn~~sz',0x00 + dw ARM_instruction_atnsz-instruction_handler + db 'bic~~.n',0x04 + dw ARM_instruction_bic-instruction_handler + db 'bic~~.w',0x02 + dw ARM_instruction_bic-instruction_handler + db 'blx~~.n',0x04 + dw ARM_instruction_blx-instruction_handler + db 'blx~~.w',0x02 + dw ARM_instruction_blx-instruction_handler + db 'cfabs32',0xe0 + dw ARM_instruction_cfabs32-instruction_handler + db 'cfabs64',0xe0 + dw ARM_instruction_cfabs64-instruction_handler + db 'cfadd32',0xe0 + dw ARM_instruction_cfadd32-instruction_handler + db 'cfadd64',0xe0 + dw ARM_instruction_cfadd64-instruction_handler + db 'cfcmp32',0xe0 + dw ARM_instruction_cfcmp32-instruction_handler + db 'cfcmp64',0xe0 + dw ARM_instruction_cfcmp64-instruction_handler + db 'cfcvtds',0xe0 + dw ARM_instruction_cfcvtds-instruction_handler + db 'cfcvtsd',0xe0 + dw ARM_instruction_cfcvtsd-instruction_handler + db 'cfldr32',0xe0 + dw ARM_instruction_cfldr32-instruction_handler + db 'cfldr64',0xe0 + dw ARM_instruction_cfldr64-instruction_handler + db 'cfmac32',0xe0 + dw ARM_instruction_cfmac32-instruction_handler + db 'cfmsc32',0xe0 + dw ARM_instruction_cfmsc32-instruction_handler + db 'cfmul32',0xe0 + dw ARM_instruction_cfmul32-instruction_handler + db 'cfmul64',0xe0 + dw ARM_instruction_cfmul64-instruction_handler + db 'cfmv32a',0xe0 + dw ARM_instruction_cfmv32a-instruction_handler + db 'cfmv64a',0xe0 + dw ARM_instruction_cfmv64a-instruction_handler + db 'cfmva32',0xe0 + dw ARM_instruction_cfmva32-instruction_handler + db 'cfmva64',0xe0 + dw ARM_instruction_cfmva64-instruction_handler + db 'cfmvdhr',0xe0 + dw ARM_instruction_cfmvdhr-instruction_handler + db 'cfmvdlr',0xe0 + dw ARM_instruction_cfmvdlr-instruction_handler + db 'cfmvrdh',0xe0 + dw ARM_instruction_cfmvrdh-instruction_handler + db 'cfmvrdl',0xe0 + dw ARM_instruction_cfmvrdl-instruction_handler + db 'cfneg32',0xe0 + dw ARM_instruction_cfneg32-instruction_handler + db 'cfneg64',0xe0 + dw ARM_instruction_cfneg64-instruction_handler + db 'cfstr32',0xe0 + dw ARM_instruction_cfstr32-instruction_handler + db 'cfstr64',0xe0 + dw ARM_instruction_cfstr64-instruction_handler + db 'cfsub32',0xe0 + dw ARM_instruction_cfsub32-instruction_handler + db 'cfsub64',0xe0 + dw ARM_instruction_cfsub64-instruction_handler + db 'clrex~~',0x00 + dw ARM_instruction_clrex-instruction_handler + db 'cmn~~.n',0x04 + dw ARM_instruction_cmn-instruction_handler + db 'cmn~~.w',0x02 + dw ARM_instruction_cmn-instruction_handler + db 'cmp~~.n',0x04 + dw ARM_instruction_cmp-instruction_handler + db 'cmp~~.w',0x02 + dw ARM_instruction_cmp-instruction_handler + db 'cos~~dm',0x00 + dw ARM_instruction_cosdm-instruction_handler + db 'cos~~dp',0x00 + dw ARM_instruction_cosdp-instruction_handler + db 'cos~~dz',0x00 + dw ARM_instruction_cosdz-instruction_handler + db 'cos~~em',0x00 + dw ARM_instruction_cosem-instruction_handler + db 'cos~~ep',0x00 + dw ARM_instruction_cosep-instruction_handler + db 'cos~~ez',0x00 + dw ARM_instruction_cosez-instruction_handler + db 'cos~~sm',0x00 + dw ARM_instruction_cossm-instruction_handler + db 'cos~~sp',0x00 + dw ARM_instruction_cossp-instruction_handler + db 'cos~~sz',0x00 + dw ARM_instruction_cossz-instruction_handler + db 'cpsid.n',0xf4 + dw ARM_instruction_cpsid-instruction_handler + db 'cpsid.w',0xf2 + dw ARM_instruction_cpsid-instruction_handler + db 'cpsie.n',0xf4 + dw ARM_instruction_cpsie-instruction_handler + db 'cpsie.w',0xf2 + dw ARM_instruction_cpsie-instruction_handler + db 'cpy~~.n',0x04 + dw ARM_instruction_cpy-instruction_handler + db 'cpy~~.w',0x02 + dw ARM_instruction_cpy-instruction_handler + db 'crc32cb',0xf0 + dw ARM_instruction_crc32cb-instruction_handler + db 'crc32ch',0xf0 + dw ARM_instruction_crc32ch-instruction_handler + db 'crc32cw',0xf0 + dw ARM_instruction_crc32cw-instruction_handler + db 'crc32cx',0xf0 + dw ARM_instruction_crc32cx-instruction_handler + db 'display',0x00 + dw display_directive-instruction_handler + db 'dvf~~dm',0x00 + dw ARM_instruction_dvfdm-instruction_handler + db 'dvf~~dp',0x00 + dw ARM_instruction_dvfdp-instruction_handler + db 'dvf~~dz',0x00 + dw ARM_instruction_dvfdz-instruction_handler + db 'dvf~~em',0x00 + dw ARM_instruction_dvfem-instruction_handler + db 'dvf~~ep',0x00 + dw ARM_instruction_dvfep-instruction_handler + db 'dvf~~ez',0x00 + dw ARM_instruction_dvfez-instruction_handler + db 'dvf~~sm',0x00 + dw ARM_instruction_dvfsm-instruction_handler + db 'dvf~~sp',0x00 + dw ARM_instruction_dvfsp-instruction_handler + db 'dvf~~sz',0x00 + dw ARM_instruction_dvfsz-instruction_handler + db 'eor~~.n',0x04 + dw ARM_instruction_eor-instruction_handler + db 'eor~~.w',0x02 + dw ARM_instruction_eor-instruction_handler + db 'exp~~dm',0x00 + dw ARM_instruction_expdm-instruction_handler + db 'exp~~dp',0x00 + dw ARM_instruction_expdp-instruction_handler + db 'exp~~dz',0x00 + dw ARM_instruction_expdz-instruction_handler + db 'exp~~em',0x00 + dw ARM_instruction_expem-instruction_handler + db 'exp~~ep',0x00 + dw ARM_instruction_expep-instruction_handler + db 'exp~~ez',0x00 + dw ARM_instruction_expez-instruction_handler + db 'exp~~sm',0x00 + dw ARM_instruction_expsm-instruction_handler + db 'exp~~sp',0x00 + dw ARM_instruction_expsp-instruction_handler + db 'exp~~sz',0x00 + dw ARM_instruction_expsz-instruction_handler + db 'fabsd~~',0x00 + dw ARM_instruction_fabsd-instruction_handler + db 'fabss~~',0x00 + dw ARM_instruction_fabss-instruction_handler + db 'faddd~~',0x00 + dw ARM_instruction_faddd-instruction_handler + db 'fadds~~',0x00 + dw ARM_instruction_fadds-instruction_handler + db 'fcmpd~~',0x00 + dw ARM_instruction_fcmpd-instruction_handler + db 'fcmpezd',0xe0 + dw ARM_instruction_fcmpezd-instruction_handler + db 'fcmpezs',0xe0 + dw ARM_instruction_fcmpezs-instruction_handler + db 'fcmps~~',0x00 + dw ARM_instruction_fcmps-instruction_handler + db 'fconstd',0xe0 + dw ARM_instruction_fconstd-instruction_handler + db 'fconsts',0xe0 + dw ARM_instruction_fconsts-instruction_handler + db 'fcpyd~~',0x00 + dw ARM_instruction_fcpyd-instruction_handler + db 'fcpys~~',0x00 + dw ARM_instruction_fcpys-instruction_handler + db 'fcvtxn2',0xf0 + dw ARM_instruction_fcvtxn2-instruction_handler + db 'fdivd~~',0x00 + dw ARM_instruction_fdivd-instruction_handler + db 'fdivs~~',0x00 + dw ARM_instruction_fdivs-instruction_handler + db 'fdv~~dm',0x00 + dw ARM_instruction_fdvdm-instruction_handler + db 'fdv~~dp',0x00 + dw ARM_instruction_fdvdp-instruction_handler + db 'fdv~~dz',0x00 + dw ARM_instruction_fdvdz-instruction_handler + db 'fdv~~em',0x00 + dw ARM_instruction_fdvem-instruction_handler + db 'fdv~~ep',0x00 + dw ARM_instruction_fdvep-instruction_handler + db 'fdv~~ez',0x00 + dw ARM_instruction_fdvez-instruction_handler + db 'fdv~~sm',0x00 + dw ARM_instruction_fdvsm-instruction_handler + db 'fdv~~sp',0x00 + dw ARM_instruction_fdvsp-instruction_handler + db 'fdv~~sz',0x00 + dw ARM_instruction_fdvsz-instruction_handler + db 'fldmdbd',0xe0 + dw ARM_instruction_fldmdbd-instruction_handler + db 'fldmdbs',0xe0 + dw ARM_instruction_fldmdbs-instruction_handler + db 'fldmdbx',0xe0 + dw ARM_instruction_fldmdbx-instruction_handler + db 'fldmd~~',0x00 + dw ARM_instruction_fldmd-instruction_handler + db 'fldmead',0xe0 + dw ARM_instruction_fldmead-instruction_handler + db 'fldmeas',0xe0 + dw ARM_instruction_fldmeas-instruction_handler + db 'fldmeax',0xe0 + dw ARM_instruction_fldmeax-instruction_handler + db 'fldmfdd',0xe0 + dw ARM_instruction_fldmfdd-instruction_handler + db 'fldmfds',0xe0 + dw ARM_instruction_fldmfds-instruction_handler + db 'fldmfdx',0xe0 + dw ARM_instruction_fldmfdx-instruction_handler + db 'fldmiad',0xe0 + dw ARM_instruction_fldmiad-instruction_handler + db 'fldmias',0xe0 + dw ARM_instruction_fldmias-instruction_handler + db 'fldmiax',0xe0 + dw ARM_instruction_fldmiax-instruction_handler + db 'fldms~~',0x00 + dw ARM_instruction_fldms-instruction_handler + db 'fldmx~~',0x00 + dw ARM_instruction_fldmx-instruction_handler + db 'flt~~dm',0x00 + dw ARM_instruction_fltdm-instruction_handler + db 'flt~~dp',0x00 + dw ARM_instruction_fltdp-instruction_handler + db 'flt~~dz',0x00 + dw ARM_instruction_fltdz-instruction_handler + db 'flt~~em',0x00 + dw ARM_instruction_fltem-instruction_handler + db 'flt~~ep',0x00 + dw ARM_instruction_fltep-instruction_handler + db 'flt~~ez',0x00 + dw ARM_instruction_fltez-instruction_handler + db 'flt~~sm',0x00 + dw ARM_instruction_fltsm-instruction_handler + db 'flt~~sp',0x00 + dw ARM_instruction_fltsp-instruction_handler + db 'flt~~sz',0x00 + dw ARM_instruction_fltsz-instruction_handler + db 'fmacd~~',0x00 + dw ARM_instruction_fmacd-instruction_handler + db 'fmacs~~',0x00 + dw ARM_instruction_fmacs-instruction_handler + db 'fmaxnmp',0xf0 + dw ARM_instruction_fmaxnmp-instruction_handler + db 'fmaxnmv',0xf0 + dw ARM_instruction_fmaxnmv-instruction_handler + db 'fmdhr~~',0x00 + dw ARM_instruction_fmdhr-instruction_handler + db 'fmdlr~~',0x00 + dw ARM_instruction_fmdlr-instruction_handler + db 'fmdrr~~',0x00 + dw ARM_instruction_fmdrr-instruction_handler + db 'fminnmp',0xf0 + dw ARM_instruction_fminnmp-instruction_handler + db 'fminnmv',0xf0 + dw ARM_instruction_fminnmv-instruction_handler + db 'fml~~dm',0x00 + dw ARM_instruction_fmldm-instruction_handler + db 'fml~~dp',0x00 + dw ARM_instruction_fmldp-instruction_handler + db 'fml~~dz',0x00 + dw ARM_instruction_fmldz-instruction_handler + db 'fml~~em',0x00 + dw ARM_instruction_fmlem-instruction_handler + db 'fml~~ep',0x00 + dw ARM_instruction_fmlep-instruction_handler + db 'fml~~ez',0x00 + dw ARM_instruction_fmlez-instruction_handler + db 'fml~~sm',0x00 + dw ARM_instruction_fmlsm-instruction_handler + db 'fml~~sp',0x00 + dw ARM_instruction_fmlsp-instruction_handler + db 'fml~~sz',0x00 + dw ARM_instruction_fmlsz-instruction_handler + db 'fmrdh~~',0x00 + dw ARM_instruction_fmrdh-instruction_handler + db 'fmrdl~~',0x00 + dw ARM_instruction_fmrdl-instruction_handler + db 'fmrrd~~',0x00 + dw ARM_instruction_fmrrd-instruction_handler + db 'fmrrs~~',0x00 + dw ARM_instruction_fmrrs-instruction_handler + db 'fmscd~~',0x00 + dw ARM_instruction_fmscd-instruction_handler + db 'fmscs~~',0x00 + dw ARM_instruction_fmscs-instruction_handler + db 'fmsrr~~',0x00 + dw ARM_instruction_fmsrr-instruction_handler + db 'fmuld~~',0x00 + dw ARM_instruction_fmuld-instruction_handler + db 'fmuls~~',0x00 + dw ARM_instruction_fmuls-instruction_handler + db 'fnegd~~',0x00 + dw ARM_instruction_fnegd-instruction_handler + db 'fnegs~~',0x00 + dw ARM_instruction_fnegs-instruction_handler + db 'frd~~dm',0x00 + dw ARM_instruction_frddm-instruction_handler + db 'frd~~dp',0x00 + dw ARM_instruction_frddp-instruction_handler + db 'frd~~dz',0x00 + dw ARM_instruction_frddz-instruction_handler + db 'frd~~em',0x00 + dw ARM_instruction_frdem-instruction_handler + db 'frd~~ep',0x00 + dw ARM_instruction_frdep-instruction_handler + db 'frd~~ez',0x00 + dw ARM_instruction_frdez-instruction_handler + db 'frd~~sm',0x00 + dw ARM_instruction_frdsm-instruction_handler + db 'frd~~sp',0x00 + dw ARM_instruction_frdsp-instruction_handler + db 'frd~~sz',0x00 + dw ARM_instruction_frdsz-instruction_handler + db 'frsqrte',0xf0 + dw ARM_instruction_frsqrte-instruction_handler + db 'frsqrts',0xf0 + dw ARM_instruction_frsqrts-instruction_handler + db 'fstmdbd',0xe0 + dw ARM_instruction_fstmdbd-instruction_handler + db 'fstmdbs',0xe0 + dw ARM_instruction_fstmdbs-instruction_handler + db 'fstmdbx',0xe0 + dw ARM_instruction_fstmdbx-instruction_handler + db 'fstmd~~',0x00 + dw ARM_instruction_fstmd-instruction_handler + db 'fstmead',0xe0 + dw ARM_instruction_fstmead-instruction_handler + db 'fstmeas',0xe0 + dw ARM_instruction_fstmeas-instruction_handler + db 'fstmeax',0xe0 + dw ARM_instruction_fstmeax-instruction_handler + db 'fstmfdd',0xe0 + dw ARM_instruction_fstmfdd-instruction_handler + db 'fstmfds',0xe0 + dw ARM_instruction_fstmfds-instruction_handler + db 'fstmfdx',0xe0 + dw ARM_instruction_fstmfdx-instruction_handler + db 'fstmiad',0xe0 + dw ARM_instruction_fstmiad-instruction_handler + db 'fstmias',0xe0 + dw ARM_instruction_fstmias-instruction_handler + db 'fstmiax',0xe0 + dw ARM_instruction_fstmiax-instruction_handler + db 'fstms~~',0x00 + dw ARM_instruction_fstms-instruction_handler + db 'fstmx~~',0x00 + dw ARM_instruction_fstmx-instruction_handler + db 'fsubd~~',0x00 + dw ARM_instruction_fsubd-instruction_handler + db 'fsubs~~',0x00 + dw ARM_instruction_fsubs-instruction_handler + db 'ftosizd',0xe0 + dw ARM_instruction_ftosizd-instruction_handler + db 'ftosizs',0xe0 + dw ARM_instruction_ftosizs-instruction_handler + db 'ftouizd',0xe0 + dw ARM_instruction_ftouizd-instruction_handler + db 'ftouizs',0xe0 + dw ARM_instruction_ftouizs-instruction_handler + db 'ldaex~~',0x00 + dw ARM_instruction_ldaex-instruction_handler + db 'ldc2l~~',0x00 + dw ARM_instruction_ldc2l-instruction_handler + db 'ldmda~~',0x00 + dw ARM_instruction_ldmda-instruction_handler + db 'ldmdb~~',0x00 + dw ARM_instruction_ldmdb-instruction_handler + db 'ldmea~~',0x00 + dw ARM_instruction_ldmea-instruction_handler + db 'ldmed~~',0x00 + dw ARM_instruction_ldmed-instruction_handler + db 'ldmfa~~',0x00 + dw ARM_instruction_ldmfa-instruction_handler + db 'ldmfd.n',0xe4 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmfd.w',0xe2 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmfd~~',0x00 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmia.n',0xe4 + dw ARM_instruction_ldmia-instruction_handler + db 'ldmia.w',0xe2 + dw ARM_instruction_ldmia-instruction_handler + db 'ldmia~~',0x00 + dw ARM_instruction_ldmia-instruction_handler + db 'ldmib~~',0x00 + dw ARM_instruction_ldmib-instruction_handler + db 'ldm~~.n',0x04 + dw ARM_instruction_ldm-instruction_handler + db 'ldm~~.w',0x02 + dw ARM_instruction_ldm-instruction_handler + db 'ldm~~da',0x00 + dw ARM_instruction_ldmda-instruction_handler + db 'ldm~~db',0x00 + dw ARM_instruction_ldmdb-instruction_handler + db 'ldm~~ea',0x00 + dw ARM_instruction_ldmea-instruction_handler + db 'ldm~~ed',0x00 + dw ARM_instruction_ldmed-instruction_handler + db 'ldm~~fa',0x00 + dw ARM_instruction_ldmfa-instruction_handler + db 'ldm~~fd',0x00 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldm~~ia',0x00 + dw ARM_instruction_ldmia-instruction_handler + db 'ldm~~ib',0x00 + dw ARM_instruction_ldmib-instruction_handler + db 'ldrbt~~',0x00 + dw ARM_instruction_ldrbt-instruction_handler + db 'ldrex~~',0x00 + dw ARM_instruction_ldrex-instruction_handler + db 'ldrht~~',0x00 + dw ARM_instruction_ldrht-instruction_handler + db 'ldrsb.n',0xe4 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsb.w',0xe2 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsb~~',0x00 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsh.n',0xe4 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldrsh.w',0xe2 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldrsh~~',0x00 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldr~~.n',0x04 + dw ARM_instruction_ldr-instruction_handler + db 'ldr~~.w',0x02 + dw ARM_instruction_ldr-instruction_handler + db 'ldr~~bt',0x00 + dw ARM_instruction_ldrbt-instruction_handler + db 'ldr~~ht',0x00 + dw ARM_instruction_ldrht-instruction_handler + db 'ldr~~sb',0x00 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldr~~sh',0x00 + dw ARM_instruction_ldrsh-instruction_handler + db 'lfm~~ea',0x00 + dw ARM_instruction_lfmea-instruction_handler + db 'lfm~~fd',0x00 + dw ARM_instruction_lfmfd-instruction_handler + db 'lgn~~dm',0x00 + dw ARM_instruction_lgndm-instruction_handler + db 'lgn~~dp',0x00 + dw ARM_instruction_lgndp-instruction_handler + db 'lgn~~dz',0x00 + dw ARM_instruction_lgndz-instruction_handler + db 'lgn~~em',0x00 + dw ARM_instruction_lgnem-instruction_handler + db 'lgn~~ep',0x00 + dw ARM_instruction_lgnep-instruction_handler + db 'lgn~~ez',0x00 + dw ARM_instruction_lgnez-instruction_handler + db 'lgn~~sm',0x00 + dw ARM_instruction_lgnsm-instruction_handler + db 'lgn~~sp',0x00 + dw ARM_instruction_lgnsp-instruction_handler + db 'lgn~~sz',0x00 + dw ARM_instruction_lgnsz-instruction_handler + db 'log~~dm',0x00 + dw ARM_instruction_logdm-instruction_handler + db 'log~~dp',0x00 + dw ARM_instruction_logdp-instruction_handler + db 'log~~dz',0x00 + dw ARM_instruction_logdz-instruction_handler + db 'log~~em',0x00 + dw ARM_instruction_logem-instruction_handler + db 'log~~ep',0x00 + dw ARM_instruction_logep-instruction_handler + db 'log~~ez',0x00 + dw ARM_instruction_logez-instruction_handler + db 'log~~sm',0x00 + dw ARM_instruction_logsm-instruction_handler + db 'log~~sp',0x00 + dw ARM_instruction_logsp-instruction_handler + db 'log~~sz',0x00 + dw ARM_instruction_logsz-instruction_handler + db 'lsl~~.n',0x04 + dw ARM_instruction_lsl-instruction_handler + db 'lsl~~.w',0x02 + dw ARM_instruction_lsl-instruction_handler + db 'lsr~~.n',0x04 + dw ARM_instruction_lsr-instruction_handler + db 'lsr~~.w',0x02 + dw ARM_instruction_lsr-instruction_handler + db 'mcrr2~~',0x00 + dw ARM_instruction_mcrr2-instruction_handler + db 'miabb~~',0x00 + dw ARM_instruction_miabb-instruction_handler + db 'miabt~~',0x00 + dw ARM_instruction_miabt-instruction_handler + db 'miaph~~',0x00 + dw ARM_instruction_miaph-instruction_handler + db 'miatb~~',0x00 + dw ARM_instruction_miatb-instruction_handler + db 'miatt~~',0x00 + dw ARM_instruction_miatt-instruction_handler + db 'mnf~~dm',0x00 + dw ARM_instruction_mnfdm-instruction_handler + db 'mnf~~dp',0x00 + dw ARM_instruction_mnfdp-instruction_handler + db 'mnf~~dz',0x00 + dw ARM_instruction_mnfdz-instruction_handler + db 'mnf~~em',0x00 + dw ARM_instruction_mnfem-instruction_handler + db 'mnf~~ep',0x00 + dw ARM_instruction_mnfep-instruction_handler + db 'mnf~~ez',0x00 + dw ARM_instruction_mnfez-instruction_handler + db 'mnf~~sm',0x00 + dw ARM_instruction_mnfsm-instruction_handler + db 'mnf~~sp',0x00 + dw ARM_instruction_mnfsp-instruction_handler + db 'mnf~~sz',0x00 + dw ARM_instruction_mnfsz-instruction_handler + db 'mov~~.n',0x04 + dw ARM_instruction_mov-instruction_handler + db 'mov~~.w',0x02 + dw ARM_instruction_mov-instruction_handler + db 'mrrc2~~',0x00 + dw ARM_instruction_mrrc2-instruction_handler + db 'muf~~dm',0x00 + dw ARM_instruction_mufdm-instruction_handler + db 'muf~~dp',0x00 + dw ARM_instruction_mufdp-instruction_handler + db 'muf~~dz',0x00 + dw ARM_instruction_mufdz-instruction_handler + db 'muf~~em',0x00 + dw ARM_instruction_mufem-instruction_handler + db 'muf~~ep',0x00 + dw ARM_instruction_mufep-instruction_handler + db 'muf~~ez',0x00 + dw ARM_instruction_mufez-instruction_handler + db 'muf~~sm',0x00 + dw ARM_instruction_mufsm-instruction_handler + db 'muf~~sp',0x00 + dw ARM_instruction_mufsp-instruction_handler + db 'muf~~sz',0x00 + dw ARM_instruction_mufsz-instruction_handler + db 'mul~~.n',0x04 + dw ARM_instruction_mul-instruction_handler + db 'mul~~.w',0x02 + dw ARM_instruction_mul-instruction_handler + db 'mvf~~dm',0x00 + dw ARM_instruction_mvfdm-instruction_handler + db 'mvf~~dp',0x00 + dw ARM_instruction_mvfdp-instruction_handler + db 'mvf~~dz',0x00 + dw ARM_instruction_mvfdz-instruction_handler + db 'mvf~~em',0x00 + dw ARM_instruction_mvfem-instruction_handler + db 'mvf~~ep',0x00 + dw ARM_instruction_mvfep-instruction_handler + db 'mvf~~ez',0x00 + dw ARM_instruction_mvfez-instruction_handler + db 'mvf~~sm',0x00 + dw ARM_instruction_mvfsm-instruction_handler + db 'mvf~~sp',0x00 + dw ARM_instruction_mvfsp-instruction_handler + db 'mvf~~sz',0x00 + dw ARM_instruction_mvfsz-instruction_handler + db 'mvn~~.n',0x04 + dw ARM_instruction_mvn-instruction_handler + db 'mvn~~.w',0x02 + dw ARM_instruction_mvn-instruction_handler + db 'neg~~.n',0x04 + dw ARM_instruction_neg-instruction_handler + db 'neg~~.w',0x02 + dw ARM_instruction_neg-instruction_handler + db 'nop~~.n',0x04 + dw ARM_instruction_nop-instruction_handler + db 'nop~~.w',0x02 + dw ARM_instruction_nop-instruction_handler + db 'nrm~~dm',0x00 + dw ARM_instruction_nrmdm-instruction_handler + db 'nrm~~dp',0x00 + dw ARM_instruction_nrmdp-instruction_handler + db 'nrm~~dz',0x00 + dw ARM_instruction_nrmdz-instruction_handler + db 'nrm~~em',0x00 + dw ARM_instruction_nrmem-instruction_handler + db 'nrm~~ep',0x00 + dw ARM_instruction_nrmep-instruction_handler + db 'nrm~~ez',0x00 + dw ARM_instruction_nrmez-instruction_handler + db 'nrm~~sm',0x00 + dw ARM_instruction_nrmsm-instruction_handler + db 'nrm~~sp',0x00 + dw ARM_instruction_nrmsp-instruction_handler + db 'nrm~~sz',0x00 + dw ARM_instruction_nrmsz-instruction_handler + db 'orr~~.n',0x04 + dw ARM_instruction_orr-instruction_handler + db 'orr~~.w',0x02 + dw ARM_instruction_orr-instruction_handler + db 'pkhbt~~',0x00 + dw ARM_instruction_pkhbt-instruction_handler + db 'pkhtb~~',0x00 + dw ARM_instruction_pkhtb-instruction_handler + db 'pol~~dm',0x00 + dw ARM_instruction_poldm-instruction_handler + db 'pol~~dp',0x00 + dw ARM_instruction_poldp-instruction_handler + db 'pol~~dz',0x00 + dw ARM_instruction_poldz-instruction_handler + db 'pol~~em',0x00 + dw ARM_instruction_polem-instruction_handler + db 'pol~~ep',0x00 + dw ARM_instruction_polep-instruction_handler + db 'pol~~ez',0x00 + dw ARM_instruction_polez-instruction_handler + db 'pol~~sm',0x00 + dw ARM_instruction_polsm-instruction_handler + db 'pol~~sp',0x00 + dw ARM_instruction_polsp-instruction_handler + db 'pol~~sz',0x00 + dw ARM_instruction_polsz-instruction_handler + db 'pop~~.n',0x04 + dw ARM_instruction_pop-instruction_handler + db 'pop~~.w',0x02 + dw ARM_instruction_pop-instruction_handler + db 'pow~~dm',0x00 + dw ARM_instruction_powdm-instruction_handler + db 'pow~~dp',0x00 + dw ARM_instruction_powdp-instruction_handler + db 'pow~~dz',0x00 + dw ARM_instruction_powdz-instruction_handler + db 'pow~~em',0x00 + dw ARM_instruction_powem-instruction_handler + db 'pow~~ep',0x00 + dw ARM_instruction_powep-instruction_handler + db 'pow~~ez',0x00 + dw ARM_instruction_powez-instruction_handler + db 'pow~~sm',0x00 + dw ARM_instruction_powsm-instruction_handler + db 'pow~~sp',0x00 + dw ARM_instruction_powsp-instruction_handler + db 'pow~~sz',0x00 + dw ARM_instruction_powsz-instruction_handler + db 'qadd8~~',0x00 + dw ARM_instruction_qadd8-instruction_handler + db 'qdadd~~',0x00 + dw ARM_instruction_qdadd-instruction_handler + db 'qdsub~~',0x00 + dw ARM_instruction_qdsub-instruction_handler + db 'qsub8~~',0x00 + dw ARM_instruction_qsub8-instruction_handler + db 'raddhn2',0xf0 + dw ARM_instruction_raddhn2-instruction_handler + db 'rdf~~dm',0x00 + dw ARM_instruction_rdfdm-instruction_handler + db 'rdf~~dp',0x00 + dw ARM_instruction_rdfdp-instruction_handler + db 'rdf~~dz',0x00 + dw ARM_instruction_rdfdz-instruction_handler + db 'rdf~~em',0x00 + dw ARM_instruction_rdfem-instruction_handler + db 'rdf~~ep',0x00 + dw ARM_instruction_rdfep-instruction_handler + db 'rdf~~ez',0x00 + dw ARM_instruction_rdfez-instruction_handler + db 'rdf~~sm',0x00 + dw ARM_instruction_rdfsm-instruction_handler + db 'rdf~~sp',0x00 + dw ARM_instruction_rdfsp-instruction_handler + db 'rdf~~sz',0x00 + dw ARM_instruction_rdfsz-instruction_handler + db 'rev16.n',0xe4 + dw ARM_instruction_rev16-instruction_handler + db 'rev16.w',0xe2 + dw ARM_instruction_rev16-instruction_handler + db 'rev16~~',0x00 + dw ARM_instruction_rev16-instruction_handler + db 'revsh.n',0xe4 + dw ARM_instruction_revsh-instruction_handler + db 'revsh.w',0xe2 + dw ARM_instruction_revsh-instruction_handler + db 'revsh~~',0x00 + dw ARM_instruction_revsh-instruction_handler + db 'rev~~.n',0x04 + dw ARM_instruction_rev-instruction_handler + db 'rev~~.w',0x02 + dw ARM_instruction_rev-instruction_handler + db 'rmf~~dm',0x00 + dw ARM_instruction_rmfdm-instruction_handler + db 'rmf~~dp',0x00 + dw ARM_instruction_rmfdp-instruction_handler + db 'rmf~~dz',0x00 + dw ARM_instruction_rmfdz-instruction_handler + db 'rmf~~em',0x00 + dw ARM_instruction_rmfem-instruction_handler + db 'rmf~~ep',0x00 + dw ARM_instruction_rmfep-instruction_handler + db 'rmf~~ez',0x00 + dw ARM_instruction_rmfez-instruction_handler + db 'rmf~~sm',0x00 + dw ARM_instruction_rmfsm-instruction_handler + db 'rmf~~sp',0x00 + dw ARM_instruction_rmfsp-instruction_handler + db 'rmf~~sz',0x00 + dw ARM_instruction_rmfsz-instruction_handler + db 'rnd~~dm',0x00 + dw ARM_instruction_rnddm-instruction_handler + db 'rnd~~dp',0x00 + dw ARM_instruction_rnddp-instruction_handler + db 'rnd~~dz',0x00 + dw ARM_instruction_rnddz-instruction_handler + db 'rnd~~em',0x00 + dw ARM_instruction_rndem-instruction_handler + db 'rnd~~ep',0x00 + dw ARM_instruction_rndep-instruction_handler + db 'rnd~~ez',0x00 + dw ARM_instruction_rndez-instruction_handler + db 'rnd~~sm',0x00 + dw ARM_instruction_rndsm-instruction_handler + db 'rnd~~sp',0x00 + dw ARM_instruction_rndsp-instruction_handler + db 'rnd~~sz',0x00 + dw ARM_instruction_rndsz-instruction_handler + db 'ror~~.n',0x04 + dw ARM_instruction_ror-instruction_handler + db 'ror~~.w',0x02 + dw ARM_instruction_ror-instruction_handler + db 'rpw~~dm',0x00 + dw ARM_instruction_rpwdm-instruction_handler + db 'rpw~~dp',0x00 + dw ARM_instruction_rpwdp-instruction_handler + db 'rpw~~dz',0x00 + dw ARM_instruction_rpwdz-instruction_handler + db 'rpw~~em',0x00 + dw ARM_instruction_rpwem-instruction_handler + db 'rpw~~ep',0x00 + dw ARM_instruction_rpwep-instruction_handler + db 'rpw~~ez',0x00 + dw ARM_instruction_rpwez-instruction_handler + db 'rpw~~sm',0x00 + dw ARM_instruction_rpwsm-instruction_handler + db 'rpw~~sp',0x00 + dw ARM_instruction_rpwsp-instruction_handler + db 'rpw~~sz',0x00 + dw ARM_instruction_rpwsz-instruction_handler + db 'rsb~~.n',0x04 + dw ARM_instruction_rsb-instruction_handler + db 'rsb~~.w',0x02 + dw ARM_instruction_rsb-instruction_handler + db 'rsf~~dm',0x00 + dw ARM_instruction_rsfdm-instruction_handler + db 'rsf~~dp',0x00 + dw ARM_instruction_rsfdp-instruction_handler + db 'rsf~~dz',0x00 + dw ARM_instruction_rsfdz-instruction_handler + db 'rsf~~em',0x00 + dw ARM_instruction_rsfem-instruction_handler + db 'rsf~~ep',0x00 + dw ARM_instruction_rsfep-instruction_handler + db 'rsf~~ez',0x00 + dw ARM_instruction_rsfez-instruction_handler + db 'rsf~~sm',0x00 + dw ARM_instruction_rsfsm-instruction_handler + db 'rsf~~sp',0x00 + dw ARM_instruction_rsfsp-instruction_handler + db 'rsf~~sz',0x00 + dw ARM_instruction_rsfsz-instruction_handler + db 'rsubhn2',0xf0 + dw ARM_instruction_rsubhn2-instruction_handler + db 'sadd8~~',0x00 + dw ARM_instruction_sadd8-instruction_handler + db 'sbc~~.n',0x04 + dw ARM_instruction_sbc-instruction_handler + db 'sbc~~.w',0x02 + dw ARM_instruction_sbc-instruction_handler + db 'section',0x00 + dw ARM_section_directive-instruction_handler + db 'segment',0x00 + dw segment_directive-instruction_handler + db 'sev~~.n',0x04 + dw ARM_instruction_sev-instruction_handler + db 'sev~~.w',0x02 + dw ARM_instruction_sev-instruction_handler + db 'sfm~~ea',0x00 + dw ARM_instruction_sfmea-instruction_handler + db 'sfm~~fd',0x00 + dw ARM_instruction_sfmfd-instruction_handler + db 'sha1su0',0xf0 + dw ARM_instruction_sha1su0-instruction_handler + db 'sha1su1',0xf0 + dw ARM_instruction_sha1su1-instruction_handler + db 'sha256h',0xf0 + dw ARM_instruction_sha256h-instruction_handler + db 'shadd16',0xe0 + dw ARM_instruction_shadd16-instruction_handler + db 'shasx~~',0x00 + dw ARM_instruction_shasx-instruction_handler + db 'shsax~~',0x00 + dw ARM_instruction_shsax-instruction_handler + db 'shsub16',0xe0 + dw ARM_instruction_shsub16-instruction_handler + db 'sin~~dm',0x00 + dw ARM_instruction_sindm-instruction_handler + db 'sin~~dp',0x00 + dw ARM_instruction_sindp-instruction_handler + db 'sin~~dz',0x00 + dw ARM_instruction_sindz-instruction_handler + db 'sin~~em',0x00 + dw ARM_instruction_sinem-instruction_handler + db 'sin~~ep',0x00 + dw ARM_instruction_sinep-instruction_handler + db 'sin~~ez',0x00 + dw ARM_instruction_sinez-instruction_handler + db 'sin~~sm',0x00 + dw ARM_instruction_sinsm-instruction_handler + db 'sin~~sp',0x00 + dw ARM_instruction_sinsp-instruction_handler + db 'sin~~sz',0x00 + dw ARM_instruction_sinsz-instruction_handler + db 'smlad~~',0x00 + dw ARM_instruction_smlad-instruction_handler + db 'smlalbb',0xe0 + dw ARM_instruction_smlalbb-instruction_handler + db 'smlalbt',0xe0 + dw ARM_instruction_smlalbt-instruction_handler + db 'smlaldx',0xe0 + dw ARM_instruction_smlaldx-instruction_handler + db 'smlaltb',0xe0 + dw ARM_instruction_smlaltb-instruction_handler + db 'smlaltt',0xe0 + dw ARM_instruction_smlaltt-instruction_handler + db 'smlal~~',0x00 + dw ARM_instruction_smlal-instruction_handler + db 'smlsd~~',0x00 + dw ARM_instruction_smlsd-instruction_handler + db 'smlsldx',0xe0 + dw ARM_instruction_smlsldx-instruction_handler + db 'smmla~~',0x00 + dw ARM_instruction_smmla-instruction_handler + db 'smmls~~',0x00 + dw ARM_instruction_smmls-instruction_handler + db 'smmul~~',0x00 + dw ARM_instruction_smmul-instruction_handler + db 'smuad~~',0x00 + dw ARM_instruction_smuad-instruction_handler + db 'smull~~',0x00 + dw ARM_instruction_smull-instruction_handler + db 'smusd~~',0x00 + dw ARM_instruction_smusd-instruction_handler + db 'sqdmlal',0xf0 + dw ARM_instruction_sqdmlal-instruction_handler + db 'sqdmlsl',0xf0 + dw ARM_instruction_sqdmlsl-instruction_handler + db 'sqdmulh',0xf0 + dw ARM_instruction_sqdmulh-instruction_handler + db 'sqdmull',0xf0 + dw ARM_instruction_sqdmull-instruction_handler + db 'sqrshrn',0xf0 + dw ARM_instruction_sqrshrn-instruction_handler + db 'sqshrn2',0xf0 + dw ARM_instruction_sqshrn2-instruction_handler + db 'sqshrun',0xf0 + dw ARM_instruction_sqshrun-instruction_handler + db 'sqt~~dm',0x00 + dw ARM_instruction_sqtdm-instruction_handler + db 'sqt~~dp',0x00 + dw ARM_instruction_sqtdp-instruction_handler + db 'sqt~~dz',0x00 + dw ARM_instruction_sqtdz-instruction_handler + db 'sqt~~em',0x00 + dw ARM_instruction_sqtem-instruction_handler + db 'sqt~~ep',0x00 + dw ARM_instruction_sqtep-instruction_handler + db 'sqt~~ez',0x00 + dw ARM_instruction_sqtez-instruction_handler + db 'sqt~~sm',0x00 + dw ARM_instruction_sqtsm-instruction_handler + db 'sqt~~sp',0x00 + dw ARM_instruction_sqtsp-instruction_handler + db 'sqt~~sz',0x00 + dw ARM_instruction_sqtsz-instruction_handler + db 'sqxtun2',0xf0 + dw ARM_instruction_sqxtun2-instruction_handler + db 'ssub8~~',0x00 + dw ARM_instruction_ssub8-instruction_handler + db 'stc2l~~',0x00 + dw ARM_instruction_stc2l-instruction_handler + db 'stlex~~',0x00 + dw ARM_instruction_stlex-instruction_handler + db 'stmda~~',0x00 + dw ARM_instruction_stmda-instruction_handler + db 'stmdb.n',0xe4 + dw ARM_instruction_stmdb-instruction_handler + db 'stmdb.w',0xe2 + dw ARM_instruction_stmdb-instruction_handler + db 'stmdb~~',0x00 + dw ARM_instruction_stmdb-instruction_handler + db 'stmea~~',0x00 + dw ARM_instruction_stmea-instruction_handler + db 'stmed~~',0x00 + dw ARM_instruction_stmed-instruction_handler + db 'stmfa~~',0x00 + dw ARM_instruction_stmfa-instruction_handler + db 'stmfd.n',0xe4 + dw ARM_instruction_stmfd-instruction_handler + db 'stmfd.w',0xe2 + dw ARM_instruction_stmfd-instruction_handler + db 'stmfd~~',0x00 + dw ARM_instruction_stmfd-instruction_handler + db 'stmia.n',0xe4 + dw ARM_instruction_stmia-instruction_handler + db 'stmia.w',0xe2 + dw ARM_instruction_stmia-instruction_handler + db 'stmia~~',0x00 + dw ARM_instruction_stmia-instruction_handler + db 'stmib~~',0x00 + dw ARM_instruction_stmib-instruction_handler + db 'stm~~.n',0x04 + dw ARM_instruction_stm-instruction_handler + db 'stm~~.w',0x02 + dw ARM_instruction_stm-instruction_handler + db 'stm~~da',0x00 + dw ARM_instruction_stmda-instruction_handler + db 'stm~~db',0x00 + dw ARM_instruction_stmdb-instruction_handler + db 'stm~~ea',0x00 + dw ARM_instruction_stmea-instruction_handler + db 'stm~~ed',0x00 + dw ARM_instruction_stmed-instruction_handler + db 'stm~~fa',0x00 + dw ARM_instruction_stmfa-instruction_handler + db 'stm~~fd',0x00 + dw ARM_instruction_stmfd-instruction_handler + db 'stm~~ia',0x00 + dw ARM_instruction_stmia-instruction_handler + db 'stm~~ib',0x00 + dw ARM_instruction_stmib-instruction_handler + db 'strbt~~',0x00 + dw ARM_instruction_strbt-instruction_handler + db 'strex~~',0x00 + dw ARM_instruction_strex-instruction_handler + db 'strht~~',0x00 + dw ARM_instruction_strht-instruction_handler + db 'str~~.n',0x04 + dw ARM_instruction_str-instruction_handler + db 'str~~.w',0x02 + dw ARM_instruction_str-instruction_handler + db 'str~~bt',0x00 + dw ARM_instruction_strbt-instruction_handler + db 'str~~ht',0x00 + dw ARM_instruction_strht-instruction_handler + db 'sub~~.n',0x04 + dw ARM_instruction_sub-instruction_handler + db 'sub~~.w',0x02 + dw ARM_instruction_sub-instruction_handler + db 'suf~~dm',0x00 + dw ARM_instruction_sufdm-instruction_handler + db 'suf~~dp',0x00 + dw ARM_instruction_sufdp-instruction_handler + db 'suf~~dz',0x00 + dw ARM_instruction_sufdz-instruction_handler + db 'suf~~em',0x00 + dw ARM_instruction_sufem-instruction_handler + db 'suf~~ep',0x00 + dw ARM_instruction_sufep-instruction_handler + db 'suf~~ez',0x00 + dw ARM_instruction_sufez-instruction_handler + db 'suf~~sm',0x00 + dw ARM_instruction_sufsm-instruction_handler + db 'suf~~sp',0x00 + dw ARM_instruction_sufsp-instruction_handler + db 'suf~~sz',0x00 + dw ARM_instruction_sufsz-instruction_handler + db 'svc~~.n',0x04 + dw ARM_instruction_svc-instruction_handler + db 'svc~~.w',0x02 + dw ARM_instruction_svc-instruction_handler + db 'swi~~.n',0x04 + dw ARM_instruction_swi-instruction_handler + db 'swi~~.w',0x02 + dw ARM_instruction_swi-instruction_handler + db 'sxtab16',0xe0 + dw ARM_instruction_sxtab16-instruction_handler + db 'sxtab~~',0x00 + dw ARM_instruction_sxtab-instruction_handler + db 'sxtah~~',0x00 + dw ARM_instruction_sxtah-instruction_handler + db 'tan~~dm',0x00 + dw ARM_instruction_tandm-instruction_handler + db 'tan~~dp',0x00 + dw ARM_instruction_tandp-instruction_handler + db 'tan~~dz',0x00 + dw ARM_instruction_tandz-instruction_handler + db 'tan~~em',0x00 + dw ARM_instruction_tanem-instruction_handler + db 'tan~~ep',0x00 + dw ARM_instruction_tanep-instruction_handler + db 'tan~~ez',0x00 + dw ARM_instruction_tanez-instruction_handler + db 'tan~~sm',0x00 + dw ARM_instruction_tansm-instruction_handler + db 'tan~~sp',0x00 + dw ARM_instruction_tansp-instruction_handler + db 'tan~~sz',0x00 + dw ARM_instruction_tansz-instruction_handler + db 'textrcb',0xe0 + dw ARM_instruction_textrcb-instruction_handler + db 'textrch',0xe0 + dw ARM_instruction_textrch-instruction_handler + db 'textrcw',0xe0 + dw ARM_instruction_textrcw-instruction_handler + db 'thumbee',0x00 + dw ARM_thumbee_directive-instruction_handler + db 'tmcrr~~',0x00 + dw ARM_instruction_tmcrr-instruction_handler + db 'tmrrc~~',0x00 + dw ARM_instruction_tmrrc-instruction_handler + db 'torcb~~',0x00 + dw ARM_instruction_torcb-instruction_handler + db 'torch~~',0x00 + dw ARM_instruction_torch-instruction_handler + db 'torcw~~',0x00 + dw ARM_instruction_torcw-instruction_handler + db 'torvscb',0xe0 + dw ARM_instruction_torvscb-instruction_handler + db 'torvsch',0xe0 + dw ARM_instruction_torvsch-instruction_handler + db 'torvscw',0xe0 + dw ARM_instruction_torvscw-instruction_handler + db 'tst~~.n',0x04 + dw ARM_instruction_tst-instruction_handler + db 'tst~~.w',0x02 + dw ARM_instruction_tst-instruction_handler + db 'uadd8~~',0x00 + dw ARM_instruction_uadd8-instruction_handler + db 'uhadd16',0xe0 + dw ARM_instruction_uhadd16-instruction_handler + db 'uhasx~~',0x00 + dw ARM_instruction_uhasx-instruction_handler + db 'uhsax~~',0x00 + dw ARM_instruction_uhsax-instruction_handler + db 'uhsub16',0xe0 + dw ARM_instruction_uhsub16-instruction_handler + db 'umaal~~',0x00 + dw ARM_instruction_umaal-instruction_handler + db 'umlal~~',0x00 + dw ARM_instruction_umlal-instruction_handler + db 'umull~~',0x00 + dw ARM_instruction_umull-instruction_handler + db 'und~~.n',0x04 + dw ARM_instruction_und-instruction_handler + db 'und~~.w',0x02 + dw ARM_instruction_und-instruction_handler + db 'uqadd16',0xe0 + dw ARM_instruction_uqadd16-instruction_handler + db 'uqasx~~',0x00 + dw ARM_instruction_uqasx-instruction_handler + db 'uqrshrn',0xf0 + dw ARM_instruction_uqrshrn-instruction_handler + db 'uqsax~~',0x00 + dw ARM_instruction_uqsax-instruction_handler + db 'uqshrn2',0xf0 + dw ARM_instruction_uqshrn2-instruction_handler + db 'uqsub16',0xe0 + dw ARM_instruction_uqsub16-instruction_handler + db 'urd~~dm',0x00 + dw ARM_instruction_urddm-instruction_handler + db 'urd~~dp',0x00 + dw ARM_instruction_urddp-instruction_handler + db 'urd~~dz',0x00 + dw ARM_instruction_urddz-instruction_handler + db 'urd~~em',0x00 + dw ARM_instruction_urdem-instruction_handler + db 'urd~~ep',0x00 + dw ARM_instruction_urdep-instruction_handler + db 'urd~~ez',0x00 + dw ARM_instruction_urdez-instruction_handler + db 'urd~~sm',0x00 + dw ARM_instruction_urdsm-instruction_handler + db 'urd~~sp',0x00 + dw ARM_instruction_urdsp-instruction_handler + db 'urd~~sz',0x00 + dw ARM_instruction_urdsz-instruction_handler + db 'ursqrte',0xf0 + dw ARM_instruction_ursqrte-instruction_handler + db 'usad8~~',0x00 + dw ARM_instruction_usad8-instruction_handler + db 'usub8~~',0x00 + dw ARM_instruction_usub8-instruction_handler + db 'uxtab16',0xe0 + dw ARM_instruction_uxtab16-instruction_handler + db 'uxtab~~',0x00 + dw ARM_instruction_uxtab-instruction_handler + db 'uxtah~~',0x00 + dw ARM_instruction_uxtah-instruction_handler + db 'vaba.s8',0xe0 + dw ARM_instruction_vaba.s8-instruction_handler + db 'vaba.u8',0xe0 + dw ARM_instruction_vaba.u8-instruction_handler + db 'vabd.s8',0xe0 + dw ARM_instruction_vabd.s8-instruction_handler + db 'vabd.u8',0xe0 + dw ARM_instruction_vabd.u8-instruction_handler + db 'vabs.s8',0xe0 + dw ARM_instruction_vabs.s8-instruction_handler + db 'vadd.i8',0xe0 + dw ARM_instruction_vadd.i8-instruction_handler + db 'vceq.i8',0xe0 + dw ARM_instruction_vceq.i8-instruction_handler + db 'vcge.s8',0xe0 + dw ARM_instruction_vcge.s8-instruction_handler + db 'vcge.u8',0xe0 + dw ARM_instruction_vcge.u8-instruction_handler + db 'vcgt.s8',0xe0 + dw ARM_instruction_vcgt.s8-instruction_handler + db 'vcgt.u8',0xe0 + dw ARM_instruction_vcgt.u8-instruction_handler + db 'vcle.s8',0xe0 + dw ARM_instruction_vcle.s8-instruction_handler + db 'vcle.u8',0xe0 + dw ARM_instruction_vcle.u8-instruction_handler + db 'vcls.s8',0xe0 + dw ARM_instruction_vcls.s8-instruction_handler + db 'vclt.s8',0xe0 + dw ARM_instruction_vclt.s8-instruction_handler + db 'vclt.u8',0xe0 + dw ARM_instruction_vclt.u8-instruction_handler + db 'vclz.i8',0xe0 + dw ARM_instruction_vclz.i8-instruction_handler + db 'vdup.16',0xe0 + dw ARM_instruction_vdup.16-instruction_handler + db 'vdup.32',0xe0 + dw ARM_instruction_vdup.32-instruction_handler + db 'vext.16',0xe0 + dw ARM_instruction_vext.16-instruction_handler + db 'vext.32',0xe0 + dw ARM_instruction_vext.32-instruction_handler + db 'vext.64',0xe0 + dw ARM_instruction_vext.64-instruction_handler + db 'virtual',0x00 + dw virtual_directive-instruction_handler + db 'vld1.16',0xe0 + dw ARM_instruction_vld1.16-instruction_handler + db 'vld1.32',0xe0 + dw ARM_instruction_vld1.32-instruction_handler + db 'vld1.64',0xe0 + dw ARM_instruction_vld1.64-instruction_handler + db 'vld2.16',0xe0 + dw ARM_instruction_vld2.16-instruction_handler + db 'vld2.32',0xe0 + dw ARM_instruction_vld2.32-instruction_handler + db 'vld3.16',0xe0 + dw ARM_instruction_vld3.16-instruction_handler + db 'vld3.32',0xe0 + dw ARM_instruction_vld3.32-instruction_handler + db 'vld4.16',0xe0 + dw ARM_instruction_vld4.16-instruction_handler + db 'vld4.32',0xe0 + dw ARM_instruction_vld4.32-instruction_handler + db 'vldm.32',0xe0 + dw ARM_instruction_vldm.32-instruction_handler + db 'vldm.64',0xe0 + dw ARM_instruction_vldm.64-instruction_handler + db 'vldr.32',0xe0 + dw ARM_instruction_vldr.32-instruction_handler + db 'vldr.64',0xe0 + dw ARM_instruction_vldr.64-instruction_handler + db 'vmax.s8',0xe0 + dw ARM_instruction_vmax.s8-instruction_handler + db 'vmax.u8',0xe0 + dw ARM_instruction_vmax.u8-instruction_handler + db 'vmin.s8',0xe0 + dw ARM_instruction_vmin.s8-instruction_handler + db 'vmin.u8',0xe0 + dw ARM_instruction_vmin.u8-instruction_handler + db 'vmla.i8',0xe0 + dw ARM_instruction_vmla.i8-instruction_handler + db 'vmla.s8',0xe0 + dw ARM_instruction_vmla.s8-instruction_handler + db 'vmla.u8',0xe0 + dw ARM_instruction_vmla.u8-instruction_handler + db 'vmls.i8',0xe0 + dw ARM_instruction_vmls.i8-instruction_handler + db 'vmls.s8',0xe0 + dw ARM_instruction_vmls.s8-instruction_handler + db 'vmls.u8',0xe0 + dw ARM_instruction_vmls.u8-instruction_handler + db 'vmov.16',0xe0 + dw ARM_instruction_vmov.16-instruction_handler + db 'vmov.32',0xe0 + dw ARM_instruction_vmov.32-instruction_handler + db 'vmov.i8',0xe0 + dw ARM_instruction_vmov.i8-instruction_handler + db 'vmov.s8',0xe0 + dw ARM_instruction_vmov.s8-instruction_handler + db 'vmov.u8',0xe0 + dw ARM_instruction_vmov.u8-instruction_handler + db 'vmul.i8',0xe0 + dw ARM_instruction_vmul.i8-instruction_handler + db 'vmul.p8',0xe0 + dw ARM_instruction_vmul.p8-instruction_handler + db 'vmul.s8',0xe0 + dw ARM_instruction_vmul.s8-instruction_handler + db 'vmul.u8',0xe0 + dw ARM_instruction_vmul.u8-instruction_handler + db 'vneg.s8',0xe0 + dw ARM_instruction_vneg.s8-instruction_handler + db 'vpop.32',0xe0 + dw ARM_instruction_vpop.32-instruction_handler + db 'vpop.64',0xe0 + dw ARM_instruction_vpop.64-instruction_handler + db 'vpush~~',0x00 + dw ARM_instruction_vpush-instruction_handler + db 'vshl.i8',0xe0 + dw ARM_instruction_vshl.i8-instruction_handler + db 'vshl.s8',0xe0 + dw ARM_instruction_vshl.s8-instruction_handler + db 'vshl.u8',0xe0 + dw ARM_instruction_vshl.u8-instruction_handler + db 'vshr.s8',0xe0 + dw ARM_instruction_vshr.s8-instruction_handler + db 'vshr.u8',0xe0 + dw ARM_instruction_vshr.u8-instruction_handler + db 'vsli.16',0xe0 + dw ARM_instruction_vsli.16-instruction_handler + db 'vsli.32',0xe0 + dw ARM_instruction_vsli.32-instruction_handler + db 'vsli.64',0xe0 + dw ARM_instruction_vsli.64-instruction_handler + db 'vsra.s8',0xe0 + dw ARM_instruction_vsra.s8-instruction_handler + db 'vsra.u8',0xe0 + dw ARM_instruction_vsra.u8-instruction_handler + db 'vsri.16',0xe0 + dw ARM_instruction_vsri.16-instruction_handler + db 'vsri.32',0xe0 + dw ARM_instruction_vsri.32-instruction_handler + db 'vsri.64',0xe0 + dw ARM_instruction_vsri.64-instruction_handler + db 'vst1.16',0xe0 + dw ARM_instruction_vst1.16-instruction_handler + db 'vst1.32',0xe0 + dw ARM_instruction_vst1.32-instruction_handler + db 'vst1.64',0xe0 + dw ARM_instruction_vst1.64-instruction_handler + db 'vst2.16',0xe0 + dw ARM_instruction_vst2.16-instruction_handler + db 'vst2.32',0xe0 + dw ARM_instruction_vst2.32-instruction_handler + db 'vst3.16',0xe0 + dw ARM_instruction_vst3.16-instruction_handler + db 'vst3.32',0xe0 + dw ARM_instruction_vst3.32-instruction_handler + db 'vst4.16',0xe0 + dw ARM_instruction_vst4.16-instruction_handler + db 'vst4.32',0xe0 + dw ARM_instruction_vst4.32-instruction_handler + db 'vstm.32',0xe0 + dw ARM_instruction_vstm.32-instruction_handler + db 'vstm.64',0xe0 + dw ARM_instruction_vstm.64-instruction_handler + db 'vstr.32',0xe0 + dw ARM_instruction_vstr.32-instruction_handler + db 'vstr.64',0xe0 + dw ARM_instruction_vstr.64-instruction_handler + db 'vsub.i8',0xe0 + dw ARM_instruction_vsub.i8-instruction_handler + db 'vtrn.16',0xe0 + dw ARM_instruction_vtrn.16-instruction_handler + db 'vtrn.32',0xe0 + dw ARM_instruction_vtrn.32-instruction_handler + db 'vtst.16',0xe0 + dw ARM_instruction_vtst.16-instruction_handler + db 'vtst.32',0xe0 + dw ARM_instruction_vtst.32-instruction_handler + db 'vuzp.16',0xe0 + dw ARM_instruction_vuzp.16-instruction_handler + db 'vuzp.32',0xe0 + dw ARM_instruction_vuzp.32-instruction_handler + db 'vzip.16',0xe0 + dw ARM_instruction_vzip.16-instruction_handler + db 'vzip.32',0xe0 + dw ARM_instruction_vzip.32-instruction_handler + db 'wabsb~~',0x00 + dw ARM_instruction_wabsb-instruction_handler + db 'wabsh~~',0x00 + dw ARM_instruction_wabsh-instruction_handler + db 'wabsw~~',0x00 + dw ARM_instruction_wabsw-instruction_handler + db 'waccb~~',0x00 + dw ARM_instruction_waccb-instruction_handler + db 'wacch~~',0x00 + dw ARM_instruction_wacch-instruction_handler + db 'waccw~~',0x00 + dw ARM_instruction_waccw-instruction_handler + db 'waddbss',0xe0 + dw ARM_instruction_waddbss-instruction_handler + db 'waddbus',0xe0 + dw ARM_instruction_waddbus-instruction_handler + db 'waddb~~',0x00 + dw ARM_instruction_waddb-instruction_handler + db 'waddhss',0xe0 + dw ARM_instruction_waddhss-instruction_handler + db 'waddhus',0xe0 + dw ARM_instruction_waddhus-instruction_handler + db 'waddh~~',0x00 + dw ARM_instruction_waddh-instruction_handler + db 'waddwss',0xe0 + dw ARM_instruction_waddwss-instruction_handler + db 'waddwus',0xe0 + dw ARM_instruction_waddwus-instruction_handler + db 'waddw~~',0x00 + dw ARM_instruction_waddw-instruction_handler + db 'waligni',0xe0 + dw ARM_instruction_waligni-instruction_handler + db 'wandn~~',0x00 + dw ARM_instruction_wandn-instruction_handler + db 'wavg2br',0xe0 + dw ARM_instruction_wavg2br-instruction_handler + db 'wavg2hr',0xe0 + dw ARM_instruction_wavg2hr-instruction_handler + db 'wavg4~~',0x00 + dw ARM_instruction_wavg4-instruction_handler + db 'wcmpeqb',0xe0 + dw ARM_instruction_wcmpeqb-instruction_handler + db 'wcmpeqh',0xe0 + dw ARM_instruction_wcmpeqh-instruction_handler + db 'wcmpeqw',0xe0 + dw ARM_instruction_wcmpeqw-instruction_handler + db 'wfe~~.n',0x04 + dw ARM_instruction_wfe-instruction_handler + db 'wfe~~.w',0x02 + dw ARM_instruction_wfe-instruction_handler + db 'wfi~~.n',0x04 + dw ARM_instruction_wfi-instruction_handler + db 'wfi~~.w',0x02 + dw ARM_instruction_wfi-instruction_handler + db 'wldrb~~',0x00 + dw ARM_instruction_wldrb-instruction_handler + db 'wldrd~~',0x00 + dw ARM_instruction_wldrd-instruction_handler + db 'wldrh~~',0x00 + dw ARM_instruction_wldrh-instruction_handler + db 'wldrw~~',0x00 + dw ARM_instruction_wldrw-instruction_handler + db 'wmacs~~',0x00 + dw ARM_instruction_wmacs-instruction_handler + db 'wmacu~~',0x00 + dw ARM_instruction_wmacu-instruction_handler + db 'wmaddsn',0xe0 + dw ARM_instruction_wmaddsn-instruction_handler + db 'wmaddsx',0xe0 + dw ARM_instruction_wmaddsx-instruction_handler + db 'wmaddun',0xe0 + dw ARM_instruction_wmaddun-instruction_handler + db 'wmaddux',0xe0 + dw ARM_instruction_wmaddux-instruction_handler + db 'wmiabbn',0xe0 + dw ARM_instruction_wmiabbn-instruction_handler + db 'wmiabtn',0xe0 + dw ARM_instruction_wmiabtn-instruction_handler + db 'wmiatbn',0xe0 + dw ARM_instruction_wmiatbn-instruction_handler + db 'wmiattn',0xe0 + dw ARM_instruction_wmiattn-instruction_handler + db 'wmiawbb',0xe0 + dw ARM_instruction_wmiawbb-instruction_handler + db 'wmiawbt',0xe0 + dw ARM_instruction_wmiawbt-instruction_handler + db 'wmiawtb',0xe0 + dw ARM_instruction_wmiawtb-instruction_handler + db 'wmiawtt',0xe0 + dw ARM_instruction_wmiawtt-instruction_handler + db 'wmulsmr',0xe0 + dw ARM_instruction_wmulsmr-instruction_handler + db 'wmulumr',0xe0 + dw ARM_instruction_wmulumr-instruction_handler + db 'wmulwsm',0xe0 + dw ARM_instruction_wmulwsm-instruction_handler + db 'wmulwum',0xe0 + dw ARM_instruction_wmulwum-instruction_handler + db 'wqmiabb',0xe0 + dw ARM_instruction_wqmiabb-instruction_handler + db 'wqmiabt',0xe0 + dw ARM_instruction_wqmiabt-instruction_handler + db 'wqmiatb',0xe0 + dw ARM_instruction_wqmiatb-instruction_handler + db 'wqmiatt',0xe0 + dw ARM_instruction_wqmiatt-instruction_handler + db 'wqmulmr',0xe0 + dw ARM_instruction_wqmulmr-instruction_handler + db 'wqmulwm',0xe0 + dw ARM_instruction_wqmulwm-instruction_handler + db 'wrord~~',0x00 + dw ARM_instruction_wrord-instruction_handler + db 'wrorh~~',0x00 + dw ARM_instruction_wrorh-instruction_handler + db 'wrorw~~',0x00 + dw ARM_instruction_wrorw-instruction_handler + db 'wsadb~~',0x00 + dw ARM_instruction_wsadb-instruction_handler + db 'wsadh~~',0x00 + dw ARM_instruction_wsadh-instruction_handler + db 'wslld~~',0x00 + dw ARM_instruction_wslld-instruction_handler + db 'wsllh~~',0x00 + dw ARM_instruction_wsllh-instruction_handler + db 'wsllw~~',0x00 + dw ARM_instruction_wsllw-instruction_handler + db 'wsrad~~',0x00 + dw ARM_instruction_wsrad-instruction_handler + db 'wsrah~~',0x00 + dw ARM_instruction_wsrah-instruction_handler + db 'wsraw~~',0x00 + dw ARM_instruction_wsraw-instruction_handler + db 'wsrld~~',0x00 + dw ARM_instruction_wsrld-instruction_handler + db 'wsrlh~~',0x00 + dw ARM_instruction_wsrlh-instruction_handler + db 'wsrlw~~',0x00 + dw ARM_instruction_wsrlw-instruction_handler + db 'wstrb~~',0x00 + dw ARM_instruction_wstrb-instruction_handler + db 'wstrd~~',0x00 + dw ARM_instruction_wstrd-instruction_handler + db 'wstrh~~',0x00 + dw ARM_instruction_wstrh-instruction_handler + db 'wstrw~~',0x00 + dw ARM_instruction_wstrw-instruction_handler + db 'wsubbss',0xe0 + dw ARM_instruction_wsubbss-instruction_handler + db 'wsubbus',0xe0 + dw ARM_instruction_wsubbus-instruction_handler + db 'wsubb~~',0x00 + dw ARM_instruction_wsubb-instruction_handler + db 'wsubhss',0xe0 + dw ARM_instruction_wsubhss-instruction_handler + db 'wsubhus',0xe0 + dw ARM_instruction_wsubhus-instruction_handler + db 'wsubh~~',0x00 + dw ARM_instruction_wsubh-instruction_handler + db 'wsubwss',0xe0 + dw ARM_instruction_wsubwss-instruction_handler + db 'wsubwus',0xe0 + dw ARM_instruction_wsubwus-instruction_handler + db 'wsubw~~',0x00 + dw ARM_instruction_wsubw-instruction_handler + db 'wzero~~',0x00 + dw ARM_instruction_wzero-instruction_handler + db 'yield.n',0xe4 + dw ARM_instruction_yield-instruction_handler + db 'yield.w',0xe2 + dw ARM_instruction_yield-instruction_handler + db 'yield~~',0x00 + dw ARM_instruction_yield-instruction_handler + db 0 +instructions_8: + db 'adcs~~.n',0x05 + dw ARM_instruction_adc-instruction_handler + db 'adcs~~.w',0x03 + dw ARM_instruction_adc-instruction_handler + db 'adc~~s.n',0x05 + dw ARM_instruction_adc-instruction_handler + db 'adc~~s.w',0x03 + dw ARM_instruction_adc-instruction_handler + db 'adds~~.n',0x05 + dw ARM_instruction_add-instruction_handler + db 'adds~~.w',0x03 + dw ARM_instruction_add-instruction_handler + db 'add~~s.n',0x05 + dw ARM_instruction_add-instruction_handler + db 'add~~s.w',0x03 + dw ARM_instruction_add-instruction_handler + db 'aesimc.8',0xf0 + dw ARM_instruction_aesimc.8-instruction_handler + db 'ands~~.n',0x05 + dw ARM_instruction_and-instruction_handler + db 'ands~~.w',0x03 + dw ARM_instruction_and-instruction_handler + db 'and~~s.n',0x05 + dw ARM_instruction_and-instruction_handler + db 'and~~s.w',0x03 + dw ARM_instruction_and-instruction_handler + db 'asrs~~.n',0x05 + dw ARM_instruction_asr-instruction_handler + db 'asrs~~.w',0x03 + dw ARM_instruction_asr-instruction_handler + db 'asr~~s.n',0x05 + dw ARM_instruction_asr-instruction_handler + db 'asr~~s.w',0x03 + dw ARM_instruction_asr-instruction_handler + db 'bics~~.n',0x05 + dw ARM_instruction_bic-instruction_handler + db 'bics~~.w',0x03 + dw ARM_instruction_bic-instruction_handler + db 'bic~~s.n',0x05 + dw ARM_instruction_bic-instruction_handler + db 'bic~~s.w',0x03 + dw ARM_instruction_bic-instruction_handler + db 'cfabsd~~',0x00 + dw ARM_instruction_cfabsd-instruction_handler + db 'cfabss~~',0x00 + dw ARM_instruction_cfabss-instruction_handler + db 'cfaddd~~',0x00 + dw ARM_instruction_cfaddd-instruction_handler + db 'cfadds~~',0x00 + dw ARM_instruction_cfadds-instruction_handler + db 'cfcmpd~~',0x00 + dw ARM_instruction_cfcmpd-instruction_handler + db 'cfcmps~~',0x00 + dw ARM_instruction_cfcmps-instruction_handler + db 'cfcpyd~~',0x00 + dw ARM_instruction_cfcpyd-instruction_handler + db 'cfcpys~~',0x00 + dw ARM_instruction_cfcpys-instruction_handler + db 'cfcvt32d',0xe0 + dw ARM_instruction_cfcvt32d-instruction_handler + db 'cfcvt32s',0xe0 + dw ARM_instruction_cfcvt32s-instruction_handler + db 'cfcvt64d',0xe0 + dw ARM_instruction_cfcvt64d-instruction_handler + db 'cfcvt64s',0xe0 + dw ARM_instruction_cfcvt64s-instruction_handler + db 'cfcvtd32',0xe0 + dw ARM_instruction_cfcvtd32-instruction_handler + db 'cfcvts32',0xe0 + dw ARM_instruction_cfcvts32-instruction_handler + db 'cfldrd~~',0x00 + dw ARM_instruction_cfldrd-instruction_handler + db 'cfldrs~~',0x00 + dw ARM_instruction_cfldrs-instruction_handler + db 'cfmadd32',0xe0 + dw ARM_instruction_cfmadd32-instruction_handler + db 'cfmsub32',0xe0 + dw ARM_instruction_cfmsub32-instruction_handler + db 'cfmuld~~',0x00 + dw ARM_instruction_cfmuld-instruction_handler + db 'cfmuls~~',0x00 + dw ARM_instruction_cfmuls-instruction_handler + db 'cfmv32ah',0xe0 + dw ARM_instruction_cfmv32ah-instruction_handler + db 'cfmv32al',0xe0 + dw ARM_instruction_cfmv32al-instruction_handler + db 'cfmv32am',0xe0 + dw ARM_instruction_cfmv32am-instruction_handler + db 'cfmv32sc',0xe0 + dw ARM_instruction_cfmv32sc-instruction_handler + db 'cfmv64hr',0xe0 + dw ARM_instruction_cfmv64hr-instruction_handler + db 'cfmv64lr',0xe0 + dw ARM_instruction_cfmv64lr-instruction_handler + db 'cfmvah32',0xe0 + dw ARM_instruction_cfmvah32-instruction_handler + db 'cfmval32',0xe0 + dw ARM_instruction_cfmval32-instruction_handler + db 'cfmvam32',0xe0 + dw ARM_instruction_cfmvam32-instruction_handler + db 'cfmvr64h',0xe0 + dw ARM_instruction_cfmvr64h-instruction_handler + db 'cfmvr64l',0xe0 + dw ARM_instruction_cfmvr64l-instruction_handler + db 'cfmvrs~~',0x00 + dw ARM_instruction_cfmvrs-instruction_handler + db 'cfmvsc32',0xe0 + dw ARM_instruction_cfmvsc32-instruction_handler + db 'cfmvsr~~',0x00 + dw ARM_instruction_cfmvsr-instruction_handler + db 'cfnegd~~',0x00 + dw ARM_instruction_cfnegd-instruction_handler + db 'cfnegs~~',0x00 + dw ARM_instruction_cfnegs-instruction_handler + db 'cfrshl32',0xe0 + dw ARM_instruction_cfrshl32-instruction_handler + db 'cfrshl64',0xe0 + dw ARM_instruction_cfrshl64-instruction_handler + db 'cfsh32~~',0x00 + dw ARM_instruction_cfsh32-instruction_handler + db 'cfsh64~~',0x00 + dw ARM_instruction_cfsh64-instruction_handler + db 'cfstrd~~',0x00 + dw ARM_instruction_cfstrd-instruction_handler + db 'cfstrs~~',0x00 + dw ARM_instruction_cfstrs-instruction_handler + db 'cfsubd~~',0x00 + dw ARM_instruction_cfsubd-instruction_handler + db 'cfsubs~~',0x00 + dw ARM_instruction_cfsubs-instruction_handler + db 'eors~~.n',0x05 + dw ARM_instruction_eor-instruction_handler + db 'eors~~.w',0x03 + dw ARM_instruction_eor-instruction_handler + db 'eor~~s.n',0x05 + dw ARM_instruction_eor-instruction_handler + db 'eor~~s.w',0x03 + dw ARM_instruction_eor-instruction_handler + db 'fcmped~~',0x00 + dw ARM_instruction_fcmped-instruction_handler + db 'fcmpes~~',0x00 + dw ARM_instruction_fcmpes-instruction_handler + db 'fcmpzd~~',0x00 + dw ARM_instruction_fcmpzd-instruction_handler + db 'fcmpzs~~',0x00 + dw ARM_instruction_fcmpzs-instruction_handler + db 'fcvtds~~',0x00 + dw ARM_instruction_fcvtds-instruction_handler + db 'fcvtsd~~',0x00 + dw ARM_instruction_fcvtsd-instruction_handler + db 'fmstat~~',0x00 + dw ARM_instruction_fmstat-instruction_handler + db 'fnmacd~~',0x00 + dw ARM_instruction_fnmacd-instruction_handler + db 'fnmacs~~',0x00 + dw ARM_instruction_fnmacs-instruction_handler + db 'fnmscd~~',0x00 + dw ARM_instruction_fnmscd-instruction_handler + db 'fnmscs~~',0x00 + dw ARM_instruction_fnmscs-instruction_handler + db 'fnmuld~~',0x00 + dw ARM_instruction_fnmuld-instruction_handler + db 'fnmuls~~',0x00 + dw ARM_instruction_fnmuls-instruction_handler + db 'fshtod~~',0x00 + dw ARM_instruction_fshtod-instruction_handler + db 'fshtos~~',0x00 + dw ARM_instruction_fshtos-instruction_handler + db 'fsitod~~',0x00 + dw ARM_instruction_fsitod-instruction_handler + db 'fsitos~~',0x00 + dw ARM_instruction_fsitos-instruction_handler + db 'fsltod~~',0x00 + dw ARM_instruction_fsltod-instruction_handler + db 'fsltos~~',0x00 + dw ARM_instruction_fsltos-instruction_handler + db 'fsqrtd~~',0x00 + dw ARM_instruction_fsqrtd-instruction_handler + db 'fsqrts~~',0x00 + dw ARM_instruction_fsqrts-instruction_handler + db 'ftoshd~~',0x00 + dw ARM_instruction_ftoshd-instruction_handler + db 'ftoshs~~',0x00 + dw ARM_instruction_ftoshs-instruction_handler + db 'ftosid~~',0x00 + dw ARM_instruction_ftosid-instruction_handler + db 'ftosis~~',0x00 + dw ARM_instruction_ftosis-instruction_handler + db 'ftosld~~',0x00 + dw ARM_instruction_ftosld-instruction_handler + db 'ftosls~~',0x00 + dw ARM_instruction_ftosls-instruction_handler + db 'ftouhd~~',0x00 + dw ARM_instruction_ftouhd-instruction_handler + db 'ftouhs~~',0x00 + dw ARM_instruction_ftouhs-instruction_handler + db 'ftouid~~',0x00 + dw ARM_instruction_ftouid-instruction_handler + db 'ftouis~~',0x00 + dw ARM_instruction_ftouis-instruction_handler + db 'ftould~~',0x00 + dw ARM_instruction_ftould-instruction_handler + db 'ftouls~~',0x00 + dw ARM_instruction_ftouls-instruction_handler + db 'fuhtod~~',0x00 + dw ARM_instruction_fuhtod-instruction_handler + db 'fuhtos~~',0x00 + dw ARM_instruction_fuhtos-instruction_handler + db 'fuitod~~',0x00 + dw ARM_instruction_fuitod-instruction_handler + db 'fuitos~~',0x00 + dw ARM_instruction_fuitos-instruction_handler + db 'fultod~~',0x00 + dw ARM_instruction_fultod-instruction_handler + db 'fultos~~',0x00 + dw ARM_instruction_fultos-instruction_handler + db 'itnoauto',0x00 + dw ARM_itnoauto_directive-instruction_handler + db 'ldaexb~~',0x00 + dw ARM_instruction_ldaexb-instruction_handler + db 'ldaexd~~',0x00 + dw ARM_instruction_ldaexd-instruction_handler + db 'ldaexh~~',0x00 + dw ARM_instruction_ldaexh-instruction_handler + db 'ldaex~~b',0x00 + dw ARM_instruction_ldaexb-instruction_handler + db 'ldaex~~d',0x00 + dw ARM_instruction_ldaexd-instruction_handler + db 'ldaex~~h',0x00 + dw ARM_instruction_ldaexh-instruction_handler + db 'ldrb~~.n',0x04 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrb~~.w',0x02 + dw ARM_instruction_ldrb-instruction_handler + db 'ldrexb~~',0x00 + dw ARM_instruction_ldrexb-instruction_handler + db 'ldrexd~~',0x00 + dw ARM_instruction_ldrexd-instruction_handler + db 'ldrexh~~',0x00 + dw ARM_instruction_ldrexh-instruction_handler + db 'ldrh~~.n',0x04 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrh~~.w',0x02 + dw ARM_instruction_ldrh-instruction_handler + db 'ldrsbt~~',0x00 + dw ARM_instruction_ldrsbt-instruction_handler + db 'ldrsht~~',0x00 + dw ARM_instruction_ldrsht-instruction_handler + db 'ldr~~b.n',0x04 + dw ARM_instruction_ldrb-instruction_handler + db 'ldr~~b.w',0x02 + dw ARM_instruction_ldrb-instruction_handler + db 'ldr~~h.n',0x04 + dw ARM_instruction_ldrh-instruction_handler + db 'ldr~~h.w',0x02 + dw ARM_instruction_ldrh-instruction_handler + db 'ldr~~sbt',0x00 + dw ARM_instruction_ldrsbt-instruction_handler + db 'ldr~~sht',0x00 + dw ARM_instruction_ldrsht-instruction_handler + db 'lsls~~.n',0x05 + dw ARM_instruction_lsl-instruction_handler + db 'lsls~~.w',0x03 + dw ARM_instruction_lsl-instruction_handler + db 'lsl~~s.n',0x05 + dw ARM_instruction_lsl-instruction_handler + db 'lsl~~s.w',0x03 + dw ARM_instruction_lsl-instruction_handler + db 'lsrs~~.n',0x05 + dw ARM_instruction_lsr-instruction_handler + db 'lsrs~~.w',0x03 + dw ARM_instruction_lsr-instruction_handler + db 'lsr~~s.n',0x05 + dw ARM_instruction_lsr-instruction_handler + db 'lsr~~s.w',0x03 + dw ARM_instruction_lsr-instruction_handler + db 'movs~~.n',0x05 + dw ARM_instruction_mov-instruction_handler + db 'movs~~.w',0x03 + dw ARM_instruction_mov-instruction_handler + db 'mov~~s.n',0x05 + dw ARM_instruction_mov-instruction_handler + db 'mov~~s.w',0x03 + dw ARM_instruction_mov-instruction_handler + db 'muls~~.n',0x05 + dw ARM_instruction_mul-instruction_handler + db 'muls~~.w',0x03 + dw ARM_instruction_mul-instruction_handler + db 'mul~~s.n',0x05 + dw ARM_instruction_mul-instruction_handler + db 'mul~~s.w',0x03 + dw ARM_instruction_mul-instruction_handler + db 'mvns~~.n',0x05 + dw ARM_instruction_mvn-instruction_handler + db 'mvns~~.w',0x03 + dw ARM_instruction_mvn-instruction_handler + db 'mvn~~s.n',0x05 + dw ARM_instruction_mvn-instruction_handler + db 'mvn~~s.w',0x03 + dw ARM_instruction_mvn-instruction_handler + db 'negs~~.n',0x05 + dw ARM_instruction_neg-instruction_handler + db 'negs~~.w',0x03 + dw ARM_instruction_neg-instruction_handler + db 'neg~~s.n',0x05 + dw ARM_instruction_neg-instruction_handler + db 'neg~~s.w',0x03 + dw ARM_instruction_neg-instruction_handler + db 'orrs~~.n',0x05 + dw ARM_instruction_orr-instruction_handler + db 'orrs~~.w',0x03 + dw ARM_instruction_orr-instruction_handler + db 'orr~~s.n',0x05 + dw ARM_instruction_orr-instruction_handler + db 'orr~~s.w',0x03 + dw ARM_instruction_orr-instruction_handler + db 'push~~.n',0x04 + dw ARM_instruction_push-instruction_handler + db 'push~~.w',0x02 + dw ARM_instruction_push-instruction_handler + db 'qadd16~~',0x00 + dw ARM_instruction_qadd16-instruction_handler + db 'qaddsubx',0xe0 + dw ARM_instruction_qaddsubx-instruction_handler + db 'qsub16~~',0x00 + dw ARM_instruction_qsub16-instruction_handler + db 'qsubaddx',0xe0 + dw ARM_instruction_qsubaddx-instruction_handler + db 'rors~~.n',0x05 + dw ARM_instruction_ror-instruction_handler + db 'rors~~.w',0x03 + dw ARM_instruction_ror-instruction_handler + db 'ror~~s.n',0x05 + dw ARM_instruction_ror-instruction_handler + db 'ror~~s.w',0x03 + dw ARM_instruction_ror-instruction_handler + db 'rsbs~~.n',0x05 + dw ARM_instruction_rsb-instruction_handler + db 'rsbs~~.w',0x03 + dw ARM_instruction_rsb-instruction_handler + db 'rsb~~s.n',0x05 + dw ARM_instruction_rsb-instruction_handler + db 'rsb~~s.w',0x03 + dw ARM_instruction_rsb-instruction_handler + db 'sadd16~~',0x00 + dw ARM_instruction_sadd16-instruction_handler + db 'saddsubx',0xe0 + dw ARM_instruction_saddsubx-instruction_handler + db 'sbcs~~.n',0x05 + dw ARM_instruction_sbc-instruction_handler + db 'sbcs~~.w',0x03 + dw ARM_instruction_sbc-instruction_handler + db 'sbc~~s.n',0x05 + dw ARM_instruction_sbc-instruction_handler + db 'sbc~~s.w',0x03 + dw ARM_instruction_sbc-instruction_handler + db 'sevl~~.n',0x04 + dw ARM_instruction_sevl-instruction_handler + db 'sevl~~.w',0x02 + dw ARM_instruction_sevl-instruction_handler + db 'sha1c.32',0xf0 + dw ARM_instruction_sha1c.32-instruction_handler + db 'sha1h.32',0xf0 + dw ARM_instruction_sha1h.32-instruction_handler + db 'sha1m.32',0xf0 + dw ARM_instruction_sha1m.32-instruction_handler + db 'sha1p.32',0xf0 + dw ARM_instruction_sha1p.32-instruction_handler + db 'sha256h2',0xf0 + dw ARM_instruction_sha256h2-instruction_handler + db 'shadd8~~',0x00 + dw ARM_instruction_shadd8-instruction_handler + db 'shsub8~~',0x00 + dw ARM_instruction_shsub8-instruction_handler + db 'smlabb~~',0x00 + dw ARM_instruction_smlabb-instruction_handler + db 'smlabt~~',0x00 + dw ARM_instruction_smlabt-instruction_handler + db 'smladx~~',0x00 + dw ARM_instruction_smladx-instruction_handler + db 'smlald~~',0x00 + dw ARM_instruction_smlald-instruction_handler + db 'smlals~~',0x01 + dw ARM_instruction_smlal-instruction_handler + db 'smlal~~s',0x01 + dw ARM_instruction_smlal-instruction_handler + db 'smlatb~~',0x00 + dw ARM_instruction_smlatb-instruction_handler + db 'smlatt~~',0x00 + dw ARM_instruction_smlatt-instruction_handler + db 'smlawb~~',0x00 + dw ARM_instruction_smlawb-instruction_handler + db 'smlawt~~',0x00 + dw ARM_instruction_smlawt-instruction_handler + db 'smlsdx~~',0x00 + dw ARM_instruction_smlsdx-instruction_handler + db 'smlsld~~',0x00 + dw ARM_instruction_smlsld-instruction_handler + db 'smmlar~~',0x00 + dw ARM_instruction_smmlar-instruction_handler + db 'smmlsr~~',0x00 + dw ARM_instruction_smmlsr-instruction_handler + db 'smmulr~~',0x00 + dw ARM_instruction_smmulr-instruction_handler + db 'smuadx~~',0x00 + dw ARM_instruction_smuadx-instruction_handler + db 'smulbb~~',0x00 + dw ARM_instruction_smulbb-instruction_handler + db 'smulbt~~',0x00 + dw ARM_instruction_smulbt-instruction_handler + db 'smulls~~',0x01 + dw ARM_instruction_smull-instruction_handler + db 'smull~~s',0x01 + dw ARM_instruction_smull-instruction_handler + db 'smultb~~',0x00 + dw ARM_instruction_smultb-instruction_handler + db 'smultt~~',0x00 + dw ARM_instruction_smultt-instruction_handler + db 'smulwb~~',0x00 + dw ARM_instruction_smulwb-instruction_handler + db 'smulwt~~',0x00 + dw ARM_instruction_smulwt-instruction_handler + db 'smusdx~~',0x00 + dw ARM_instruction_smusdx-instruction_handler + db 'sqdmlal2',0xf0 + dw ARM_instruction_sqdmlal2-instruction_handler + db 'sqdmlsl2',0xf0 + dw ARM_instruction_sqdmlsl2-instruction_handler + db 'sqdmull2',0xf0 + dw ARM_instruction_sqdmull2-instruction_handler + db 'sqrdmulh',0xf0 + dw ARM_instruction_sqrdmulh-instruction_handler + db 'sqrshrn2',0xf0 + dw ARM_instruction_sqrshrn2-instruction_handler + db 'sqrshrun',0xf0 + dw ARM_instruction_sqrshrun-instruction_handler + db 'sqshrun2',0xf0 + dw ARM_instruction_sqshrun2-instruction_handler + db 'ssat16~~',0x00 + dw ARM_instruction_ssat16-instruction_handler + db 'ssub16~~',0x00 + dw ARM_instruction_ssub16-instruction_handler + db 'ssubaddx',0xe0 + dw ARM_instruction_ssubaddx-instruction_handler + db 'stlexb~~',0x00 + dw ARM_instruction_stlexb-instruction_handler + db 'stlexd~~',0x00 + dw ARM_instruction_stlexd-instruction_handler + db 'stlexh~~',0x00 + dw ARM_instruction_stlexh-instruction_handler + db 'stlex~~b',0x00 + dw ARM_instruction_stlexb-instruction_handler + db 'stlex~~d',0x00 + dw ARM_instruction_stlexd-instruction_handler + db 'stlex~~h',0x00 + dw ARM_instruction_stlexh-instruction_handler + db 'strb~~.n',0x04 + dw ARM_instruction_strb-instruction_handler + db 'strb~~.w',0x02 + dw ARM_instruction_strb-instruction_handler + db 'strexb~~',0x00 + dw ARM_instruction_strexb-instruction_handler + db 'strexd~~',0x00 + dw ARM_instruction_strexd-instruction_handler + db 'strexh~~',0x00 + dw ARM_instruction_strexh-instruction_handler + db 'strh~~.n',0x04 + dw ARM_instruction_strh-instruction_handler + db 'strh~~.w',0x02 + dw ARM_instruction_strh-instruction_handler + db 'str~~b.n',0x04 + dw ARM_instruction_strb-instruction_handler + db 'str~~b.w',0x02 + dw ARM_instruction_strb-instruction_handler + db 'str~~h.n',0x04 + dw ARM_instruction_strh-instruction_handler + db 'str~~h.w',0x02 + dw ARM_instruction_strh-instruction_handler + db 'subs~~.n',0x05 + dw ARM_instruction_sub-instruction_handler + db 'subs~~.w',0x03 + dw ARM_instruction_sub-instruction_handler + db 'sub~~s.n',0x05 + dw ARM_instruction_sub-instruction_handler + db 'sub~~s.w',0x03 + dw ARM_instruction_sub-instruction_handler + db 'sxtb16~~',0x00 + dw ARM_instruction_sxtb16-instruction_handler + db 'sxtb~~.n',0x04 + dw ARM_instruction_sxtb-instruction_handler + db 'sxtb~~.w',0x02 + dw ARM_instruction_sxtb-instruction_handler + db 'sxth~~.n',0x04 + dw ARM_instruction_sxth-instruction_handler + db 'sxth~~.w',0x02 + dw ARM_instruction_sxth-instruction_handler + db 'tandcb~~',0x00 + dw ARM_instruction_tandcb-instruction_handler + db 'tandch~~',0x00 + dw ARM_instruction_tandch-instruction_handler + db 'tandcw~~',0x00 + dw ARM_instruction_tandcw-instruction_handler + db 'tbcstb~~',0x00 + dw ARM_instruction_tbcstb-instruction_handler + db 'tbcsth~~',0x00 + dw ARM_instruction_tbcsth-instruction_handler + db 'tbcstw~~',0x00 + dw ARM_instruction_tbcstw-instruction_handler + db 'textrmsb',0xe0 + dw ARM_instruction_textrmsb-instruction_handler + db 'textrmsh',0xe0 + dw ARM_instruction_textrmsh-instruction_handler + db 'textrmsw',0xe0 + dw ARM_instruction_textrmsw-instruction_handler + db 'textrmub',0xe0 + dw ARM_instruction_textrmub-instruction_handler + db 'textrmuh',0xe0 + dw ARM_instruction_textrmuh-instruction_handler + db 'textrmuw',0xe0 + dw ARM_instruction_textrmuw-instruction_handler + db 'tinsrb~~',0x00 + dw ARM_instruction_tinsrb-instruction_handler + db 'tinsrh~~',0x00 + dw ARM_instruction_tinsrh-instruction_handler + db 'tinsrw~~',0x00 + dw ARM_instruction_tinsrw-instruction_handler + db 'tmiabb~~',0x00 + dw ARM_instruction_tmiabb-instruction_handler + db 'tmiabt~~',0x00 + dw ARM_instruction_tmiabt-instruction_handler + db 'tmiaph~~',0x00 + dw ARM_instruction_tmiaph-instruction_handler + db 'tmiatb~~',0x00 + dw ARM_instruction_tmiatb-instruction_handler + db 'tmiatt~~',0x00 + dw ARM_instruction_tmiatt-instruction_handler + db 'tmovmskb',0xe0 + dw ARM_instruction_tmovmskb-instruction_handler + db 'tmovmskh',0xe0 + dw ARM_instruction_tmovmskh-instruction_handler + db 'tmovmskw',0xe0 + dw ARM_instruction_tmovmskw-instruction_handler + db 'uadd16~~',0x00 + dw ARM_instruction_uadd16-instruction_handler + db 'uaddsubx',0xe0 + dw ARM_instruction_uaddsubx-instruction_handler + db 'uhadd8~~',0x00 + dw ARM_instruction_uhadd8-instruction_handler + db 'uhsub8~~',0x00 + dw ARM_instruction_uhsub8-instruction_handler + db 'umlals~~',0x01 + dw ARM_instruction_umlal-instruction_handler + db 'umlal~~s',0x01 + dw ARM_instruction_umlal-instruction_handler + db 'umulls~~',0x01 + dw ARM_instruction_umull-instruction_handler + db 'umull~~s',0x01 + dw ARM_instruction_umull-instruction_handler + db 'uqadd8~~',0x00 + dw ARM_instruction_uqadd8-instruction_handler + db 'uqrshrn2',0xf0 + dw ARM_instruction_uqrshrn2-instruction_handler + db 'uqsub8~~',0x00 + dw ARM_instruction_uqsub8-instruction_handler + db 'usada8~~',0x00 + dw ARM_instruction_usada8-instruction_handler + db 'usat16~~',0x00 + dw ARM_instruction_usat16-instruction_handler + db 'usub16~~',0x00 + dw ARM_instruction_usub16-instruction_handler + db 'usubaddx',0xe0 + dw ARM_instruction_usubaddx-instruction_handler + db 'uxtb16~~',0x00 + dw ARM_instruction_uxtb16-instruction_handler + db 'uxtb~~.n',0x04 + dw ARM_instruction_uxtb-instruction_handler + db 'uxtb~~.w',0x02 + dw ARM_instruction_uxtb-instruction_handler + db 'uxth~~.n',0x04 + dw ARM_instruction_uxth-instruction_handler + db 'uxth~~.w',0x02 + dw ARM_instruction_uxth-instruction_handler + db 'vaba.s16',0xe0 + dw ARM_instruction_vaba.s16-instruction_handler + db 'vaba.s32',0xe0 + dw ARM_instruction_vaba.s32-instruction_handler + db 'vaba.u16',0xe0 + dw ARM_instruction_vaba.u16-instruction_handler + db 'vaba.u32',0xe0 + dw ARM_instruction_vaba.u32-instruction_handler + db 'vabal.s8',0xe0 + dw ARM_instruction_vabal.s8-instruction_handler + db 'vabal.u8',0xe0 + dw ARM_instruction_vabal.u8-instruction_handler + db 'vabd.f32',0xe0 + dw ARM_instruction_vabd.f32-instruction_handler + db 'vabd.s16',0xe0 + dw ARM_instruction_vabd.s16-instruction_handler + db 'vabd.s32',0xe0 + dw ARM_instruction_vabd.s32-instruction_handler + db 'vabd.u16',0xe0 + dw ARM_instruction_vabd.u16-instruction_handler + db 'vabd.u32',0xe0 + dw ARM_instruction_vabd.u32-instruction_handler + db 'vabdl.s8',0xe0 + dw ARM_instruction_vabdl.s8-instruction_handler + db 'vabdl.u8',0xe0 + dw ARM_instruction_vabdl.u8-instruction_handler + db 'vabs.f32',0xe0 + dw ARM_instruction_vabs.f32-instruction_handler + db 'vabs.f64',0xe0 + dw ARM_instruction_vabs.f64-instruction_handler + db 'vabs.s16',0xe0 + dw ARM_instruction_vabs.s16-instruction_handler + db 'vabs.s32',0xe0 + dw ARM_instruction_vabs.s32-instruction_handler + db 'vadd.f32',0xe0 + dw ARM_instruction_vadd.f32-instruction_handler + db 'vadd.f64',0xe0 + dw ARM_instruction_vadd.f64-instruction_handler + db 'vadd.i16',0xe0 + dw ARM_instruction_vadd.i16-instruction_handler + db 'vadd.i32',0xe0 + dw ARM_instruction_vadd.i32-instruction_handler + db 'vadd.i64',0xe0 + dw ARM_instruction_vadd.i64-instruction_handler + db 'vaddl.s8',0xe0 + dw ARM_instruction_vaddl.s8-instruction_handler + db 'vaddl.u8',0xe0 + dw ARM_instruction_vaddl.u8-instruction_handler + db 'vaddw.s8',0xe0 + dw ARM_instruction_vaddw.s8-instruction_handler + db 'vaddw.u8',0xe0 + dw ARM_instruction_vaddw.u8-instruction_handler + db 'vand.i16',0xe0 + dw ARM_instruction_vand.i16-instruction_handler + db 'vand.i32',0xe0 + dw ARM_instruction_vand.i32-instruction_handler + db 'vbic.i16',0xe0 + dw ARM_instruction_vbic.i16-instruction_handler + db 'vbic.i32',0xe0 + dw ARM_instruction_vbic.i32-instruction_handler + db 'vceq.f32',0xe0 + dw ARM_instruction_vceq.f32-instruction_handler + db 'vceq.i16',0xe0 + dw ARM_instruction_vceq.i16-instruction_handler + db 'vceq.i32',0xe0 + dw ARM_instruction_vceq.i32-instruction_handler + db 'vcge.f32',0xe0 + dw ARM_instruction_vcge.f32-instruction_handler + db 'vcge.s16',0xe0 + dw ARM_instruction_vcge.s16-instruction_handler + db 'vcge.s32',0xe0 + dw ARM_instruction_vcge.s32-instruction_handler + db 'vcge.u16',0xe0 + dw ARM_instruction_vcge.u16-instruction_handler + db 'vcge.u32',0xe0 + dw ARM_instruction_vcge.u32-instruction_handler + db 'vcgt.f32',0xe0 + dw ARM_instruction_vcgt.f32-instruction_handler + db 'vcgt.s16',0xe0 + dw ARM_instruction_vcgt.s16-instruction_handler + db 'vcgt.s32',0xe0 + dw ARM_instruction_vcgt.s32-instruction_handler + db 'vcgt.u16',0xe0 + dw ARM_instruction_vcgt.u16-instruction_handler + db 'vcgt.u32',0xe0 + dw ARM_instruction_vcgt.u32-instruction_handler + db 'vcle.f32',0xe0 + dw ARM_instruction_vcle.f32-instruction_handler + db 'vcle.s16',0xe0 + dw ARM_instruction_vcle.s16-instruction_handler + db 'vcle.s32',0xe0 + dw ARM_instruction_vcle.s32-instruction_handler + db 'vcle.u16',0xe0 + dw ARM_instruction_vcle.u16-instruction_handler + db 'vcle.u32',0xe0 + dw ARM_instruction_vcle.u32-instruction_handler + db 'vcls.s16',0xe0 + dw ARM_instruction_vcls.s16-instruction_handler + db 'vcls.s32',0xe0 + dw ARM_instruction_vcls.s32-instruction_handler + db 'vclt.f32',0xe0 + dw ARM_instruction_vclt.f32-instruction_handler + db 'vclt.s16',0xe0 + dw ARM_instruction_vclt.s16-instruction_handler + db 'vclt.s32',0xe0 + dw ARM_instruction_vclt.s32-instruction_handler + db 'vclt.u16',0xe0 + dw ARM_instruction_vclt.u16-instruction_handler + db 'vclt.u32',0xe0 + dw ARM_instruction_vclt.u32-instruction_handler + db 'vclz.i16',0xe0 + dw ARM_instruction_vclz.i16-instruction_handler + db 'vclz.i32',0xe0 + dw ARM_instruction_vclz.i32-instruction_handler + db 'vcmp.f32',0xe0 + dw ARM_instruction_vcmp.f32-instruction_handler + db 'vcmp.f64',0xe0 + dw ARM_instruction_vcmp.f64-instruction_handler + db 'vcnt~~.8',0x00 + dw ARM_instruction_vcnt.8-instruction_handler + db 'vdiv.f32',0xe0 + dw ARM_instruction_vdiv.f32-instruction_handler + db 'vdiv.f64',0xe0 + dw ARM_instruction_vdiv.f64-instruction_handler + db 'vdup~~.8',0x00 + dw ARM_instruction_vdup.8-instruction_handler + db 'vext~~.8',0x00 + dw ARM_instruction_vext.8-instruction_handler + db 'vfma.f32',0xe0 + dw ARM_instruction_vfma.f32-instruction_handler + db 'vfma.f64',0xe0 + dw ARM_instruction_vfma.f64-instruction_handler + db 'vfms.f32',0xe0 + dw ARM_instruction_vfms.f32-instruction_handler + db 'vfms.f64',0xe0 + dw ARM_instruction_vfms.f64-instruction_handler + db 'vhadd.s8',0xe0 + dw ARM_instruction_vhadd.s8-instruction_handler + db 'vhadd.u8',0xe0 + dw ARM_instruction_vhadd.u8-instruction_handler + db 'vhsub.s8',0xe0 + dw ARM_instruction_vhsub.s8-instruction_handler + db 'vhsub.u8',0xe0 + dw ARM_instruction_vhsub.u8-instruction_handler + db 'vld1~~.8',0x00 + dw ARM_instruction_vld1.8-instruction_handler + db 'vld2~~.8',0x00 + dw ARM_instruction_vld2.8-instruction_handler + db 'vld3~~.8',0x00 + dw ARM_instruction_vld3.8-instruction_handler + db 'vld4~~.8',0x00 + dw ARM_instruction_vld4.8-instruction_handler + db 'vldmdb~~',0x00 + dw ARM_instruction_vldmdb-instruction_handler + db 'vldmea~~',0x00 + dw ARM_instruction_vldmea-instruction_handler + db 'vldmfd~~',0x00 + dw ARM_instruction_vldmfd-instruction_handler + db 'vldmia~~',0x00 + dw ARM_instruction_vldmia-instruction_handler + db 'vmax.f32',0xe0 + dw ARM_instruction_vmax.f32-instruction_handler + db 'vmax.s16',0xe0 + dw ARM_instruction_vmax.s16-instruction_handler + db 'vmax.s32',0xe0 + dw ARM_instruction_vmax.s32-instruction_handler + db 'vmax.u16',0xe0 + dw ARM_instruction_vmax.u16-instruction_handler + db 'vmax.u32',0xe0 + dw ARM_instruction_vmax.u32-instruction_handler + db 'vmin.f32',0xe0 + dw ARM_instruction_vmin.f32-instruction_handler + db 'vmin.s16',0xe0 + dw ARM_instruction_vmin.s16-instruction_handler + db 'vmin.s32',0xe0 + dw ARM_instruction_vmin.s32-instruction_handler + db 'vmin.u16',0xe0 + dw ARM_instruction_vmin.u16-instruction_handler + db 'vmin.u32',0xe0 + dw ARM_instruction_vmin.u32-instruction_handler + db 'vmla.f32',0xe0 + dw ARM_instruction_vmla.f32-instruction_handler + db 'vmla.f64',0xe0 + dw ARM_instruction_vmla.f64-instruction_handler + db 'vmla.i16',0xe0 + dw ARM_instruction_vmla.i16-instruction_handler + db 'vmla.i32',0xe0 + dw ARM_instruction_vmla.i32-instruction_handler + db 'vmla.s16',0xe0 + dw ARM_instruction_vmla.s16-instruction_handler + db 'vmla.s32',0xe0 + dw ARM_instruction_vmla.s32-instruction_handler + db 'vmla.u16',0xe0 + dw ARM_instruction_vmla.u16-instruction_handler + db 'vmla.u32',0xe0 + dw ARM_instruction_vmla.u32-instruction_handler + db 'vmlal.s8',0xe0 + dw ARM_instruction_vmlal.s8-instruction_handler + db 'vmlal.u8',0xe0 + dw ARM_instruction_vmlal.u8-instruction_handler + db 'vmls.f32',0xe0 + dw ARM_instruction_vmls.f32-instruction_handler + db 'vmls.f64',0xe0 + dw ARM_instruction_vmls.f64-instruction_handler + db 'vmls.i16',0xe0 + dw ARM_instruction_vmls.i16-instruction_handler + db 'vmls.i32',0xe0 + dw ARM_instruction_vmls.i32-instruction_handler + db 'vmls.s16',0xe0 + dw ARM_instruction_vmls.s16-instruction_handler + db 'vmls.s32',0xe0 + dw ARM_instruction_vmls.s32-instruction_handler + db 'vmls.u16',0xe0 + dw ARM_instruction_vmls.u16-instruction_handler + db 'vmls.u32',0xe0 + dw ARM_instruction_vmls.u32-instruction_handler + db 'vmlsl.s8',0xe0 + dw ARM_instruction_vmlsl.s8-instruction_handler + db 'vmlsl.u8',0xe0 + dw ARM_instruction_vmlsl.u8-instruction_handler + db 'vmov.f32',0xe0 + dw ARM_instruction_vmov.f32-instruction_handler + db 'vmov.f64',0xe0 + dw ARM_instruction_vmov.f64-instruction_handler + db 'vmov.i16',0xe0 + dw ARM_instruction_vmov.i16-instruction_handler + db 'vmov.i32',0xe0 + dw ARM_instruction_vmov.i32-instruction_handler + db 'vmov.i64',0xe0 + dw ARM_instruction_vmov.i64-instruction_handler + db 'vmov.s16',0xe0 + dw ARM_instruction_vmov.s16-instruction_handler + db 'vmov.u16',0xe0 + dw ARM_instruction_vmov.u16-instruction_handler + db 'vmovl.s8',0xe0 + dw ARM_instruction_vmovl.s8-instruction_handler + db 'vmovl.u8',0xe0 + dw ARM_instruction_vmovl.u8-instruction_handler + db 'vmovn.i8',0xe0 + dw ARM_instruction_vmovn.i8-instruction_handler + db 'vmov~~.8',0x00 + dw ARM_instruction_vmov.8-instruction_handler + db 'vmul.f32',0xe0 + dw ARM_instruction_vmul.f32-instruction_handler + db 'vmul.f64',0xe0 + dw ARM_instruction_vmul.f64-instruction_handler + db 'vmul.i16',0xe0 + dw ARM_instruction_vmul.i16-instruction_handler + db 'vmul.i32',0xe0 + dw ARM_instruction_vmul.i32-instruction_handler + db 'vmul.s16',0xe0 + dw ARM_instruction_vmul.s16-instruction_handler + db 'vmul.s32',0xe0 + dw ARM_instruction_vmul.s32-instruction_handler + db 'vmul.u16',0xe0 + dw ARM_instruction_vmul.u16-instruction_handler + db 'vmul.u32',0xe0 + dw ARM_instruction_vmul.u32-instruction_handler + db 'vmull.p8',0xe0 + dw ARM_instruction_vmull.p8-instruction_handler + db 'vmull.s8',0xe0 + dw ARM_instruction_vmull.s8-instruction_handler + db 'vmull.u8',0xe0 + dw ARM_instruction_vmull.u8-instruction_handler + db 'vmvn.i16',0xe0 + dw ARM_instruction_vmvn.i16-instruction_handler + db 'vmvn.i32',0xe0 + dw ARM_instruction_vmvn.i32-instruction_handler + db 'vneg.f32',0xe0 + dw ARM_instruction_vneg.f32-instruction_handler + db 'vneg.f64',0xe0 + dw ARM_instruction_vneg.f64-instruction_handler + db 'vneg.s16',0xe0 + dw ARM_instruction_vneg.s16-instruction_handler + db 'vneg.s32',0xe0 + dw ARM_instruction_vneg.s32-instruction_handler + db 'vorn.i16',0xe0 + dw ARM_instruction_vorn.i16-instruction_handler + db 'vorn.i32',0xe0 + dw ARM_instruction_vorn.i32-instruction_handler + db 'vorr.i16',0xe0 + dw ARM_instruction_vorr.i16-instruction_handler + db 'vorr.i32',0xe0 + dw ARM_instruction_vorr.i32-instruction_handler + db 'vpadd.i8',0xe0 + dw ARM_instruction_vpadd.i8-instruction_handler + db 'vpmax.s8',0xe0 + dw ARM_instruction_vpmax.s8-instruction_handler + db 'vpmax.u8',0xe0 + dw ARM_instruction_vpmax.u8-instruction_handler + db 'vpmin.s8',0xe0 + dw ARM_instruction_vpmin.s8-instruction_handler + db 'vpmin.u8',0xe0 + dw ARM_instruction_vpmin.u8-instruction_handler + db 'vpush.32',0xe0 + dw ARM_instruction_vpush.32-instruction_handler + db 'vpush.64',0xe0 + dw ARM_instruction_vpush.64-instruction_handler + db 'vqabs.s8',0xe0 + dw ARM_instruction_vqabs.s8-instruction_handler + db 'vqadd.s8',0xe0 + dw ARM_instruction_vqadd.s8-instruction_handler + db 'vqadd.u8',0xe0 + dw ARM_instruction_vqadd.u8-instruction_handler + db 'vqneg.s8',0xe0 + dw ARM_instruction_vqneg.s8-instruction_handler + db 'vqshl.s8',0xe0 + dw ARM_instruction_vqshl.s8-instruction_handler + db 'vqshl.u8',0xe0 + dw ARM_instruction_vqshl.u8-instruction_handler + db 'vqsub.s8',0xe0 + dw ARM_instruction_vqsub.s8-instruction_handler + db 'vqsub.u8',0xe0 + dw ARM_instruction_vqsub.u8-instruction_handler + db 'vrev16.8',0xe0 + dw ARM_instruction_vrev16.8-instruction_handler + db 'vrev32.8',0xe0 + dw ARM_instruction_vrev32.8-instruction_handler + db 'vrev64.8',0xe0 + dw ARM_instruction_vrev64.8-instruction_handler + db 'vrshl.s8',0xe0 + dw ARM_instruction_vrshl.s8-instruction_handler + db 'vrshl.u8',0xe0 + dw ARM_instruction_vrshl.u8-instruction_handler + db 'vrshr.s8',0xe0 + dw ARM_instruction_vrshr.s8-instruction_handler + db 'vrshr.u8',0xe0 + dw ARM_instruction_vrshr.u8-instruction_handler + db 'vrsra.s8',0xe0 + dw ARM_instruction_vrsra.s8-instruction_handler + db 'vrsra.u8',0xe0 + dw ARM_instruction_vrsra.u8-instruction_handler + db 'vshl.i16',0xe0 + dw ARM_instruction_vshl.i16-instruction_handler + db 'vshl.i32',0xe0 + dw ARM_instruction_vshl.i32-instruction_handler + db 'vshl.i64',0xe0 + dw ARM_instruction_vshl.i64-instruction_handler + db 'vshl.s16',0xe0 + dw ARM_instruction_vshl.s16-instruction_handler + db 'vshl.s32',0xe0 + dw ARM_instruction_vshl.s32-instruction_handler + db 'vshl.s64',0xe0 + dw ARM_instruction_vshl.s64-instruction_handler + db 'vshl.u16',0xe0 + dw ARM_instruction_vshl.u16-instruction_handler + db 'vshl.u32',0xe0 + dw ARM_instruction_vshl.u32-instruction_handler + db 'vshl.u64',0xe0 + dw ARM_instruction_vshl.u64-instruction_handler + db 'vshll.i8',0xe0 + dw ARM_instruction_vshll.i8-instruction_handler + db 'vshll.s8',0xe0 + dw ARM_instruction_vshll.s8-instruction_handler + db 'vshll.u8',0xe0 + dw ARM_instruction_vshll.u8-instruction_handler + db 'vshr.s16',0xe0 + dw ARM_instruction_vshr.s16-instruction_handler + db 'vshr.s32',0xe0 + dw ARM_instruction_vshr.s32-instruction_handler + db 'vshr.s64',0xe0 + dw ARM_instruction_vshr.s64-instruction_handler + db 'vshr.u16',0xe0 + dw ARM_instruction_vshr.u16-instruction_handler + db 'vshr.u32',0xe0 + dw ARM_instruction_vshr.u32-instruction_handler + db 'vshr.u64',0xe0 + dw ARM_instruction_vshr.u64-instruction_handler + db 'vsli~~.8',0x00 + dw ARM_instruction_vsli.8-instruction_handler + db 'vsra.s16',0xe0 + dw ARM_instruction_vsra.s16-instruction_handler + db 'vsra.s32',0xe0 + dw ARM_instruction_vsra.s32-instruction_handler + db 'vsra.s64',0xe0 + dw ARM_instruction_vsra.s64-instruction_handler + db 'vsra.u16',0xe0 + dw ARM_instruction_vsra.u16-instruction_handler + db 'vsra.u32',0xe0 + dw ARM_instruction_vsra.u32-instruction_handler + db 'vsra.u64',0xe0 + dw ARM_instruction_vsra.u64-instruction_handler + db 'vsri~~.8',0x00 + dw ARM_instruction_vsri.8-instruction_handler + db 'vst1~~.8',0x00 + dw ARM_instruction_vst1.8-instruction_handler + db 'vst2~~.8',0x00 + dw ARM_instruction_vst2.8-instruction_handler + db 'vst3~~.8',0x00 + dw ARM_instruction_vst3.8-instruction_handler + db 'vst4~~.8',0x00 + dw ARM_instruction_vst4.8-instruction_handler + db 'vstmdb~~',0x00 + dw ARM_instruction_vstmdb-instruction_handler + db 'vstmea~~',0x00 + dw ARM_instruction_vstmea-instruction_handler + db 'vstmfd~~',0x00 + dw ARM_instruction_vstmfd-instruction_handler + db 'vstmia~~',0x00 + dw ARM_instruction_vstmia-instruction_handler + db 'vsub.f32',0xe0 + dw ARM_instruction_vsub.f32-instruction_handler + db 'vsub.f64',0xe0 + dw ARM_instruction_vsub.f64-instruction_handler + db 'vsub.i16',0xe0 + dw ARM_instruction_vsub.i16-instruction_handler + db 'vsub.i32',0xe0 + dw ARM_instruction_vsub.i32-instruction_handler + db 'vsub.i64',0xe0 + dw ARM_instruction_vsub.i64-instruction_handler + db 'vsubl.s8',0xe0 + dw ARM_instruction_vsubl.s8-instruction_handler + db 'vsubl.u8',0xe0 + dw ARM_instruction_vsubl.u8-instruction_handler + db 'vsubw.s8',0xe0 + dw ARM_instruction_vsubw.s8-instruction_handler + db 'vsubw.u8',0xe0 + dw ARM_instruction_vsubw.u8-instruction_handler + db 'vtbl~~.8',0x00 + dw ARM_instruction_vtbl.8-instruction_handler + db 'vtbx~~.8',0x00 + dw ARM_instruction_vtbx.8-instruction_handler + db 'vtrn~~.8',0x00 + dw ARM_instruction_vtrn.8-instruction_handler + db 'vtst~~.8',0x00 + dw ARM_instruction_vtst.8-instruction_handler + db 'vuzp~~.8',0x00 + dw ARM_instruction_vuzp.8-instruction_handler + db 'vzip~~.8',0x00 + dw ARM_instruction_vzip.8-instruction_handler + db 'waddhc~~',0x00 + dw ARM_instruction_waddhc-instruction_handler + db 'waddwc~~',0x00 + dw ARM_instruction_waddwc-instruction_handler + db 'walignr0',0xe0 + dw ARM_instruction_walignr0-instruction_handler + db 'walignr1',0xe0 + dw ARM_instruction_walignr1-instruction_handler + db 'walignr2',0xe0 + dw ARM_instruction_walignr2-instruction_handler + db 'walignr3',0xe0 + dw ARM_instruction_walignr3-instruction_handler + db 'wavg2b~~',0x00 + dw ARM_instruction_wavg2b-instruction_handler + db 'wavg2h~~',0x00 + dw ARM_instruction_wavg2h-instruction_handler + db 'wavg4r~~',0x00 + dw ARM_instruction_wavg4r-instruction_handler + db 'wcmpgtsb',0xe0 + dw ARM_instruction_wcmpgtsb-instruction_handler + db 'wcmpgtsh',0xe0 + dw ARM_instruction_wcmpgtsh-instruction_handler + db 'wcmpgtsw',0xe0 + dw ARM_instruction_wcmpgtsw-instruction_handler + db 'wcmpgtub',0xe0 + dw ARM_instruction_wcmpgtub-instruction_handler + db 'wcmpgtuh',0xe0 + dw ARM_instruction_wcmpgtuh-instruction_handler + db 'wcmpgtuw',0xe0 + dw ARM_instruction_wcmpgtuw-instruction_handler + db 'wmacsz~~',0x00 + dw ARM_instruction_wmacsz-instruction_handler + db 'wmacuz~~',0x00 + dw ARM_instruction_wmacuz-instruction_handler + db 'wmadds~~',0x00 + dw ARM_instruction_wmadds-instruction_handler + db 'wmaddu~~',0x00 + dw ARM_instruction_wmaddu-instruction_handler + db 'wmaxsb~~',0x00 + dw ARM_instruction_wmaxsb-instruction_handler + db 'wmaxsh~~',0x00 + dw ARM_instruction_wmaxsh-instruction_handler + db 'wmaxsw~~',0x00 + dw ARM_instruction_wmaxsw-instruction_handler + db 'wmaxub~~',0x00 + dw ARM_instruction_wmaxub-instruction_handler + db 'wmaxuh~~',0x00 + dw ARM_instruction_wmaxuh-instruction_handler + db 'wmaxuw~~',0x00 + dw ARM_instruction_wmaxuw-instruction_handler + db 'wmerge~~',0x00 + dw ARM_instruction_wmerge-instruction_handler + db 'wmiabb~~',0x00 + dw ARM_instruction_wmiabb-instruction_handler + db 'wmiabt~~',0x00 + dw ARM_instruction_wmiabt-instruction_handler + db 'wmiatb~~',0x00 + dw ARM_instruction_wmiatb-instruction_handler + db 'wmiatt~~',0x00 + dw ARM_instruction_wmiatt-instruction_handler + db 'wmiawbbn',0xe0 + dw ARM_instruction_wmiawbbn-instruction_handler + db 'wmiawbtn',0xe0 + dw ARM_instruction_wmiawbtn-instruction_handler + db 'wmiawtbn',0xe0 + dw ARM_instruction_wmiawtbn-instruction_handler + db 'wmiawttn',0xe0 + dw ARM_instruction_wmiawttn-instruction_handler + db 'wminsb~~',0x00 + dw ARM_instruction_wminsb-instruction_handler + db 'wminsh~~',0x00 + dw ARM_instruction_wminsh-instruction_handler + db 'wminsw~~',0x00 + dw ARM_instruction_wminsw-instruction_handler + db 'wminub~~',0x00 + dw ARM_instruction_wminub-instruction_handler + db 'wminuh~~',0x00 + dw ARM_instruction_wminuh-instruction_handler + db 'wminuw~~',0x00 + dw ARM_instruction_wminuw-instruction_handler + db 'wmulsl~~',0x00 + dw ARM_instruction_wmulsl-instruction_handler + db 'wmulsm~~',0x00 + dw ARM_instruction_wmulsm-instruction_handler + db 'wmulul~~',0x00 + dw ARM_instruction_wmulul-instruction_handler + db 'wmulum~~',0x00 + dw ARM_instruction_wmulum-instruction_handler + db 'wmulwl~~',0x00 + dw ARM_instruction_wmulwl-instruction_handler + db 'wmulwsmr',0xe0 + dw ARM_instruction_wmulwsmr-instruction_handler + db 'wmulwumr',0xe0 + dw ARM_instruction_wmulwumr-instruction_handler + db 'wpackdss',0xe0 + dw ARM_instruction_wpackdss-instruction_handler + db 'wpackdus',0xe0 + dw ARM_instruction_wpackdus-instruction_handler + db 'wpackhss',0xe0 + dw ARM_instruction_wpackhss-instruction_handler + db 'wpackhus',0xe0 + dw ARM_instruction_wpackhus-instruction_handler + db 'wpackwss',0xe0 + dw ARM_instruction_wpackwss-instruction_handler + db 'wpackwus',0xe0 + dw ARM_instruction_wpackwus-instruction_handler + db 'wqmiabbn',0xe0 + dw ARM_instruction_wqmiabbn-instruction_handler + db 'wqmiabtn',0xe0 + dw ARM_instruction_wqmiabtn-instruction_handler + db 'wqmiatbn',0xe0 + dw ARM_instruction_wqmiatbn-instruction_handler + db 'wqmiattn',0xe0 + dw ARM_instruction_wqmiattn-instruction_handler + db 'wqmulm~~',0x00 + dw ARM_instruction_wqmulm-instruction_handler + db 'wqmulwmr',0xe0 + dw ARM_instruction_wqmulwmr-instruction_handler + db 'wrordg~~',0x00 + dw ARM_instruction_wrordg-instruction_handler + db 'wrorhg~~',0x00 + dw ARM_instruction_wrorhg-instruction_handler + db 'wrorwg~~',0x00 + dw ARM_instruction_wrorwg-instruction_handler + db 'wsadbz~~',0x00 + dw ARM_instruction_wsadbz-instruction_handler + db 'wsadhz~~',0x00 + dw ARM_instruction_wsadhz-instruction_handler + db 'wshufh~~',0x00 + dw ARM_instruction_wshufh-instruction_handler + db 'wslldg~~',0x00 + dw ARM_instruction_wslldg-instruction_handler + db 'wsllhg~~',0x00 + dw ARM_instruction_wsllhg-instruction_handler + db 'wsllwg~~',0x00 + dw ARM_instruction_wsllwg-instruction_handler + db 'wsradg~~',0x00 + dw ARM_instruction_wsradg-instruction_handler + db 'wsrahg~~',0x00 + dw ARM_instruction_wsrahg-instruction_handler + db 'wsrawg~~',0x00 + dw ARM_instruction_wsrawg-instruction_handler + db 'wsrldg~~',0x00 + dw ARM_instruction_wsrldg-instruction_handler + db 'wsrlhg~~',0x00 + dw ARM_instruction_wsrlhg-instruction_handler + db 'wsrlwg~~',0x00 + dw ARM_instruction_wsrlwg-instruction_handler + db 0 +instructions_9: + db 'cfabs32~~',0x00 + dw ARM_instruction_cfabs32-instruction_handler + db 'cfabs64~~',0x00 + dw ARM_instruction_cfabs64-instruction_handler + db 'cfadd32~~',0x00 + dw ARM_instruction_cfadd32-instruction_handler + db 'cfadd64~~',0x00 + dw ARM_instruction_cfadd64-instruction_handler + db 'cfcmp32~~',0x00 + dw ARM_instruction_cfcmp32-instruction_handler + db 'cfcmp64~~',0x00 + dw ARM_instruction_cfcmp64-instruction_handler + db 'cfcvtds~~',0x00 + dw ARM_instruction_cfcvtds-instruction_handler + db 'cfcvtsd~~',0x00 + dw ARM_instruction_cfcvtsd-instruction_handler + db 'cfldr32~~',0x00 + dw ARM_instruction_cfldr32-instruction_handler + db 'cfldr64~~',0x00 + dw ARM_instruction_cfldr64-instruction_handler + db 'cfmac32~~',0x00 + dw ARM_instruction_cfmac32-instruction_handler + db 'cfmadda32',0xe0 + dw ARM_instruction_cfmadda32-instruction_handler + db 'cfmsc32~~',0x00 + dw ARM_instruction_cfmsc32-instruction_handler + db 'cfmsuba32',0xe0 + dw ARM_instruction_cfmsuba32-instruction_handler + db 'cfmul32~~',0x00 + dw ARM_instruction_cfmul32-instruction_handler + db 'cfmul64~~',0x00 + dw ARM_instruction_cfmul64-instruction_handler + db 'cfmv32a~~',0x00 + dw ARM_instruction_cfmv32a-instruction_handler + db 'cfmv64a~~',0x00 + dw ARM_instruction_cfmv64a-instruction_handler + db 'cfmva32~~',0x00 + dw ARM_instruction_cfmva32-instruction_handler + db 'cfmva64~~',0x00 + dw ARM_instruction_cfmva64-instruction_handler + db 'cfmvdhr~~',0x00 + dw ARM_instruction_cfmvdhr-instruction_handler + db 'cfmvdlr~~',0x00 + dw ARM_instruction_cfmvdlr-instruction_handler + db 'cfmvrdh~~',0x00 + dw ARM_instruction_cfmvrdh-instruction_handler + db 'cfmvrdl~~',0x00 + dw ARM_instruction_cfmvrdl-instruction_handler + db 'cfneg32~~',0x00 + dw ARM_instruction_cfneg32-instruction_handler + db 'cfneg64~~',0x00 + dw ARM_instruction_cfneg64-instruction_handler + db 'cfstr32~~',0x00 + dw ARM_instruction_cfstr32-instruction_handler + db 'cfstr64~~',0x00 + dw ARM_instruction_cfstr64-instruction_handler + db 'cfsub32~~',0x00 + dw ARM_instruction_cfsub32-instruction_handler + db 'cfsub64~~',0x00 + dw ARM_instruction_cfsub64-instruction_handler + db 'fcmpezd~~',0x00 + dw ARM_instruction_fcmpezd-instruction_handler + db 'fcmpezs~~',0x00 + dw ARM_instruction_fcmpezs-instruction_handler + db 'fconstd~~',0x00 + dw ARM_instruction_fconstd-instruction_handler + db 'fconsts~~',0x00 + dw ARM_instruction_fconsts-instruction_handler + db 'fldmdbd~~',0x00 + dw ARM_instruction_fldmdbd-instruction_handler + db 'fldmdbs~~',0x00 + dw ARM_instruction_fldmdbs-instruction_handler + db 'fldmdbx~~',0x00 + dw ARM_instruction_fldmdbx-instruction_handler + db 'fldmead~~',0x00 + dw ARM_instruction_fldmead-instruction_handler + db 'fldmeas~~',0x00 + dw ARM_instruction_fldmeas-instruction_handler + db 'fldmeax~~',0x00 + dw ARM_instruction_fldmeax-instruction_handler + db 'fldmfdd~~',0x00 + dw ARM_instruction_fldmfdd-instruction_handler + db 'fldmfds~~',0x00 + dw ARM_instruction_fldmfds-instruction_handler + db 'fldmfdx~~',0x00 + dw ARM_instruction_fldmfdx-instruction_handler + db 'fldmiad~~',0x00 + dw ARM_instruction_fldmiad-instruction_handler + db 'fldmias~~',0x00 + dw ARM_instruction_fldmias-instruction_handler + db 'fldmiax~~',0x00 + dw ARM_instruction_fldmiax-instruction_handler + db 'fstmdbd~~',0x00 + dw ARM_instruction_fstmdbd-instruction_handler + db 'fstmdbs~~',0x00 + dw ARM_instruction_fstmdbs-instruction_handler + db 'fstmdbx~~',0x00 + dw ARM_instruction_fstmdbx-instruction_handler + db 'fstmead~~',0x00 + dw ARM_instruction_fstmead-instruction_handler + db 'fstmeas~~',0x00 + dw ARM_instruction_fstmeas-instruction_handler + db 'fstmeax~~',0x00 + dw ARM_instruction_fstmeax-instruction_handler + db 'fstmfdd~~',0x00 + dw ARM_instruction_fstmfdd-instruction_handler + db 'fstmfds~~',0x00 + dw ARM_instruction_fstmfds-instruction_handler + db 'fstmfdx~~',0x00 + dw ARM_instruction_fstmfdx-instruction_handler + db 'fstmiad~~',0x00 + dw ARM_instruction_fstmiad-instruction_handler + db 'fstmias~~',0x00 + dw ARM_instruction_fstmias-instruction_handler + db 'fstmiax~~',0x00 + dw ARM_instruction_fstmiax-instruction_handler + db 'ftosizd~~',0x00 + dw ARM_instruction_ftosizd-instruction_handler + db 'ftosizs~~',0x00 + dw ARM_instruction_ftosizs-instruction_handler + db 'ftouizd~~',0x00 + dw ARM_instruction_ftouizd-instruction_handler + db 'ftouizs~~',0x00 + dw ARM_instruction_ftouizs-instruction_handler + db 'ldmfd~~.n',0x04 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmfd~~.w',0x02 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldmia~~.n',0x04 + dw ARM_instruction_ldmia-instruction_handler + db 'ldmia~~.w',0x02 + dw ARM_instruction_ldmia-instruction_handler + db 'ldm~~fd.n',0x04 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldm~~fd.w',0x02 + dw ARM_instruction_ldmfd-instruction_handler + db 'ldm~~ia.n',0x04 + dw ARM_instruction_ldmia-instruction_handler + db 'ldm~~ia.w',0x02 + dw ARM_instruction_ldmia-instruction_handler + db 'ldrsb~~.n',0x04 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsb~~.w',0x02 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldrsh~~.n',0x04 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldrsh~~.w',0x02 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldr~~sb.n',0x04 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldr~~sb.w',0x02 + dw ARM_instruction_ldrsb-instruction_handler + db 'ldr~~sh.n',0x04 + dw ARM_instruction_ldrsh-instruction_handler + db 'ldr~~sh.w',0x02 + dw ARM_instruction_ldrsh-instruction_handler + db 'processor',0x00 + dw ARM_processor_directive-instruction_handler + db 'rev16~~.n',0x04 + dw ARM_instruction_rev16-instruction_handler + db 'rev16~~.w',0x02 + dw ARM_instruction_rev16-instruction_handler + db 'revsh~~.n',0x04 + dw ARM_instruction_revsh-instruction_handler + db 'revsh~~.w',0x02 + dw ARM_instruction_revsh-instruction_handler + db 'sha256su0',0xf0 + dw ARM_instruction_sha256su0-instruction_handler + db 'sha256su1',0xf0 + dw ARM_instruction_sha256su1-instruction_handler + db 'shadd16~~',0x00 + dw ARM_instruction_shadd16-instruction_handler + db 'shaddsubx',0xe0 + dw ARM_instruction_shaddsubx-instruction_handler + db 'shsub16~~',0x00 + dw ARM_instruction_shsub16-instruction_handler + db 'shsubaddx',0xe0 + dw ARM_instruction_shsubaddx-instruction_handler + db 'smlalbb~~',0x00 + dw ARM_instruction_smlalbb-instruction_handler + db 'smlalbt~~',0x00 + dw ARM_instruction_smlalbt-instruction_handler + db 'smlaldx~~',0x00 + dw ARM_instruction_smlaldx-instruction_handler + db 'smlaltb~~',0x00 + dw ARM_instruction_smlaltb-instruction_handler + db 'smlaltt~~',0x00 + dw ARM_instruction_smlaltt-instruction_handler + db 'smlsldx~~',0x00 + dw ARM_instruction_smlsldx-instruction_handler + db 'sqrshrun2',0xf0 + dw ARM_instruction_sqrshrun2-instruction_handler + db 'stmdb~~.n',0x04 + dw ARM_instruction_stmdb-instruction_handler + db 'stmdb~~.w',0x02 + dw ARM_instruction_stmdb-instruction_handler + db 'stmfd~~.n',0x04 + dw ARM_instruction_stmfd-instruction_handler + db 'stmfd~~.w',0x02 + dw ARM_instruction_stmfd-instruction_handler + db 'stmia~~.n',0x04 + dw ARM_instruction_stmia-instruction_handler + db 'stmia~~.w',0x02 + dw ARM_instruction_stmia-instruction_handler + db 'stm~~db.n',0x04 + dw ARM_instruction_stmdb-instruction_handler + db 'stm~~db.w',0x02 + dw ARM_instruction_stmdb-instruction_handler + db 'stm~~fd.n',0x04 + dw ARM_instruction_stmfd-instruction_handler + db 'stm~~fd.w',0x02 + dw ARM_instruction_stmfd-instruction_handler + db 'stm~~ia.n',0x04 + dw ARM_instruction_stmia-instruction_handler + db 'stm~~ia.w',0x02 + dw ARM_instruction_stmia-instruction_handler + db 'sxtab16~~',0x00 + dw ARM_instruction_sxtab16-instruction_handler + db 'textrcb~~',0x00 + dw ARM_instruction_textrcb-instruction_handler + db 'textrch~~',0x00 + dw ARM_instruction_textrch-instruction_handler + db 'textrcw~~',0x00 + dw ARM_instruction_textrcw-instruction_handler + db 'torvscb~~',0x00 + dw ARM_instruction_torvscb-instruction_handler + db 'torvsch~~',0x00 + dw ARM_instruction_torvsch-instruction_handler + db 'torvscw~~',0x00 + dw ARM_instruction_torvscw-instruction_handler + db 'uhadd16~~',0x00 + dw ARM_instruction_uhadd16-instruction_handler + db 'uhaddsubx',0xe0 + dw ARM_instruction_uhaddsubx-instruction_handler + db 'uhsub16~~',0x00 + dw ARM_instruction_uhsub16-instruction_handler + db 'uhsubaddx',0xe0 + dw ARM_instruction_uhsubaddx-instruction_handler + db 'uqadd16~~',0x00 + dw ARM_instruction_uqadd16-instruction_handler + db 'uqaddsubx',0xe0 + dw ARM_instruction_uqaddsubx-instruction_handler + db 'uqsub16~~',0x00 + dw ARM_instruction_uqsub16-instruction_handler + db 'uqsubaddx',0xe0 + dw ARM_instruction_uqsubaddx-instruction_handler + db 'uxtab16~~',0x00 + dw ARM_instruction_uxtab16-instruction_handler + db 'vabal.s16',0xe0 + dw ARM_instruction_vabal.s16-instruction_handler + db 'vabal.s32',0xe0 + dw ARM_instruction_vabal.s32-instruction_handler + db 'vabal.u16',0xe0 + dw ARM_instruction_vabal.u16-instruction_handler + db 'vabal.u32',0xe0 + dw ARM_instruction_vabal.u32-instruction_handler + db 'vaba~~.s8',0x00 + dw ARM_instruction_vaba.s8-instruction_handler + db 'vaba~~.u8',0x00 + dw ARM_instruction_vaba.u8-instruction_handler + db 'vabdl.s16',0xe0 + dw ARM_instruction_vabdl.s16-instruction_handler + db 'vabdl.s32',0xe0 + dw ARM_instruction_vabdl.s32-instruction_handler + db 'vabdl.u16',0xe0 + dw ARM_instruction_vabdl.u16-instruction_handler + db 'vabdl.u32',0xe0 + dw ARM_instruction_vabdl.u32-instruction_handler + db 'vabd~~.s8',0x00 + dw ARM_instruction_vabd.s8-instruction_handler + db 'vabd~~.u8',0x00 + dw ARM_instruction_vabd.u8-instruction_handler + db 'vabs~~.s8',0x00 + dw ARM_instruction_vabs.s8-instruction_handler + db 'vacge.f32',0xe0 + dw ARM_instruction_vacge.f32-instruction_handler + db 'vacgt.f32',0xe0 + dw ARM_instruction_vacgt.f32-instruction_handler + db 'vacle.f32',0xe0 + dw ARM_instruction_vacle.f32-instruction_handler + db 'vaclt.f32',0xe0 + dw ARM_instruction_vaclt.f32-instruction_handler + db 'vaddl.s16',0xe0 + dw ARM_instruction_vaddl.s16-instruction_handler + db 'vaddl.s32',0xe0 + dw ARM_instruction_vaddl.s32-instruction_handler + db 'vaddl.u16',0xe0 + dw ARM_instruction_vaddl.u16-instruction_handler + db 'vaddl.u32',0xe0 + dw ARM_instruction_vaddl.u32-instruction_handler + db 'vaddw.s16',0xe0 + dw ARM_instruction_vaddw.s16-instruction_handler + db 'vaddw.s32',0xe0 + dw ARM_instruction_vaddw.s32-instruction_handler + db 'vaddw.u16',0xe0 + dw ARM_instruction_vaddw.u16-instruction_handler + db 'vaddw.u32',0xe0 + dw ARM_instruction_vaddw.u32-instruction_handler + db 'vadd~~.i8',0x00 + dw ARM_instruction_vadd.i8-instruction_handler + db 'vceq~~.i8',0x00 + dw ARM_instruction_vceq.i8-instruction_handler + db 'vcge~~.s8',0x00 + dw ARM_instruction_vcge.s8-instruction_handler + db 'vcge~~.u8',0x00 + dw ARM_instruction_vcge.u8-instruction_handler + db 'vcgt~~.s8',0x00 + dw ARM_instruction_vcgt.s8-instruction_handler + db 'vcgt~~.u8',0x00 + dw ARM_instruction_vcgt.u8-instruction_handler + db 'vcle~~.s8',0x00 + dw ARM_instruction_vcle.s8-instruction_handler + db 'vcle~~.u8',0x00 + dw ARM_instruction_vcle.u8-instruction_handler + db 'vcls~~.s8',0x00 + dw ARM_instruction_vcls.s8-instruction_handler + db 'vclt~~.s8',0x00 + dw ARM_instruction_vclt.s8-instruction_handler + db 'vclt~~.u8',0x00 + dw ARM_instruction_vclt.u8-instruction_handler + db 'vclz~~.i8',0x00 + dw ARM_instruction_vclz.i8-instruction_handler + db 'vcmpe.f32',0xe0 + dw ARM_instruction_vcmpe.f32-instruction_handler + db 'vcmpe.f64',0xe0 + dw ARM_instruction_vcmpe.f64-instruction_handler + db 'vdup~~.16',0x00 + dw ARM_instruction_vdup.16-instruction_handler + db 'vdup~~.32',0x00 + dw ARM_instruction_vdup.32-instruction_handler + db 'vext~~.16',0x00 + dw ARM_instruction_vext.16-instruction_handler + db 'vext~~.32',0x00 + dw ARM_instruction_vext.32-instruction_handler + db 'vext~~.64',0x00 + dw ARM_instruction_vext.64-instruction_handler + db 'vfnma.f32',0xe0 + dw ARM_instruction_vfnma.f32-instruction_handler + db 'vfnma.f64',0xe0 + dw ARM_instruction_vfnma.f64-instruction_handler + db 'vfnms.f32',0xe0 + dw ARM_instruction_vfnms.f32-instruction_handler + db 'vfnms.f64',0xe0 + dw ARM_instruction_vfnms.f64-instruction_handler + db 'vhadd.s16',0xe0 + dw ARM_instruction_vhadd.s16-instruction_handler + db 'vhadd.s32',0xe0 + dw ARM_instruction_vhadd.s32-instruction_handler + db 'vhadd.u16',0xe0 + dw ARM_instruction_vhadd.u16-instruction_handler + db 'vhadd.u32',0xe0 + dw ARM_instruction_vhadd.u32-instruction_handler + db 'vhsub.s16',0xe0 + dw ARM_instruction_vhsub.s16-instruction_handler + db 'vhsub.s32',0xe0 + dw ARM_instruction_vhsub.s32-instruction_handler + db 'vhsub.u16',0xe0 + dw ARM_instruction_vhsub.u16-instruction_handler + db 'vhsub.u32',0xe0 + dw ARM_instruction_vhsub.u32-instruction_handler + db 'vld1~~.16',0x00 + dw ARM_instruction_vld1.16-instruction_handler + db 'vld1~~.32',0x00 + dw ARM_instruction_vld1.32-instruction_handler + db 'vld1~~.64',0x00 + dw ARM_instruction_vld1.64-instruction_handler + db 'vld2~~.16',0x00 + dw ARM_instruction_vld2.16-instruction_handler + db 'vld2~~.32',0x00 + dw ARM_instruction_vld2.32-instruction_handler + db 'vld3~~.16',0x00 + dw ARM_instruction_vld3.16-instruction_handler + db 'vld3~~.32',0x00 + dw ARM_instruction_vld3.32-instruction_handler + db 'vld4~~.16',0x00 + dw ARM_instruction_vld4.16-instruction_handler + db 'vld4~~.32',0x00 + dw ARM_instruction_vld4.32-instruction_handler + db 'vldmdb.32',0xe0 + dw ARM_instruction_vldmdb.32-instruction_handler + db 'vldmdb.64',0xe0 + dw ARM_instruction_vldmdb.64-instruction_handler + db 'vldmea.32',0xe0 + dw ARM_instruction_vldmea.32-instruction_handler + db 'vldmea.64',0xe0 + dw ARM_instruction_vldmea.64-instruction_handler + db 'vldmfd.32',0xe0 + dw ARM_instruction_vldmfd.32-instruction_handler + db 'vldmfd.64',0xe0 + dw ARM_instruction_vldmfd.64-instruction_handler + db 'vldmia.32',0xe0 + dw ARM_instruction_vldmia.32-instruction_handler + db 'vldmia.64',0xe0 + dw ARM_instruction_vldmia.64-instruction_handler + db 'vldm~~.32',0x00 + dw ARM_instruction_vldm.32-instruction_handler + db 'vldm~~.64',0x00 + dw ARM_instruction_vldm.64-instruction_handler + db 'vldr~~.32',0x00 + dw ARM_instruction_vldr.32-instruction_handler + db 'vldr~~.64',0x00 + dw ARM_instruction_vldr.64-instruction_handler + db 'vmax~~.s8',0x00 + dw ARM_instruction_vmax.s8-instruction_handler + db 'vmax~~.u8',0x00 + dw ARM_instruction_vmax.u8-instruction_handler + db 'vmin~~.s8',0x00 + dw ARM_instruction_vmin.s8-instruction_handler + db 'vmin~~.u8',0x00 + dw ARM_instruction_vmin.u8-instruction_handler + db 'vmlal.s16',0xe0 + dw ARM_instruction_vmlal.s16-instruction_handler + db 'vmlal.s32',0xe0 + dw ARM_instruction_vmlal.s32-instruction_handler + db 'vmlal.u16',0xe0 + dw ARM_instruction_vmlal.u16-instruction_handler + db 'vmlal.u32',0xe0 + dw ARM_instruction_vmlal.u32-instruction_handler + db 'vmla~~.i8',0x00 + dw ARM_instruction_vmla.i8-instruction_handler + db 'vmla~~.s8',0x00 + dw ARM_instruction_vmla.s8-instruction_handler + db 'vmla~~.u8',0x00 + dw ARM_instruction_vmla.u8-instruction_handler + db 'vmlsl.s16',0xe0 + dw ARM_instruction_vmlsl.s16-instruction_handler + db 'vmlsl.s32',0xe0 + dw ARM_instruction_vmlsl.s32-instruction_handler + db 'vmlsl.u16',0xe0 + dw ARM_instruction_vmlsl.u16-instruction_handler + db 'vmlsl.u32',0xe0 + dw ARM_instruction_vmlsl.u32-instruction_handler + db 'vmls~~.i8',0x00 + dw ARM_instruction_vmls.i8-instruction_handler + db 'vmls~~.s8',0x00 + dw ARM_instruction_vmls.s8-instruction_handler + db 'vmls~~.u8',0x00 + dw ARM_instruction_vmls.u8-instruction_handler + db 'vmovl.s16',0xe0 + dw ARM_instruction_vmovl.s16-instruction_handler + db 'vmovl.s32',0xe0 + dw ARM_instruction_vmovl.s32-instruction_handler + db 'vmovl.u16',0xe0 + dw ARM_instruction_vmovl.u16-instruction_handler + db 'vmovl.u32',0xe0 + dw ARM_instruction_vmovl.u32-instruction_handler + db 'vmovn.i16',0xe0 + dw ARM_instruction_vmovn.i16-instruction_handler + db 'vmovn.i32',0xe0 + dw ARM_instruction_vmovn.i32-instruction_handler + db 'vmov~~.16',0x00 + dw ARM_instruction_vmov.16-instruction_handler + db 'vmov~~.32',0x00 + dw ARM_instruction_vmov.32-instruction_handler + db 'vmov~~.i8',0x00 + dw ARM_instruction_vmov.i8-instruction_handler + db 'vmov~~.s8',0x00 + dw ARM_instruction_vmov.s8-instruction_handler + db 'vmov~~.u8',0x00 + dw ARM_instruction_vmov.u8-instruction_handler + db 'vmull.p64',0xf0 + dw ARM_instruction_vmull.p64-instruction_handler + db 'vmull.s16',0xe0 + dw ARM_instruction_vmull.s16-instruction_handler + db 'vmull.s32',0xe0 + dw ARM_instruction_vmull.s32-instruction_handler + db 'vmull.u16',0xe0 + dw ARM_instruction_vmull.u16-instruction_handler + db 'vmull.u32',0xe0 + dw ARM_instruction_vmull.u32-instruction_handler + db 'vmul~~.i8',0x00 + dw ARM_instruction_vmul.i8-instruction_handler + db 'vmul~~.p8',0x00 + dw ARM_instruction_vmul.p8-instruction_handler + db 'vmul~~.s8',0x00 + dw ARM_instruction_vmul.s8-instruction_handler + db 'vmul~~.u8',0x00 + dw ARM_instruction_vmul.u8-instruction_handler + db 'vneg~~.s8',0x00 + dw ARM_instruction_vneg.s8-instruction_handler + db 'vnmla.f32',0xe0 + dw ARM_instruction_vnmla.f32-instruction_handler + db 'vnmla.f64',0xe0 + dw ARM_instruction_vnmla.f64-instruction_handler + db 'vnmls.f32',0xe0 + dw ARM_instruction_vnmls.f32-instruction_handler + db 'vnmls.f64',0xe0 + dw ARM_instruction_vnmls.f64-instruction_handler + db 'vnmul.f32',0xe0 + dw ARM_instruction_vnmul.f32-instruction_handler + db 'vnmul.f64',0xe0 + dw ARM_instruction_vnmul.f64-instruction_handler + db 'vpadal.s8',0xe0 + dw ARM_instruction_vpadal.s8-instruction_handler + db 'vpadal.u8',0xe0 + dw ARM_instruction_vpadal.u8-instruction_handler + db 'vpadd.f32',0xe0 + dw ARM_instruction_vpadd.f32-instruction_handler + db 'vpadd.i16',0xe0 + dw ARM_instruction_vpadd.i16-instruction_handler + db 'vpadd.i32',0xe0 + dw ARM_instruction_vpadd.i32-instruction_handler + db 'vpaddl.s8',0xe0 + dw ARM_instruction_vpaddl.s8-instruction_handler + db 'vpaddl.u8',0xe0 + dw ARM_instruction_vpaddl.u8-instruction_handler + db 'vpmax.f32',0xe0 + dw ARM_instruction_vpmax.f32-instruction_handler + db 'vpmax.s16',0xe0 + dw ARM_instruction_vpmax.s16-instruction_handler + db 'vpmax.s32',0xe0 + dw ARM_instruction_vpmax.s32-instruction_handler + db 'vpmax.u16',0xe0 + dw ARM_instruction_vpmax.u16-instruction_handler + db 'vpmax.u32',0xe0 + dw ARM_instruction_vpmax.u32-instruction_handler + db 'vpmin.f32',0xe0 + dw ARM_instruction_vpmin.f32-instruction_handler + db 'vpmin.s16',0xe0 + dw ARM_instruction_vpmin.s16-instruction_handler + db 'vpmin.s32',0xe0 + dw ARM_instruction_vpmin.s32-instruction_handler + db 'vpmin.u16',0xe0 + dw ARM_instruction_vpmin.u16-instruction_handler + db 'vpmin.u32',0xe0 + dw ARM_instruction_vpmin.u32-instruction_handler + db 'vpop~~.32',0x00 + dw ARM_instruction_vpop.32-instruction_handler + db 'vpop~~.64',0x00 + dw ARM_instruction_vpop.64-instruction_handler + db 'vqabs.s16',0xe0 + dw ARM_instruction_vqabs.s16-instruction_handler + db 'vqabs.s32',0xe0 + dw ARM_instruction_vqabs.s32-instruction_handler + db 'vqadd.s16',0xe0 + dw ARM_instruction_vqadd.s16-instruction_handler + db 'vqadd.s32',0xe0 + dw ARM_instruction_vqadd.s32-instruction_handler + db 'vqadd.s64',0xe0 + dw ARM_instruction_vqadd.s64-instruction_handler + db 'vqadd.u16',0xe0 + dw ARM_instruction_vqadd.u16-instruction_handler + db 'vqadd.u32',0xe0 + dw ARM_instruction_vqadd.u32-instruction_handler + db 'vqadd.u64',0xe0 + dw ARM_instruction_vqadd.u64-instruction_handler + db 'vqneg.s16',0xe0 + dw ARM_instruction_vqneg.s16-instruction_handler + db 'vqneg.s32',0xe0 + dw ARM_instruction_vqneg.s32-instruction_handler + db 'vqrshl.s8',0xe0 + dw ARM_instruction_vqrshl.s8-instruction_handler + db 'vqrshl.u8',0xe0 + dw ARM_instruction_vqrshl.u8-instruction_handler + db 'vqshl.s16',0xe0 + dw ARM_instruction_vqshl.s16-instruction_handler + db 'vqshl.s32',0xe0 + dw ARM_instruction_vqshl.s32-instruction_handler + db 'vqshl.s64',0xe0 + dw ARM_instruction_vqshl.s64-instruction_handler + db 'vqshl.u16',0xe0 + dw ARM_instruction_vqshl.u16-instruction_handler + db 'vqshl.u32',0xe0 + dw ARM_instruction_vqshl.u32-instruction_handler + db 'vqshl.u64',0xe0 + dw ARM_instruction_vqshl.u64-instruction_handler + db 'vqshlu.s8',0xe0 + dw ARM_instruction_vqshlu.s8-instruction_handler + db 'vqsub.s16',0xe0 + dw ARM_instruction_vqsub.s16-instruction_handler + db 'vqsub.s32',0xe0 + dw ARM_instruction_vqsub.s32-instruction_handler + db 'vqsub.s64',0xe0 + dw ARM_instruction_vqsub.s64-instruction_handler + db 'vqsub.u16',0xe0 + dw ARM_instruction_vqsub.u16-instruction_handler + db 'vqsub.u32',0xe0 + dw ARM_instruction_vqsub.u32-instruction_handler + db 'vqsub.u64',0xe0 + dw ARM_instruction_vqsub.u64-instruction_handler + db 'vrev32.16',0xe0 + dw ARM_instruction_vrev32.16-instruction_handler + db 'vrev64.16',0xe0 + dw ARM_instruction_vrev64.16-instruction_handler + db 'vrev64.32',0xe0 + dw ARM_instruction_vrev64.32-instruction_handler + db 'vrhadd.s8',0xe0 + dw ARM_instruction_vrhadd.s8-instruction_handler + db 'vrhadd.u8',0xe0 + dw ARM_instruction_vrhadd.u8-instruction_handler + db 'vrshl.s16',0xe0 + dw ARM_instruction_vrshl.s16-instruction_handler + db 'vrshl.s32',0xe0 + dw ARM_instruction_vrshl.s32-instruction_handler + db 'vrshl.s64',0xe0 + dw ARM_instruction_vrshl.s64-instruction_handler + db 'vrshl.u16',0xe0 + dw ARM_instruction_vrshl.u16-instruction_handler + db 'vrshl.u32',0xe0 + dw ARM_instruction_vrshl.u32-instruction_handler + db 'vrshl.u64',0xe0 + dw ARM_instruction_vrshl.u64-instruction_handler + db 'vrshr.s16',0xe0 + dw ARM_instruction_vrshr.s16-instruction_handler + db 'vrshr.s32',0xe0 + dw ARM_instruction_vrshr.s32-instruction_handler + db 'vrshr.s64',0xe0 + dw ARM_instruction_vrshr.s64-instruction_handler + db 'vrshr.u16',0xe0 + dw ARM_instruction_vrshr.u16-instruction_handler + db 'vrshr.u32',0xe0 + dw ARM_instruction_vrshr.u32-instruction_handler + db 'vrshr.u64',0xe0 + dw ARM_instruction_vrshr.u64-instruction_handler + db 'vrsra.s16',0xe0 + dw ARM_instruction_vrsra.s16-instruction_handler + db 'vrsra.s32',0xe0 + dw ARM_instruction_vrsra.s32-instruction_handler + db 'vrsra.s64',0xe0 + dw ARM_instruction_vrsra.s64-instruction_handler + db 'vrsra.u16',0xe0 + dw ARM_instruction_vrsra.u16-instruction_handler + db 'vrsra.u32',0xe0 + dw ARM_instruction_vrsra.u32-instruction_handler + db 'vrsra.u64',0xe0 + dw ARM_instruction_vrsra.u64-instruction_handler + db 'vshll.i16',0xe0 + dw ARM_instruction_vshll.i16-instruction_handler + db 'vshll.i32',0xe0 + dw ARM_instruction_vshll.i32-instruction_handler + db 'vshll.s16',0xe0 + dw ARM_instruction_vshll.s16-instruction_handler + db 'vshll.s32',0xe0 + dw ARM_instruction_vshll.s32-instruction_handler + db 'vshll.u16',0xe0 + dw ARM_instruction_vshll.u16-instruction_handler + db 'vshll.u32',0xe0 + dw ARM_instruction_vshll.u32-instruction_handler + db 'vshl~~.i8',0x00 + dw ARM_instruction_vshl.i8-instruction_handler + db 'vshl~~.s8',0x00 + dw ARM_instruction_vshl.s8-instruction_handler + db 'vshl~~.u8',0x00 + dw ARM_instruction_vshl.u8-instruction_handler + db 'vshrn.i16',0xe0 + dw ARM_instruction_vshrn.i16-instruction_handler + db 'vshrn.i32',0xe0 + dw ARM_instruction_vshrn.i32-instruction_handler + db 'vshrn.i64',0xe0 + dw ARM_instruction_vshrn.i64-instruction_handler + db 'vshr~~.s8',0x00 + dw ARM_instruction_vshr.s8-instruction_handler + db 'vshr~~.u8',0x00 + dw ARM_instruction_vshr.u8-instruction_handler + db 'vsli~~.16',0x00 + dw ARM_instruction_vsli.16-instruction_handler + db 'vsli~~.32',0x00 + dw ARM_instruction_vsli.32-instruction_handler + db 'vsli~~.64',0x00 + dw ARM_instruction_vsli.64-instruction_handler + db 'vsqrt.f32',0xe0 + dw ARM_instruction_vsqrt.f32-instruction_handler + db 'vsqrt.f64',0xe0 + dw ARM_instruction_vsqrt.f64-instruction_handler + db 'vsra~~.s8',0x00 + dw ARM_instruction_vsra.s8-instruction_handler + db 'vsra~~.u8',0x00 + dw ARM_instruction_vsra.u8-instruction_handler + db 'vsri~~.16',0x00 + dw ARM_instruction_vsri.16-instruction_handler + db 'vsri~~.32',0x00 + dw ARM_instruction_vsri.32-instruction_handler + db 'vsri~~.64',0x00 + dw ARM_instruction_vsri.64-instruction_handler + db 'vst1~~.16',0x00 + dw ARM_instruction_vst1.16-instruction_handler + db 'vst1~~.32',0x00 + dw ARM_instruction_vst1.32-instruction_handler + db 'vst1~~.64',0x00 + dw ARM_instruction_vst1.64-instruction_handler + db 'vst2~~.16',0x00 + dw ARM_instruction_vst2.16-instruction_handler + db 'vst2~~.32',0x00 + dw ARM_instruction_vst2.32-instruction_handler + db 'vst3~~.16',0x00 + dw ARM_instruction_vst3.16-instruction_handler + db 'vst3~~.32',0x00 + dw ARM_instruction_vst3.32-instruction_handler + db 'vst4~~.16',0x00 + dw ARM_instruction_vst4.16-instruction_handler + db 'vst4~~.32',0x00 + dw ARM_instruction_vst4.32-instruction_handler + db 'vstmdb.32',0xe0 + dw ARM_instruction_vstmdb.32-instruction_handler + db 'vstmdb.64',0xe0 + dw ARM_instruction_vstmdb.64-instruction_handler + db 'vstmea.32',0xe0 + dw ARM_instruction_vstmea.32-instruction_handler + db 'vstmea.64',0xe0 + dw ARM_instruction_vstmea.64-instruction_handler + db 'vstmfd.32',0xe0 + dw ARM_instruction_vstmfd.32-instruction_handler + db 'vstmfd.64',0xe0 + dw ARM_instruction_vstmfd.64-instruction_handler + db 'vstmia.32',0xe0 + dw ARM_instruction_vstmia.32-instruction_handler + db 'vstmia.64',0xe0 + dw ARM_instruction_vstmia.64-instruction_handler + db 'vstm~~.32',0x00 + dw ARM_instruction_vstm.32-instruction_handler + db 'vstm~~.64',0x00 + dw ARM_instruction_vstm.64-instruction_handler + db 'vstr~~.32',0x00 + dw ARM_instruction_vstr.32-instruction_handler + db 'vstr~~.64',0x00 + dw ARM_instruction_vstr.64-instruction_handler + db 'vsubl.s16',0xe0 + dw ARM_instruction_vsubl.s16-instruction_handler + db 'vsubl.s32',0xe0 + dw ARM_instruction_vsubl.s32-instruction_handler + db 'vsubl.u16',0xe0 + dw ARM_instruction_vsubl.u16-instruction_handler + db 'vsubl.u32',0xe0 + dw ARM_instruction_vsubl.u32-instruction_handler + db 'vsubw.s16',0xe0 + dw ARM_instruction_vsubw.s16-instruction_handler + db 'vsubw.s32',0xe0 + dw ARM_instruction_vsubw.s32-instruction_handler + db 'vsubw.u16',0xe0 + dw ARM_instruction_vsubw.u16-instruction_handler + db 'vsubw.u32',0xe0 + dw ARM_instruction_vsubw.u32-instruction_handler + db 'vsub~~.i8',0x00 + dw ARM_instruction_vsub.i8-instruction_handler + db 'vtrn~~.16',0x00 + dw ARM_instruction_vtrn.16-instruction_handler + db 'vtrn~~.32',0x00 + dw ARM_instruction_vtrn.32-instruction_handler + db 'vtst~~.16',0x00 + dw ARM_instruction_vtst.16-instruction_handler + db 'vtst~~.32',0x00 + dw ARM_instruction_vtst.32-instruction_handler + db 'vuzp~~.16',0x00 + dw ARM_instruction_vuzp.16-instruction_handler + db 'vuzp~~.32',0x00 + dw ARM_instruction_vuzp.32-instruction_handler + db 'vzip~~.16',0x00 + dw ARM_instruction_vzip.16-instruction_handler + db 'vzip~~.32',0x00 + dw ARM_instruction_vzip.32-instruction_handler + db 'wabsdiffb',0xe0 + dw ARM_instruction_wabsdiffb-instruction_handler + db 'wabsdiffh',0xe0 + dw ARM_instruction_wabsdiffh-instruction_handler + db 'wabsdiffw',0xe0 + dw ARM_instruction_wabsdiffw-instruction_handler + db 'waddbss~~',0x00 + dw ARM_instruction_waddbss-instruction_handler + db 'waddbus~~',0x00 + dw ARM_instruction_waddbus-instruction_handler + db 'waddhss~~',0x00 + dw ARM_instruction_waddhss-instruction_handler + db 'waddhus~~',0x00 + dw ARM_instruction_waddhus-instruction_handler + db 'waddsubhx',0xe0 + dw ARM_instruction_waddsubhx-instruction_handler + db 'waddwss~~',0x00 + dw ARM_instruction_waddwss-instruction_handler + db 'waddwus~~',0x00 + dw ARM_instruction_waddwus-instruction_handler + db 'waligni~~',0x00 + dw ARM_instruction_waligni-instruction_handler + db 'wavg2br~~',0x00 + dw ARM_instruction_wavg2br-instruction_handler + db 'wavg2hr~~',0x00 + dw ARM_instruction_wavg2hr-instruction_handler + db 'wcmpeqb~~',0x00 + dw ARM_instruction_wcmpeqb-instruction_handler + db 'wcmpeqh~~',0x00 + dw ARM_instruction_wcmpeqh-instruction_handler + db 'wcmpeqw~~',0x00 + dw ARM_instruction_wcmpeqw-instruction_handler + db 'wmaddsn~~',0x00 + dw ARM_instruction_wmaddsn-instruction_handler + db 'wmaddsx~~',0x00 + dw ARM_instruction_wmaddsx-instruction_handler + db 'wmaddun~~',0x00 + dw ARM_instruction_wmaddun-instruction_handler + db 'wmaddux~~',0x00 + dw ARM_instruction_wmaddux-instruction_handler + db 'wmiabbn~~',0x00 + dw ARM_instruction_wmiabbn-instruction_handler + db 'wmiabtn~~',0x00 + dw ARM_instruction_wmiabtn-instruction_handler + db 'wmiatbn~~',0x00 + dw ARM_instruction_wmiatbn-instruction_handler + db 'wmiattn~~',0x00 + dw ARM_instruction_wmiattn-instruction_handler + db 'wmiawbb~~',0x00 + dw ARM_instruction_wmiawbb-instruction_handler + db 'wmiawbt~~',0x00 + dw ARM_instruction_wmiawbt-instruction_handler + db 'wmiawtb~~',0x00 + dw ARM_instruction_wmiawtb-instruction_handler + db 'wmiawtt~~',0x00 + dw ARM_instruction_wmiawtt-instruction_handler + db 'wmulsmr~~',0x00 + dw ARM_instruction_wmulsmr-instruction_handler + db 'wmulumr~~',0x00 + dw ARM_instruction_wmulumr-instruction_handler + db 'wmulwsm~~',0x00 + dw ARM_instruction_wmulwsm-instruction_handler + db 'wmulwum~~',0x00 + dw ARM_instruction_wmulwum-instruction_handler + db 'wqmiabb~~',0x00 + dw ARM_instruction_wqmiabb-instruction_handler + db 'wqmiabt~~',0x00 + dw ARM_instruction_wqmiabt-instruction_handler + db 'wqmiatb~~',0x00 + dw ARM_instruction_wqmiatb-instruction_handler + db 'wqmiatt~~',0x00 + dw ARM_instruction_wqmiatt-instruction_handler + db 'wqmulmr~~',0x00 + dw ARM_instruction_wqmulmr-instruction_handler + db 'wqmulwm~~',0x00 + dw ARM_instruction_wqmulwm-instruction_handler + db 'wsubaddhx',0xe0 + dw ARM_instruction_wsubaddhx-instruction_handler + db 'wsubbss~~',0x00 + dw ARM_instruction_wsubbss-instruction_handler + db 'wsubbus~~',0x00 + dw ARM_instruction_wsubbus-instruction_handler + db 'wsubhss~~',0x00 + dw ARM_instruction_wsubhss-instruction_handler + db 'wsubhus~~',0x00 + dw ARM_instruction_wsubhus-instruction_handler + db 'wsubwss~~',0x00 + dw ARM_instruction_wsubwss-instruction_handler + db 'wsubwus~~',0x00 + dw ARM_instruction_wsubwus-instruction_handler + db 'wunpckihb',0xe0 + dw ARM_instruction_wunpckihb-instruction_handler + db 'wunpckihh',0xe0 + dw ARM_instruction_wunpckihh-instruction_handler + db 'wunpckihw',0xe0 + dw ARM_instruction_wunpckihw-instruction_handler + db 'wunpckilb',0xe0 + dw ARM_instruction_wunpckilb-instruction_handler + db 'wunpckilh',0xe0 + dw ARM_instruction_wunpckilh-instruction_handler + db 'wunpckilw',0xe0 + dw ARM_instruction_wunpckilw-instruction_handler + db 'yield~~.n',0x04 + dw ARM_instruction_yield-instruction_handler + db 'yield~~.w',0x02 + dw ARM_instruction_yield-instruction_handler + db 0 +instructions_10: + db 'cfcvt32d~~',0x00 + dw ARM_instruction_cfcvt32d-instruction_handler + db 'cfcvt32s~~',0x00 + dw ARM_instruction_cfcvt32s-instruction_handler + db 'cfcvt64d~~',0x00 + dw ARM_instruction_cfcvt64d-instruction_handler + db 'cfcvt64s~~',0x00 + dw ARM_instruction_cfcvt64s-instruction_handler + db 'cfcvtd32~~',0x00 + dw ARM_instruction_cfcvtd32-instruction_handler + db 'cfcvts32~~',0x00 + dw ARM_instruction_cfcvts32-instruction_handler + db 'cfmadd32~~',0x00 + dw ARM_instruction_cfmadd32-instruction_handler + db 'cfmsub32~~',0x00 + dw ARM_instruction_cfmsub32-instruction_handler + db 'cfmv32ah~~',0x00 + dw ARM_instruction_cfmv32ah-instruction_handler + db 'cfmv32al~~',0x00 + dw ARM_instruction_cfmv32al-instruction_handler + db 'cfmv32am~~',0x00 + dw ARM_instruction_cfmv32am-instruction_handler + db 'cfmv32sc~~',0x00 + dw ARM_instruction_cfmv32sc-instruction_handler + db 'cfmv64hr~~',0x00 + dw ARM_instruction_cfmv64hr-instruction_handler + db 'cfmv64lr~~',0x00 + dw ARM_instruction_cfmv64lr-instruction_handler + db 'cfmvah32~~',0x00 + dw ARM_instruction_cfmvah32-instruction_handler + db 'cfmval32~~',0x00 + dw ARM_instruction_cfmval32-instruction_handler + db 'cfmvam32~~',0x00 + dw ARM_instruction_cfmvam32-instruction_handler + db 'cfmvr64h~~',0x00 + dw ARM_instruction_cfmvr64h-instruction_handler + db 'cfmvr64l~~',0x00 + dw ARM_instruction_cfmvr64l-instruction_handler + db 'cfmvsc32~~',0x00 + dw ARM_instruction_cfmvsc32-instruction_handler + db 'cfrshl32~~',0x00 + dw ARM_instruction_cfrshl32-instruction_handler + db 'cfrshl64~~',0x00 + dw ARM_instruction_cfrshl64-instruction_handler + db 'cftruncd32',0xe0 + dw ARM_instruction_cftruncd32-instruction_handler + db 'cftruncs32',0xe0 + dw ARM_instruction_cftruncs32-instruction_handler + db 'qaddsubx~~',0x00 + dw ARM_instruction_qaddsubx-instruction_handler + db 'qsubaddx~~',0x00 + dw ARM_instruction_qsubaddx-instruction_handler + db 'saddsubx~~',0x00 + dw ARM_instruction_saddsubx-instruction_handler + db 'sha1su0.32',0xf0 + dw ARM_instruction_sha1su0.32-instruction_handler + db 'sha1su1.32',0xf0 + dw ARM_instruction_sha1su1.32-instruction_handler + db 'sha256h.32',0xf0 + dw ARM_instruction_sha256h.32-instruction_handler + db 'ssubaddx~~',0x00 + dw ARM_instruction_ssubaddx-instruction_handler + db 'textrmsb~~',0x00 + dw ARM_instruction_textrmsb-instruction_handler + db 'textrmsh~~',0x00 + dw ARM_instruction_textrmsh-instruction_handler + db 'textrmsw~~',0x00 + dw ARM_instruction_textrmsw-instruction_handler + db 'textrmub~~',0x00 + dw ARM_instruction_textrmub-instruction_handler + db 'textrmuh~~',0x00 + dw ARM_instruction_textrmuh-instruction_handler + db 'textrmuw~~',0x00 + dw ARM_instruction_textrmuw-instruction_handler + db 'tmovmskb~~',0x00 + dw ARM_instruction_tmovmskb-instruction_handler + db 'tmovmskh~~',0x00 + dw ARM_instruction_tmovmskh-instruction_handler + db 'tmovmskw~~',0x00 + dw ARM_instruction_tmovmskw-instruction_handler + db 'uaddsubx~~',0x00 + dw ARM_instruction_uaddsubx-instruction_handler + db 'usubaddx~~',0x00 + dw ARM_instruction_usubaddx-instruction_handler + db 'vabal~~.s8',0x00 + dw ARM_instruction_vabal.s8-instruction_handler + db 'vabal~~.u8',0x00 + dw ARM_instruction_vabal.u8-instruction_handler + db 'vaba~~.s16',0x00 + dw ARM_instruction_vaba.s16-instruction_handler + db 'vaba~~.s32',0x00 + dw ARM_instruction_vaba.s32-instruction_handler + db 'vaba~~.u16',0x00 + dw ARM_instruction_vaba.u16-instruction_handler + db 'vaba~~.u32',0x00 + dw ARM_instruction_vaba.u32-instruction_handler + db 'vabdl~~.s8',0x00 + dw ARM_instruction_vabdl.s8-instruction_handler + db 'vabdl~~.u8',0x00 + dw ARM_instruction_vabdl.u8-instruction_handler + db 'vabd~~.f32',0x00 + dw ARM_instruction_vabd.f32-instruction_handler + db 'vabd~~.s16',0x00 + dw ARM_instruction_vabd.s16-instruction_handler + db 'vabd~~.s32',0x00 + dw ARM_instruction_vabd.s32-instruction_handler + db 'vabd~~.u16',0x00 + dw ARM_instruction_vabd.u16-instruction_handler + db 'vabd~~.u32',0x00 + dw ARM_instruction_vabd.u32-instruction_handler + db 'vabs~~.f32',0x00 + dw ARM_instruction_vabs.f32-instruction_handler + db 'vabs~~.f64',0x00 + dw ARM_instruction_vabs.f64-instruction_handler + db 'vabs~~.s16',0x00 + dw ARM_instruction_vabs.s16-instruction_handler + db 'vabs~~.s32',0x00 + dw ARM_instruction_vabs.s32-instruction_handler + db 'vaddhn.i16',0xe0 + dw ARM_instruction_vaddhn.i16-instruction_handler + db 'vaddhn.i32',0xe0 + dw ARM_instruction_vaddhn.i32-instruction_handler + db 'vaddhn.i64',0xe0 + dw ARM_instruction_vaddhn.i64-instruction_handler + db 'vaddl~~.s8',0x00 + dw ARM_instruction_vaddl.s8-instruction_handler + db 'vaddl~~.u8',0x00 + dw ARM_instruction_vaddl.u8-instruction_handler + db 'vaddw~~.s8',0x00 + dw ARM_instruction_vaddw.s8-instruction_handler + db 'vaddw~~.u8',0x00 + dw ARM_instruction_vaddw.u8-instruction_handler + db 'vadd~~.f32',0x00 + dw ARM_instruction_vadd.f32-instruction_handler + db 'vadd~~.f64',0x00 + dw ARM_instruction_vadd.f64-instruction_handler + db 'vadd~~.i16',0x00 + dw ARM_instruction_vadd.i16-instruction_handler + db 'vadd~~.i32',0x00 + dw ARM_instruction_vadd.i32-instruction_handler + db 'vadd~~.i64',0x00 + dw ARM_instruction_vadd.i64-instruction_handler + db 'vand~~.i16',0x00 + dw ARM_instruction_vand.i16-instruction_handler + db 'vand~~.i32',0x00 + dw ARM_instruction_vand.i32-instruction_handler + db 'vbic~~.i16',0x00 + dw ARM_instruction_vbic.i16-instruction_handler + db 'vbic~~.i32',0x00 + dw ARM_instruction_vbic.i32-instruction_handler + db 'vceq~~.f32',0x00 + dw ARM_instruction_vceq.f32-instruction_handler + db 'vceq~~.i16',0x00 + dw ARM_instruction_vceq.i16-instruction_handler + db 'vceq~~.i32',0x00 + dw ARM_instruction_vceq.i32-instruction_handler + db 'vcge~~.f32',0x00 + dw ARM_instruction_vcge.f32-instruction_handler + db 'vcge~~.s16',0x00 + dw ARM_instruction_vcge.s16-instruction_handler + db 'vcge~~.s32',0x00 + dw ARM_instruction_vcge.s32-instruction_handler + db 'vcge~~.u16',0x00 + dw ARM_instruction_vcge.u16-instruction_handler + db 'vcge~~.u32',0x00 + dw ARM_instruction_vcge.u32-instruction_handler + db 'vcgt~~.f32',0x00 + dw ARM_instruction_vcgt.f32-instruction_handler + db 'vcgt~~.s16',0x00 + dw ARM_instruction_vcgt.s16-instruction_handler + db 'vcgt~~.s32',0x00 + dw ARM_instruction_vcgt.s32-instruction_handler + db 'vcgt~~.u16',0x00 + dw ARM_instruction_vcgt.u16-instruction_handler + db 'vcgt~~.u32',0x00 + dw ARM_instruction_vcgt.u32-instruction_handler + db 'vcle~~.f32',0x00 + dw ARM_instruction_vcle.f32-instruction_handler + db 'vcle~~.s16',0x00 + dw ARM_instruction_vcle.s16-instruction_handler + db 'vcle~~.s32',0x00 + dw ARM_instruction_vcle.s32-instruction_handler + db 'vcle~~.u16',0x00 + dw ARM_instruction_vcle.u16-instruction_handler + db 'vcle~~.u32',0x00 + dw ARM_instruction_vcle.u32-instruction_handler + db 'vcls~~.s16',0x00 + dw ARM_instruction_vcls.s16-instruction_handler + db 'vcls~~.s32',0x00 + dw ARM_instruction_vcls.s32-instruction_handler + db 'vclt~~.f32',0x00 + dw ARM_instruction_vclt.f32-instruction_handler + db 'vclt~~.s16',0x00 + dw ARM_instruction_vclt.s16-instruction_handler + db 'vclt~~.s32',0x00 + dw ARM_instruction_vclt.s32-instruction_handler + db 'vclt~~.u16',0x00 + dw ARM_instruction_vclt.u16-instruction_handler + db 'vclt~~.u32',0x00 + dw ARM_instruction_vclt.u32-instruction_handler + db 'vclz~~.i16',0x00 + dw ARM_instruction_vclz.i16-instruction_handler + db 'vclz~~.i32',0x00 + dw ARM_instruction_vclz.i32-instruction_handler + db 'vcmp~~.f32',0x00 + dw ARM_instruction_vcmp.f32-instruction_handler + db 'vcmp~~.f64',0x00 + dw ARM_instruction_vcmp.f64-instruction_handler + db 'vdiv~~.f32',0x00 + dw ARM_instruction_vdiv.f32-instruction_handler + db 'vdiv~~.f64',0x00 + dw ARM_instruction_vdiv.f64-instruction_handler + db 'vfma~~.f32',0x00 + dw ARM_instruction_vfma.f32-instruction_handler + db 'vfma~~.f64',0x00 + dw ARM_instruction_vfma.f64-instruction_handler + db 'vfms~~.f32',0x00 + dw ARM_instruction_vfms.f32-instruction_handler + db 'vfms~~.f64',0x00 + dw ARM_instruction_vfms.f64-instruction_handler + db 'vhadd~~.s8',0x00 + dw ARM_instruction_vhadd.s8-instruction_handler + db 'vhadd~~.u8',0x00 + dw ARM_instruction_vhadd.u8-instruction_handler + db 'vhsub~~.s8',0x00 + dw ARM_instruction_vhsub.s8-instruction_handler + db 'vhsub~~.u8',0x00 + dw ARM_instruction_vhsub.u8-instruction_handler + db 'vmaxnm.f32',0xf0 + dw ARM_instruction_vmaxnm.f32-instruction_handler + db 'vmaxnm.f64',0xf0 + dw ARM_instruction_vmaxnm.f64-instruction_handler + db 'vmax~~.f32',0x00 + dw ARM_instruction_vmax.f32-instruction_handler + db 'vmax~~.s16',0x00 + dw ARM_instruction_vmax.s16-instruction_handler + db 'vmax~~.s32',0x00 + dw ARM_instruction_vmax.s32-instruction_handler + db 'vmax~~.u16',0x00 + dw ARM_instruction_vmax.u16-instruction_handler + db 'vmax~~.u32',0x00 + dw ARM_instruction_vmax.u32-instruction_handler + db 'vminnm.f32',0xf0 + dw ARM_instruction_vminnm.f32-instruction_handler + db 'vminnm.f64',0xf0 + dw ARM_instruction_vminnm.f64-instruction_handler + db 'vmin~~.f32',0x00 + dw ARM_instruction_vmin.f32-instruction_handler + db 'vmin~~.s16',0x00 + dw ARM_instruction_vmin.s16-instruction_handler + db 'vmin~~.s32',0x00 + dw ARM_instruction_vmin.s32-instruction_handler + db 'vmin~~.u16',0x00 + dw ARM_instruction_vmin.u16-instruction_handler + db 'vmin~~.u32',0x00 + dw ARM_instruction_vmin.u32-instruction_handler + db 'vmlal~~.s8',0x00 + dw ARM_instruction_vmlal.s8-instruction_handler + db 'vmlal~~.u8',0x00 + dw ARM_instruction_vmlal.u8-instruction_handler + db 'vmla~~.f32',0x00 + dw ARM_instruction_vmla.f32-instruction_handler + db 'vmla~~.f64',0x00 + dw ARM_instruction_vmla.f64-instruction_handler + db 'vmla~~.i16',0x00 + dw ARM_instruction_vmla.i16-instruction_handler + db 'vmla~~.i32',0x00 + dw ARM_instruction_vmla.i32-instruction_handler + db 'vmla~~.s16',0x00 + dw ARM_instruction_vmla.s16-instruction_handler + db 'vmla~~.s32',0x00 + dw ARM_instruction_vmla.s32-instruction_handler + db 'vmla~~.u16',0x00 + dw ARM_instruction_vmla.u16-instruction_handler + db 'vmla~~.u32',0x00 + dw ARM_instruction_vmla.u32-instruction_handler + db 'vmlsl~~.s8',0x00 + dw ARM_instruction_vmlsl.s8-instruction_handler + db 'vmlsl~~.u8',0x00 + dw ARM_instruction_vmlsl.u8-instruction_handler + db 'vmls~~.f32',0x00 + dw ARM_instruction_vmls.f32-instruction_handler + db 'vmls~~.f64',0x00 + dw ARM_instruction_vmls.f64-instruction_handler + db 'vmls~~.i16',0x00 + dw ARM_instruction_vmls.i16-instruction_handler + db 'vmls~~.i32',0x00 + dw ARM_instruction_vmls.i32-instruction_handler + db 'vmls~~.s16',0x00 + dw ARM_instruction_vmls.s16-instruction_handler + db 'vmls~~.s32',0x00 + dw ARM_instruction_vmls.s32-instruction_handler + db 'vmls~~.u16',0x00 + dw ARM_instruction_vmls.u16-instruction_handler + db 'vmls~~.u32',0x00 + dw ARM_instruction_vmls.u32-instruction_handler + db 'vmovl~~.s8',0x00 + dw ARM_instruction_vmovl.s8-instruction_handler + db 'vmovl~~.u8',0x00 + dw ARM_instruction_vmovl.u8-instruction_handler + db 'vmovn~~.i8',0x00 + dw ARM_instruction_vmovn.i8-instruction_handler + db 'vmov~~.f32',0x00 + dw ARM_instruction_vmov.f32-instruction_handler + db 'vmov~~.f64',0x00 + dw ARM_instruction_vmov.f64-instruction_handler + db 'vmov~~.i16',0x00 + dw ARM_instruction_vmov.i16-instruction_handler + db 'vmov~~.i32',0x00 + dw ARM_instruction_vmov.i32-instruction_handler + db 'vmov~~.i64',0x00 + dw ARM_instruction_vmov.i64-instruction_handler + db 'vmov~~.s16',0x00 + dw ARM_instruction_vmov.s16-instruction_handler + db 'vmov~~.u16',0x00 + dw ARM_instruction_vmov.u16-instruction_handler + db 'vmull~~.p8',0x00 + dw ARM_instruction_vmull.p8-instruction_handler + db 'vmull~~.s8',0x00 + dw ARM_instruction_vmull.s8-instruction_handler + db 'vmull~~.u8',0x00 + dw ARM_instruction_vmull.u8-instruction_handler + db 'vmul~~.f32',0x00 + dw ARM_instruction_vmul.f32-instruction_handler + db 'vmul~~.f64',0x00 + dw ARM_instruction_vmul.f64-instruction_handler + db 'vmul~~.i16',0x00 + dw ARM_instruction_vmul.i16-instruction_handler + db 'vmul~~.i32',0x00 + dw ARM_instruction_vmul.i32-instruction_handler + db 'vmul~~.s16',0x00 + dw ARM_instruction_vmul.s16-instruction_handler + db 'vmul~~.s32',0x00 + dw ARM_instruction_vmul.s32-instruction_handler + db 'vmul~~.u16',0x00 + dw ARM_instruction_vmul.u16-instruction_handler + db 'vmul~~.u32',0x00 + dw ARM_instruction_vmul.u32-instruction_handler + db 'vmvn~~.i16',0x00 + dw ARM_instruction_vmvn.i16-instruction_handler + db 'vmvn~~.i32',0x00 + dw ARM_instruction_vmvn.i32-instruction_handler + db 'vneg~~.f32',0x00 + dw ARM_instruction_vneg.f32-instruction_handler + db 'vneg~~.f64',0x00 + dw ARM_instruction_vneg.f64-instruction_handler + db 'vneg~~.s16',0x00 + dw ARM_instruction_vneg.s16-instruction_handler + db 'vneg~~.s32',0x00 + dw ARM_instruction_vneg.s32-instruction_handler + db 'vorn~~.i16',0x00 + dw ARM_instruction_vorn.i16-instruction_handler + db 'vorn~~.i32',0x00 + dw ARM_instruction_vorn.i32-instruction_handler + db 'vorr~~.i16',0x00 + dw ARM_instruction_vorr.i16-instruction_handler + db 'vorr~~.i32',0x00 + dw ARM_instruction_vorr.i32-instruction_handler + db 'vpadal.s16',0xe0 + dw ARM_instruction_vpadal.s16-instruction_handler + db 'vpadal.s32',0xe0 + dw ARM_instruction_vpadal.s32-instruction_handler + db 'vpadal.u16',0xe0 + dw ARM_instruction_vpadal.u16-instruction_handler + db 'vpadal.u32',0xe0 + dw ARM_instruction_vpadal.u32-instruction_handler + db 'vpaddl.s16',0xe0 + dw ARM_instruction_vpaddl.s16-instruction_handler + db 'vpaddl.s32',0xe0 + dw ARM_instruction_vpaddl.s32-instruction_handler + db 'vpaddl.u16',0xe0 + dw ARM_instruction_vpaddl.u16-instruction_handler + db 'vpaddl.u32',0xe0 + dw ARM_instruction_vpaddl.u32-instruction_handler + db 'vpadd~~.i8',0x00 + dw ARM_instruction_vpadd.i8-instruction_handler + db 'vpmax~~.s8',0x00 + dw ARM_instruction_vpmax.s8-instruction_handler + db 'vpmax~~.u8',0x00 + dw ARM_instruction_vpmax.u8-instruction_handler + db 'vpmin~~.s8',0x00 + dw ARM_instruction_vpmin.s8-instruction_handler + db 'vpmin~~.u8',0x00 + dw ARM_instruction_vpmin.u8-instruction_handler + db 'vpush~~.32',0x00 + dw ARM_instruction_vpush.32-instruction_handler + db 'vpush~~.64',0x00 + dw ARM_instruction_vpush.64-instruction_handler + db 'vqabs~~.s8',0x00 + dw ARM_instruction_vqabs.s8-instruction_handler + db 'vqadd~~.s8',0x00 + dw ARM_instruction_vqadd.s8-instruction_handler + db 'vqadd~~.u8',0x00 + dw ARM_instruction_vqadd.u8-instruction_handler + db 'vqmovn.s16',0xe0 + dw ARM_instruction_vqmovn.s16-instruction_handler + db 'vqmovn.s32',0xe0 + dw ARM_instruction_vqmovn.s32-instruction_handler + db 'vqmovn.s64',0xe0 + dw ARM_instruction_vqmovn.s64-instruction_handler + db 'vqmovn.u16',0xe0 + dw ARM_instruction_vqmovn.u16-instruction_handler + db 'vqmovn.u32',0xe0 + dw ARM_instruction_vqmovn.u32-instruction_handler + db 'vqmovn.u64',0xe0 + dw ARM_instruction_vqmovn.u64-instruction_handler + db 'vqneg~~.s8',0x00 + dw ARM_instruction_vqneg.s8-instruction_handler + db 'vqrshl.s16',0xe0 + dw ARM_instruction_vqrshl.s16-instruction_handler + db 'vqrshl.s32',0xe0 + dw ARM_instruction_vqrshl.s32-instruction_handler + db 'vqrshl.s64',0xe0 + dw ARM_instruction_vqrshl.s64-instruction_handler + db 'vqrshl.u16',0xe0 + dw ARM_instruction_vqrshl.u16-instruction_handler + db 'vqrshl.u32',0xe0 + dw ARM_instruction_vqrshl.u32-instruction_handler + db 'vqrshl.u64',0xe0 + dw ARM_instruction_vqrshl.u64-instruction_handler + db 'vqshlu.s16',0xe0 + dw ARM_instruction_vqshlu.s16-instruction_handler + db 'vqshlu.s32',0xe0 + dw ARM_instruction_vqshlu.s32-instruction_handler + db 'vqshlu.s64',0xe0 + dw ARM_instruction_vqshlu.s64-instruction_handler + db 'vqshl~~.s8',0x00 + dw ARM_instruction_vqshl.s8-instruction_handler + db 'vqshl~~.u8',0x00 + dw ARM_instruction_vqshl.u8-instruction_handler + db 'vqshrn.s16',0xe0 + dw ARM_instruction_vqshrn.s16-instruction_handler + db 'vqshrn.s32',0xe0 + dw ARM_instruction_vqshrn.s32-instruction_handler + db 'vqshrn.s64',0xe0 + dw ARM_instruction_vqshrn.s64-instruction_handler + db 'vqshrn.u16',0xe0 + dw ARM_instruction_vqshrn.u16-instruction_handler + db 'vqshrn.u32',0xe0 + dw ARM_instruction_vqshrn.u32-instruction_handler + db 'vqshrn.u64',0xe0 + dw ARM_instruction_vqshrn.u64-instruction_handler + db 'vqsub~~.s8',0x00 + dw ARM_instruction_vqsub.s8-instruction_handler + db 'vqsub~~.u8',0x00 + dw ARM_instruction_vqsub.u8-instruction_handler + db 'vrecpe.f32',0xe0 + dw ARM_instruction_vrecpe.f32-instruction_handler + db 'vrecpe.u32',0xe0 + dw ARM_instruction_vrecpe.u32-instruction_handler + db 'vrecps.f32',0xe0 + dw ARM_instruction_vrecps.f32-instruction_handler + db 'vrev16~~.8',0x00 + dw ARM_instruction_vrev16.8-instruction_handler + db 'vrev32~~.8',0x00 + dw ARM_instruction_vrev32.8-instruction_handler + db 'vrev64~~.8',0x00 + dw ARM_instruction_vrev64.8-instruction_handler + db 'vrhadd.s16',0xe0 + dw ARM_instruction_vrhadd.s16-instruction_handler + db 'vrhadd.s32',0xe0 + dw ARM_instruction_vrhadd.s32-instruction_handler + db 'vrhadd.u16',0xe0 + dw ARM_instruction_vrhadd.u16-instruction_handler + db 'vrhadd.u32',0xe0 + dw ARM_instruction_vrhadd.u32-instruction_handler + db 'vrshl~~.s8',0x00 + dw ARM_instruction_vrshl.s8-instruction_handler + db 'vrshl~~.u8',0x00 + dw ARM_instruction_vrshl.u8-instruction_handler + db 'vrshrn.i16',0xe0 + dw ARM_instruction_vrshrn.i16-instruction_handler + db 'vrshrn.i32',0xe0 + dw ARM_instruction_vrshrn.i32-instruction_handler + db 'vrshrn.i64',0xe0 + dw ARM_instruction_vrshrn.i64-instruction_handler + db 'vrshr~~.s8',0x00 + dw ARM_instruction_vrshr.s8-instruction_handler + db 'vrshr~~.u8',0x00 + dw ARM_instruction_vrshr.u8-instruction_handler + db 'vrsra~~.s8',0x00 + dw ARM_instruction_vrsra.s8-instruction_handler + db 'vrsra~~.u8',0x00 + dw ARM_instruction_vrsra.u8-instruction_handler + db 'vseleq.f32',0xf0 + dw ARM_instruction_vseleq.f32-instruction_handler + db 'vseleq.f64',0xf0 + dw ARM_instruction_vseleq.f64-instruction_handler + db 'vselge.f32',0xf0 + dw ARM_instruction_vselge.f32-instruction_handler + db 'vselge.f64',0xf0 + dw ARM_instruction_vselge.f64-instruction_handler + db 'vselgt.f32',0xf0 + dw ARM_instruction_vselgt.f32-instruction_handler + db 'vselgt.f64',0xf0 + dw ARM_instruction_vselgt.f64-instruction_handler + db 'vselvs.f32',0xf0 + dw ARM_instruction_vselvs.f32-instruction_handler + db 'vselvs.f64',0xf0 + dw ARM_instruction_vselvs.f64-instruction_handler + db 'vshll~~.i8',0x00 + dw ARM_instruction_vshll.i8-instruction_handler + db 'vshll~~.s8',0x00 + dw ARM_instruction_vshll.s8-instruction_handler + db 'vshll~~.u8',0x00 + dw ARM_instruction_vshll.u8-instruction_handler + db 'vshl~~.i16',0x00 + dw ARM_instruction_vshl.i16-instruction_handler + db 'vshl~~.i32',0x00 + dw ARM_instruction_vshl.i32-instruction_handler + db 'vshl~~.i64',0x00 + dw ARM_instruction_vshl.i64-instruction_handler + db 'vshl~~.s16',0x00 + dw ARM_instruction_vshl.s16-instruction_handler + db 'vshl~~.s32',0x00 + dw ARM_instruction_vshl.s32-instruction_handler + db 'vshl~~.s64',0x00 + dw ARM_instruction_vshl.s64-instruction_handler + db 'vshl~~.u16',0x00 + dw ARM_instruction_vshl.u16-instruction_handler + db 'vshl~~.u32',0x00 + dw ARM_instruction_vshl.u32-instruction_handler + db 'vshl~~.u64',0x00 + dw ARM_instruction_vshl.u64-instruction_handler + db 'vshr~~.s16',0x00 + dw ARM_instruction_vshr.s16-instruction_handler + db 'vshr~~.s32',0x00 + dw ARM_instruction_vshr.s32-instruction_handler + db 'vshr~~.s64',0x00 + dw ARM_instruction_vshr.s64-instruction_handler + db 'vshr~~.u16',0x00 + dw ARM_instruction_vshr.u16-instruction_handler + db 'vshr~~.u32',0x00 + dw ARM_instruction_vshr.u32-instruction_handler + db 'vshr~~.u64',0x00 + dw ARM_instruction_vshr.u64-instruction_handler + db 'vsra~~.s16',0x00 + dw ARM_instruction_vsra.s16-instruction_handler + db 'vsra~~.s32',0x00 + dw ARM_instruction_vsra.s32-instruction_handler + db 'vsra~~.s64',0x00 + dw ARM_instruction_vsra.s64-instruction_handler + db 'vsra~~.u16',0x00 + dw ARM_instruction_vsra.u16-instruction_handler + db 'vsra~~.u32',0x00 + dw ARM_instruction_vsra.u32-instruction_handler + db 'vsra~~.u64',0x00 + dw ARM_instruction_vsra.u64-instruction_handler + db 'vsubhn.i16',0xe0 + dw ARM_instruction_vsubhn.i16-instruction_handler + db 'vsubhn.i32',0xe0 + dw ARM_instruction_vsubhn.i32-instruction_handler + db 'vsubhn.i64',0xe0 + dw ARM_instruction_vsubhn.i64-instruction_handler + db 'vsubl~~.s8',0x00 + dw ARM_instruction_vsubl.s8-instruction_handler + db 'vsubl~~.u8',0x00 + dw ARM_instruction_vsubl.u8-instruction_handler + db 'vsubw~~.s8',0x00 + dw ARM_instruction_vsubw.s8-instruction_handler + db 'vsubw~~.u8',0x00 + dw ARM_instruction_vsubw.u8-instruction_handler + db 'vsub~~.f32',0x00 + dw ARM_instruction_vsub.f32-instruction_handler + db 'vsub~~.f64',0x00 + dw ARM_instruction_vsub.f64-instruction_handler + db 'vsub~~.i16',0x00 + dw ARM_instruction_vsub.i16-instruction_handler + db 'vsub~~.i32',0x00 + dw ARM_instruction_vsub.i32-instruction_handler + db 'vsub~~.i64',0x00 + dw ARM_instruction_vsub.i64-instruction_handler + db 'walignr0~~',0x00 + dw ARM_instruction_walignr0-instruction_handler + db 'walignr1~~',0x00 + dw ARM_instruction_walignr1-instruction_handler + db 'walignr2~~',0x00 + dw ARM_instruction_walignr2-instruction_handler + db 'walignr3~~',0x00 + dw ARM_instruction_walignr3-instruction_handler + db 'wcmpgtsb~~',0x00 + dw ARM_instruction_wcmpgtsb-instruction_handler + db 'wcmpgtsh~~',0x00 + dw ARM_instruction_wcmpgtsh-instruction_handler + db 'wcmpgtsw~~',0x00 + dw ARM_instruction_wcmpgtsw-instruction_handler + db 'wcmpgtub~~',0x00 + dw ARM_instruction_wcmpgtub-instruction_handler + db 'wcmpgtuh~~',0x00 + dw ARM_instruction_wcmpgtuh-instruction_handler + db 'wcmpgtuw~~',0x00 + dw ARM_instruction_wcmpgtuw-instruction_handler + db 'wmiawbbn~~',0x00 + dw ARM_instruction_wmiawbbn-instruction_handler + db 'wmiawbtn~~',0x00 + dw ARM_instruction_wmiawbtn-instruction_handler + db 'wmiawtbn~~',0x00 + dw ARM_instruction_wmiawtbn-instruction_handler + db 'wmiawttn~~',0x00 + dw ARM_instruction_wmiawttn-instruction_handler + db 'wmulwsmr~~',0x00 + dw ARM_instruction_wmulwsmr-instruction_handler + db 'wmulwumr~~',0x00 + dw ARM_instruction_wmulwumr-instruction_handler + db 'wpackdss~~',0x00 + dw ARM_instruction_wpackdss-instruction_handler + db 'wpackdus~~',0x00 + dw ARM_instruction_wpackdus-instruction_handler + db 'wpackhss~~',0x00 + dw ARM_instruction_wpackhss-instruction_handler + db 'wpackhus~~',0x00 + dw ARM_instruction_wpackhus-instruction_handler + db 'wpackwss~~',0x00 + dw ARM_instruction_wpackwss-instruction_handler + db 'wpackwus~~',0x00 + dw ARM_instruction_wpackwus-instruction_handler + db 'wqmiabbn~~',0x00 + dw ARM_instruction_wqmiabbn-instruction_handler + db 'wqmiabtn~~',0x00 + dw ARM_instruction_wqmiabtn-instruction_handler + db 'wqmiatbn~~',0x00 + dw ARM_instruction_wqmiatbn-instruction_handler + db 'wqmiattn~~',0x00 + dw ARM_instruction_wqmiattn-instruction_handler + db 'wqmulwmr~~',0x00 + dw ARM_instruction_wqmulwmr-instruction_handler + db 'wunpckehsb',0xe0 + dw ARM_instruction_wunpckehsb-instruction_handler + db 'wunpckehsh',0xe0 + dw ARM_instruction_wunpckehsh-instruction_handler + db 'wunpckehsw',0xe0 + dw ARM_instruction_wunpckehsw-instruction_handler + db 'wunpckehub',0xe0 + dw ARM_instruction_wunpckehub-instruction_handler + db 'wunpckehuh',0xe0 + dw ARM_instruction_wunpckehuh-instruction_handler + db 'wunpckehuw',0xe0 + dw ARM_instruction_wunpckehuw-instruction_handler + db 'wunpckelsb',0xe0 + dw ARM_instruction_wunpckelsb-instruction_handler + db 'wunpckelsh',0xe0 + dw ARM_instruction_wunpckelsh-instruction_handler + db 'wunpckelsw',0xe0 + dw ARM_instruction_wunpckelsw-instruction_handler + db 'wunpckelub',0xe0 + dw ARM_instruction_wunpckelub-instruction_handler + db 'wunpckeluh',0xe0 + dw ARM_instruction_wunpckeluh-instruction_handler + db 'wunpckeluw',0xe0 + dw ARM_instruction_wunpckeluw-instruction_handler + db 0 +instructions_11: + db 'cfmadda32~~',0x00 + dw ARM_instruction_cfmadda32-instruction_handler + db 'cfmsuba32~~',0x00 + dw ARM_instruction_cfmsuba32-instruction_handler + db 'coprocessor',0x00 + dw ARM_coprocessor_directive-instruction_handler + db 'sha256h2.32',0xf0 + dw ARM_instruction_sha256h2.32-instruction_handler + db 'shaddsubx~~',0x00 + dw ARM_instruction_shaddsubx-instruction_handler + db 'shsubaddx~~',0x00 + dw ARM_instruction_shsubaddx-instruction_handler + db 'uhaddsubx~~',0x00 + dw ARM_instruction_uhaddsubx-instruction_handler + db 'uhsubaddx~~',0x00 + dw ARM_instruction_uhsubaddx-instruction_handler + db 'uqaddsubx~~',0x00 + dw ARM_instruction_uqaddsubx-instruction_handler + db 'uqsubaddx~~',0x00 + dw ARM_instruction_uqsubaddx-instruction_handler + db 'vabal~~.s16',0x00 + dw ARM_instruction_vabal.s16-instruction_handler + db 'vabal~~.s32',0x00 + dw ARM_instruction_vabal.s32-instruction_handler + db 'vabal~~.u16',0x00 + dw ARM_instruction_vabal.u16-instruction_handler + db 'vabal~~.u32',0x00 + dw ARM_instruction_vabal.u32-instruction_handler + db 'vabdl~~.s16',0x00 + dw ARM_instruction_vabdl.s16-instruction_handler + db 'vabdl~~.s32',0x00 + dw ARM_instruction_vabdl.s32-instruction_handler + db 'vabdl~~.u16',0x00 + dw ARM_instruction_vabdl.u16-instruction_handler + db 'vabdl~~.u32',0x00 + dw ARM_instruction_vabdl.u32-instruction_handler + db 'vacge~~.f32',0x00 + dw ARM_instruction_vacge.f32-instruction_handler + db 'vacgt~~.f32',0x00 + dw ARM_instruction_vacgt.f32-instruction_handler + db 'vacle~~.f32',0x00 + dw ARM_instruction_vacle.f32-instruction_handler + db 'vaclt~~.f32',0x00 + dw ARM_instruction_vaclt.f32-instruction_handler + db 'vaddl~~.s16',0x00 + dw ARM_instruction_vaddl.s16-instruction_handler + db 'vaddl~~.s32',0x00 + dw ARM_instruction_vaddl.s32-instruction_handler + db 'vaddl~~.u16',0x00 + dw ARM_instruction_vaddl.u16-instruction_handler + db 'vaddl~~.u32',0x00 + dw ARM_instruction_vaddl.u32-instruction_handler + db 'vaddw~~.s16',0x00 + dw ARM_instruction_vaddw.s16-instruction_handler + db 'vaddw~~.s32',0x00 + dw ARM_instruction_vaddw.s32-instruction_handler + db 'vaddw~~.u16',0x00 + dw ARM_instruction_vaddw.u16-instruction_handler + db 'vaddw~~.u32',0x00 + dw ARM_instruction_vaddw.u32-instruction_handler + db 'vcmpe~~.f32',0x00 + dw ARM_instruction_vcmpe.f32-instruction_handler + db 'vcmpe~~.f64',0x00 + dw ARM_instruction_vcmpe.f64-instruction_handler + db 'vfnma~~.f32',0x00 + dw ARM_instruction_vfnma.f32-instruction_handler + db 'vfnma~~.f64',0x00 + dw ARM_instruction_vfnma.f64-instruction_handler + db 'vfnms~~.f32',0x00 + dw ARM_instruction_vfnms.f32-instruction_handler + db 'vfnms~~.f64',0x00 + dw ARM_instruction_vfnms.f64-instruction_handler + db 'vhadd~~.s16',0x00 + dw ARM_instruction_vhadd.s16-instruction_handler + db 'vhadd~~.s32',0x00 + dw ARM_instruction_vhadd.s32-instruction_handler + db 'vhadd~~.u16',0x00 + dw ARM_instruction_vhadd.u16-instruction_handler + db 'vhadd~~.u32',0x00 + dw ARM_instruction_vhadd.u32-instruction_handler + db 'vhsub~~.s16',0x00 + dw ARM_instruction_vhsub.s16-instruction_handler + db 'vhsub~~.s32',0x00 + dw ARM_instruction_vhsub.s32-instruction_handler + db 'vhsub~~.u16',0x00 + dw ARM_instruction_vhsub.u16-instruction_handler + db 'vhsub~~.u32',0x00 + dw ARM_instruction_vhsub.u32-instruction_handler + db 'vldmdb~~.32',0x00 + dw ARM_instruction_vldmdb.32-instruction_handler + db 'vldmdb~~.64',0x00 + dw ARM_instruction_vldmdb.64-instruction_handler + db 'vldmea~~.32',0x00 + dw ARM_instruction_vldmea.32-instruction_handler + db 'vldmea~~.64',0x00 + dw ARM_instruction_vldmea.64-instruction_handler + db 'vldmfd~~.32',0x00 + dw ARM_instruction_vldmfd.32-instruction_handler + db 'vldmfd~~.64',0x00 + dw ARM_instruction_vldmfd.64-instruction_handler + db 'vldmia~~.32',0x00 + dw ARM_instruction_vldmia.32-instruction_handler + db 'vldmia~~.64',0x00 + dw ARM_instruction_vldmia.64-instruction_handler + db 'vmlal~~.s16',0x00 + dw ARM_instruction_vmlal.s16-instruction_handler + db 'vmlal~~.s32',0x00 + dw ARM_instruction_vmlal.s32-instruction_handler + db 'vmlal~~.u16',0x00 + dw ARM_instruction_vmlal.u16-instruction_handler + db 'vmlal~~.u32',0x00 + dw ARM_instruction_vmlal.u32-instruction_handler + db 'vmlsl~~.s16',0x00 + dw ARM_instruction_vmlsl.s16-instruction_handler + db 'vmlsl~~.s32',0x00 + dw ARM_instruction_vmlsl.s32-instruction_handler + db 'vmlsl~~.u16',0x00 + dw ARM_instruction_vmlsl.u16-instruction_handler + db 'vmlsl~~.u32',0x00 + dw ARM_instruction_vmlsl.u32-instruction_handler + db 'vmovl~~.s16',0x00 + dw ARM_instruction_vmovl.s16-instruction_handler + db 'vmovl~~.s32',0x00 + dw ARM_instruction_vmovl.s32-instruction_handler + db 'vmovl~~.u16',0x00 + dw ARM_instruction_vmovl.u16-instruction_handler + db 'vmovl~~.u32',0x00 + dw ARM_instruction_vmovl.u32-instruction_handler + db 'vmovn~~.i16',0x00 + dw ARM_instruction_vmovn.i16-instruction_handler + db 'vmovn~~.i32',0x00 + dw ARM_instruction_vmovn.i32-instruction_handler + db 'vmull~~.s16',0x00 + dw ARM_instruction_vmull.s16-instruction_handler + db 'vmull~~.s32',0x00 + dw ARM_instruction_vmull.s32-instruction_handler + db 'vmull~~.u16',0x00 + dw ARM_instruction_vmull.u16-instruction_handler + db 'vmull~~.u32',0x00 + dw ARM_instruction_vmull.u32-instruction_handler + db 'vnmla~~.f32',0x00 + dw ARM_instruction_vnmla.f32-instruction_handler + db 'vnmla~~.f64',0x00 + dw ARM_instruction_vnmla.f64-instruction_handler + db 'vnmls~~.f32',0x00 + dw ARM_instruction_vnmls.f32-instruction_handler + db 'vnmls~~.f64',0x00 + dw ARM_instruction_vnmls.f64-instruction_handler + db 'vnmul~~.f32',0x00 + dw ARM_instruction_vnmul.f32-instruction_handler + db 'vnmul~~.f64',0x00 + dw ARM_instruction_vnmul.f64-instruction_handler + db 'vpadal~~.s8',0x00 + dw ARM_instruction_vpadal.s8-instruction_handler + db 'vpadal~~.u8',0x00 + dw ARM_instruction_vpadal.u8-instruction_handler + db 'vpaddl~~.s8',0x00 + dw ARM_instruction_vpaddl.s8-instruction_handler + db 'vpaddl~~.u8',0x00 + dw ARM_instruction_vpaddl.u8-instruction_handler + db 'vpadd~~.f32',0x00 + dw ARM_instruction_vpadd.f32-instruction_handler + db 'vpadd~~.i16',0x00 + dw ARM_instruction_vpadd.i16-instruction_handler + db 'vpadd~~.i32',0x00 + dw ARM_instruction_vpadd.i32-instruction_handler + db 'vpmax~~.f32',0x00 + dw ARM_instruction_vpmax.f32-instruction_handler + db 'vpmax~~.s16',0x00 + dw ARM_instruction_vpmax.s16-instruction_handler + db 'vpmax~~.s32',0x00 + dw ARM_instruction_vpmax.s32-instruction_handler + db 'vpmax~~.u16',0x00 + dw ARM_instruction_vpmax.u16-instruction_handler + db 'vpmax~~.u32',0x00 + dw ARM_instruction_vpmax.u32-instruction_handler + db 'vpmin~~.f32',0x00 + dw ARM_instruction_vpmin.f32-instruction_handler + db 'vpmin~~.s16',0x00 + dw ARM_instruction_vpmin.s16-instruction_handler + db 'vpmin~~.s32',0x00 + dw ARM_instruction_vpmin.s32-instruction_handler + db 'vpmin~~.u16',0x00 + dw ARM_instruction_vpmin.u16-instruction_handler + db 'vpmin~~.u32',0x00 + dw ARM_instruction_vpmin.u32-instruction_handler + db 'vqabs~~.s16',0x00 + dw ARM_instruction_vqabs.s16-instruction_handler + db 'vqabs~~.s32',0x00 + dw ARM_instruction_vqabs.s32-instruction_handler + db 'vqadd~~.s16',0x00 + dw ARM_instruction_vqadd.s16-instruction_handler + db 'vqadd~~.s32',0x00 + dw ARM_instruction_vqadd.s32-instruction_handler + db 'vqadd~~.s64',0x00 + dw ARM_instruction_vqadd.s64-instruction_handler + db 'vqadd~~.u16',0x00 + dw ARM_instruction_vqadd.u16-instruction_handler + db 'vqadd~~.u32',0x00 + dw ARM_instruction_vqadd.u32-instruction_handler + db 'vqadd~~.u64',0x00 + dw ARM_instruction_vqadd.u64-instruction_handler + db 'vqdmlal.s16',0xe0 + dw ARM_instruction_vqdmlal.s16-instruction_handler + db 'vqdmlal.s32',0xe0 + dw ARM_instruction_vqdmlal.s32-instruction_handler + db 'vqdmlsl.s16',0xe0 + dw ARM_instruction_vqdmlsl.s16-instruction_handler + db 'vqdmlsl.s32',0xe0 + dw ARM_instruction_vqdmlsl.s32-instruction_handler + db 'vqdmulh.s16',0xe0 + dw ARM_instruction_vqdmulh.s16-instruction_handler + db 'vqdmulh.s32',0xe0 + dw ARM_instruction_vqdmulh.s32-instruction_handler + db 'vqdmull.s16',0xe0 + dw ARM_instruction_vqdmull.s16-instruction_handler + db 'vqdmull.s32',0xe0 + dw ARM_instruction_vqdmull.s32-instruction_handler + db 'vqmovun.s16',0xe0 + dw ARM_instruction_vqmovun.s16-instruction_handler + db 'vqmovun.s32',0xe0 + dw ARM_instruction_vqmovun.s32-instruction_handler + db 'vqmovun.s64',0xe0 + dw ARM_instruction_vqmovun.s64-instruction_handler + db 'vqneg~~.s16',0x00 + dw ARM_instruction_vqneg.s16-instruction_handler + db 'vqneg~~.s32',0x00 + dw ARM_instruction_vqneg.s32-instruction_handler + db 'vqrshl~~.s8',0x00 + dw ARM_instruction_vqrshl.s8-instruction_handler + db 'vqrshl~~.u8',0x00 + dw ARM_instruction_vqrshl.u8-instruction_handler + db 'vqrshrn.s16',0xe0 + dw ARM_instruction_vqrshrn.s16-instruction_handler + db 'vqrshrn.s32',0xe0 + dw ARM_instruction_vqrshrn.s32-instruction_handler + db 'vqrshrn.s64',0xe0 + dw ARM_instruction_vqrshrn.s64-instruction_handler + db 'vqrshrn.u16',0xe0 + dw ARM_instruction_vqrshrn.u16-instruction_handler + db 'vqrshrn.u32',0xe0 + dw ARM_instruction_vqrshrn.u32-instruction_handler + db 'vqrshrn.u64',0xe0 + dw ARM_instruction_vqrshrn.u64-instruction_handler + db 'vqshlu~~.s8',0x00 + dw ARM_instruction_vqshlu.s8-instruction_handler + db 'vqshl~~.s16',0x00 + dw ARM_instruction_vqshl.s16-instruction_handler + db 'vqshl~~.s32',0x00 + dw ARM_instruction_vqshl.s32-instruction_handler + db 'vqshl~~.s64',0x00 + dw ARM_instruction_vqshl.s64-instruction_handler + db 'vqshl~~.u16',0x00 + dw ARM_instruction_vqshl.u16-instruction_handler + db 'vqshl~~.u32',0x00 + dw ARM_instruction_vqshl.u32-instruction_handler + db 'vqshl~~.u64',0x00 + dw ARM_instruction_vqshl.u64-instruction_handler + db 'vqshrun.s16',0xe0 + dw ARM_instruction_vqshrun.s16-instruction_handler + db 'vqshrun.s32',0xe0 + dw ARM_instruction_vqshrun.s32-instruction_handler + db 'vqshrun.s64',0xe0 + dw ARM_instruction_vqshrun.s64-instruction_handler + db 'vqsub~~.s16',0x00 + dw ARM_instruction_vqsub.s16-instruction_handler + db 'vqsub~~.s32',0x00 + dw ARM_instruction_vqsub.s32-instruction_handler + db 'vqsub~~.s64',0x00 + dw ARM_instruction_vqsub.s64-instruction_handler + db 'vqsub~~.u16',0x00 + dw ARM_instruction_vqsub.u16-instruction_handler + db 'vqsub~~.u32',0x00 + dw ARM_instruction_vqsub.u32-instruction_handler + db 'vqsub~~.u64',0x00 + dw ARM_instruction_vqsub.u64-instruction_handler + db 'vraddhn.i16',0xe0 + dw ARM_instruction_vraddhn.i16-instruction_handler + db 'vraddhn.i32',0xe0 + dw ARM_instruction_vraddhn.i32-instruction_handler + db 'vraddhn.i64',0xe0 + dw ARM_instruction_vraddhn.i64-instruction_handler + db 'vrev32~~.16',0x00 + dw ARM_instruction_vrev32.16-instruction_handler + db 'vrev64~~.16',0x00 + dw ARM_instruction_vrev64.16-instruction_handler + db 'vrev64~~.32',0x00 + dw ARM_instruction_vrev64.32-instruction_handler + db 'vrhadd~~.s8',0x00 + dw ARM_instruction_vrhadd.s8-instruction_handler + db 'vrhadd~~.u8',0x00 + dw ARM_instruction_vrhadd.u8-instruction_handler + db 'vrshl~~.s16',0x00 + dw ARM_instruction_vrshl.s16-instruction_handler + db 'vrshl~~.s32',0x00 + dw ARM_instruction_vrshl.s32-instruction_handler + db 'vrshl~~.s64',0x00 + dw ARM_instruction_vrshl.s64-instruction_handler + db 'vrshl~~.u16',0x00 + dw ARM_instruction_vrshl.u16-instruction_handler + db 'vrshl~~.u32',0x00 + dw ARM_instruction_vrshl.u32-instruction_handler + db 'vrshl~~.u64',0x00 + dw ARM_instruction_vrshl.u64-instruction_handler + db 'vrshr~~.s16',0x00 + dw ARM_instruction_vrshr.s16-instruction_handler + db 'vrshr~~.s32',0x00 + dw ARM_instruction_vrshr.s32-instruction_handler + db 'vrshr~~.s64',0x00 + dw ARM_instruction_vrshr.s64-instruction_handler + db 'vrshr~~.u16',0x00 + dw ARM_instruction_vrshr.u16-instruction_handler + db 'vrshr~~.u32',0x00 + dw ARM_instruction_vrshr.u32-instruction_handler + db 'vrshr~~.u64',0x00 + dw ARM_instruction_vrshr.u64-instruction_handler + db 'vrsqrte.f32',0xe0 + dw ARM_instruction_vrsqrte.f32-instruction_handler + db 'vrsqrte.u32',0xe0 + dw ARM_instruction_vrsqrte.u32-instruction_handler + db 'vrsqrts.f32',0xe0 + dw ARM_instruction_vrsqrts.f32-instruction_handler + db 'vrsra~~.s16',0x00 + dw ARM_instruction_vrsra.s16-instruction_handler + db 'vrsra~~.s32',0x00 + dw ARM_instruction_vrsra.s32-instruction_handler + db 'vrsra~~.s64',0x00 + dw ARM_instruction_vrsra.s64-instruction_handler + db 'vrsra~~.u16',0x00 + dw ARM_instruction_vrsra.u16-instruction_handler + db 'vrsra~~.u32',0x00 + dw ARM_instruction_vrsra.u32-instruction_handler + db 'vrsra~~.u64',0x00 + dw ARM_instruction_vrsra.u64-instruction_handler + db 'vrsubhn.i16',0xe0 + dw ARM_instruction_vrsubhn.i16-instruction_handler + db 'vrsubhn.i32',0xe0 + dw ARM_instruction_vrsubhn.i32-instruction_handler + db 'vrsubhn.i64',0xe0 + dw ARM_instruction_vrsubhn.i64-instruction_handler + db 'vshll~~.i16',0x00 + dw ARM_instruction_vshll.i16-instruction_handler + db 'vshll~~.i32',0x00 + dw ARM_instruction_vshll.i32-instruction_handler + db 'vshll~~.s16',0x00 + dw ARM_instruction_vshll.s16-instruction_handler + db 'vshll~~.s32',0x00 + dw ARM_instruction_vshll.s32-instruction_handler + db 'vshll~~.u16',0x00 + dw ARM_instruction_vshll.u16-instruction_handler + db 'vshll~~.u32',0x00 + dw ARM_instruction_vshll.u32-instruction_handler + db 'vshrn~~.i16',0x00 + dw ARM_instruction_vshrn.i16-instruction_handler + db 'vshrn~~.i32',0x00 + dw ARM_instruction_vshrn.i32-instruction_handler + db 'vshrn~~.i64',0x00 + dw ARM_instruction_vshrn.i64-instruction_handler + db 'vsqrt~~.f32',0x00 + dw ARM_instruction_vsqrt.f32-instruction_handler + db 'vsqrt~~.f64',0x00 + dw ARM_instruction_vsqrt.f64-instruction_handler + db 'vstmdb~~.32',0x00 + dw ARM_instruction_vstmdb.32-instruction_handler + db 'vstmdb~~.64',0x00 + dw ARM_instruction_vstmdb.64-instruction_handler + db 'vstmea~~.32',0x00 + dw ARM_instruction_vstmea.32-instruction_handler + db 'vstmea~~.64',0x00 + dw ARM_instruction_vstmea.64-instruction_handler + db 'vstmfd~~.32',0x00 + dw ARM_instruction_vstmfd.32-instruction_handler + db 'vstmfd~~.64',0x00 + dw ARM_instruction_vstmfd.64-instruction_handler + db 'vstmia~~.32',0x00 + dw ARM_instruction_vstmia.32-instruction_handler + db 'vstmia~~.64',0x00 + dw ARM_instruction_vstmia.64-instruction_handler + db 'vsubl~~.s16',0x00 + dw ARM_instruction_vsubl.s16-instruction_handler + db 'vsubl~~.s32',0x00 + dw ARM_instruction_vsubl.s32-instruction_handler + db 'vsubl~~.u16',0x00 + dw ARM_instruction_vsubl.u16-instruction_handler + db 'vsubl~~.u32',0x00 + dw ARM_instruction_vsubl.u32-instruction_handler + db 'vsubw~~.s16',0x00 + dw ARM_instruction_vsubw.s16-instruction_handler + db 'vsubw~~.s32',0x00 + dw ARM_instruction_vsubw.s32-instruction_handler + db 'vsubw~~.u16',0x00 + dw ARM_instruction_vsubw.u16-instruction_handler + db 'vsubw~~.u32',0x00 + dw ARM_instruction_vsubw.u32-instruction_handler + db 'wabsdiffb~~',0x00 + dw ARM_instruction_wabsdiffb-instruction_handler + db 'wabsdiffh~~',0x00 + dw ARM_instruction_wabsdiffh-instruction_handler + db 'wabsdiffw~~',0x00 + dw ARM_instruction_wabsdiffw-instruction_handler + db 'waddsubhx~~',0x00 + dw ARM_instruction_waddsubhx-instruction_handler + db 'wsubaddhx~~',0x00 + dw ARM_instruction_wsubaddhx-instruction_handler + db 'wunpckihb~~',0x00 + dw ARM_instruction_wunpckihb-instruction_handler + db 'wunpckihh~~',0x00 + dw ARM_instruction_wunpckihh-instruction_handler + db 'wunpckihw~~',0x00 + dw ARM_instruction_wunpckihw-instruction_handler + db 'wunpckilb~~',0x00 + dw ARM_instruction_wunpckilb-instruction_handler + db 'wunpckilh~~',0x00 + dw ARM_instruction_wunpckilh-instruction_handler + db 'wunpckilw~~',0x00 + dw ARM_instruction_wunpckilw-instruction_handler + db 0 +instructions_12: + db 'cftruncd32~~',0x00 + dw ARM_instruction_cftruncd32-instruction_handler + db 'cftruncs32~~',0x00 + dw ARM_instruction_cftruncs32-instruction_handler + db 'sha256su0.32',0xf0 + dw ARM_instruction_sha256su0.32-instruction_handler + db 'sha256su1.32',0xf0 + dw ARM_instruction_sha256su1.32-instruction_handler + db 'vaddhn~~.i16',0x00 + dw ARM_instruction_vaddhn.i16-instruction_handler + db 'vaddhn~~.i32',0x00 + dw ARM_instruction_vaddhn.i32-instruction_handler + db 'vaddhn~~.i64',0x00 + dw ARM_instruction_vaddhn.i64-instruction_handler + db 'vcvt.f16.f32',0xe0 + dw ARM_instruction_vcvt.f16.f32-instruction_handler + db 'vcvt.f32.f16',0xe0 + dw ARM_instruction_vcvt.f32.f16-instruction_handler + db 'vcvt.f32.f64',0xe0 + dw ARM_instruction_vcvt.f32.f64-instruction_handler + db 'vcvt.f32.s16',0xe0 + dw ARM_instruction_vcvt.f32.s16-instruction_handler + db 'vcvt.f32.s32',0xe0 + dw ARM_instruction_vcvt.f32.s32-instruction_handler + db 'vcvt.f32.u16',0xe0 + dw ARM_instruction_vcvt.f32.u16-instruction_handler + db 'vcvt.f32.u32',0xe0 + dw ARM_instruction_vcvt.f32.u32-instruction_handler + db 'vcvt.f64.f32',0xe0 + dw ARM_instruction_vcvt.f64.f32-instruction_handler + db 'vcvt.f64.s16',0xe0 + dw ARM_instruction_vcvt.f64.s16-instruction_handler + db 'vcvt.f64.s32',0xe0 + dw ARM_instruction_vcvt.f64.s32-instruction_handler + db 'vcvt.f64.u16',0xe0 + dw ARM_instruction_vcvt.f64.u16-instruction_handler + db 'vcvt.f64.u32',0xe0 + dw ARM_instruction_vcvt.f64.u32-instruction_handler + db 'vcvt.s16.f32',0xe0 + dw ARM_instruction_vcvt.s16.f32-instruction_handler + db 'vcvt.s16.f64',0xe0 + dw ARM_instruction_vcvt.s16.f64-instruction_handler + db 'vcvt.s32.f32',0xe0 + dw ARM_instruction_vcvt.s32.f32-instruction_handler + db 'vcvt.s32.f64',0xe0 + dw ARM_instruction_vcvt.s32.f64-instruction_handler + db 'vcvt.u16.f32',0xe0 + dw ARM_instruction_vcvt.u16.f32-instruction_handler + db 'vcvt.u16.f64',0xe0 + dw ARM_instruction_vcvt.u16.f64-instruction_handler + db 'vcvt.u32.f32',0xe0 + dw ARM_instruction_vcvt.u32.f32-instruction_handler + db 'vcvt.u32.f64',0xe0 + dw ARM_instruction_vcvt.u32.f64-instruction_handler + db 'vpadal~~.s16',0x00 + dw ARM_instruction_vpadal.s16-instruction_handler + db 'vpadal~~.s32',0x00 + dw ARM_instruction_vpadal.s32-instruction_handler + db 'vpadal~~.u16',0x00 + dw ARM_instruction_vpadal.u16-instruction_handler + db 'vpadal~~.u32',0x00 + dw ARM_instruction_vpadal.u32-instruction_handler + db 'vpaddl~~.s16',0x00 + dw ARM_instruction_vpaddl.s16-instruction_handler + db 'vpaddl~~.s32',0x00 + dw ARM_instruction_vpaddl.s32-instruction_handler + db 'vpaddl~~.u16',0x00 + dw ARM_instruction_vpaddl.u16-instruction_handler + db 'vpaddl~~.u32',0x00 + dw ARM_instruction_vpaddl.u32-instruction_handler + db 'vqmovn~~.s16',0x00 + dw ARM_instruction_vqmovn.s16-instruction_handler + db 'vqmovn~~.s32',0x00 + dw ARM_instruction_vqmovn.s32-instruction_handler + db 'vqmovn~~.s64',0x00 + dw ARM_instruction_vqmovn.s64-instruction_handler + db 'vqmovn~~.u16',0x00 + dw ARM_instruction_vqmovn.u16-instruction_handler + db 'vqmovn~~.u32',0x00 + dw ARM_instruction_vqmovn.u32-instruction_handler + db 'vqmovn~~.u64',0x00 + dw ARM_instruction_vqmovn.u64-instruction_handler + db 'vqrdmulh.s16',0xe0 + dw ARM_instruction_vqrdmulh.s16-instruction_handler + db 'vqrdmulh.s32',0xe0 + dw ARM_instruction_vqrdmulh.s32-instruction_handler + db 'vqrshl~~.s16',0x00 + dw ARM_instruction_vqrshl.s16-instruction_handler + db 'vqrshl~~.s32',0x00 + dw ARM_instruction_vqrshl.s32-instruction_handler + db 'vqrshl~~.s64',0x00 + dw ARM_instruction_vqrshl.s64-instruction_handler + db 'vqrshl~~.u16',0x00 + dw ARM_instruction_vqrshl.u16-instruction_handler + db 'vqrshl~~.u32',0x00 + dw ARM_instruction_vqrshl.u32-instruction_handler + db 'vqrshl~~.u64',0x00 + dw ARM_instruction_vqrshl.u64-instruction_handler + db 'vqrshrun.s16',0xe0 + dw ARM_instruction_vqrshrun.s16-instruction_handler + db 'vqrshrun.s32',0xe0 + dw ARM_instruction_vqrshrun.s32-instruction_handler + db 'vqrshrun.s64',0xe0 + dw ARM_instruction_vqrshrun.s64-instruction_handler + db 'vqshlu~~.s16',0x00 + dw ARM_instruction_vqshlu.s16-instruction_handler + db 'vqshlu~~.s32',0x00 + dw ARM_instruction_vqshlu.s32-instruction_handler + db 'vqshlu~~.s64',0x00 + dw ARM_instruction_vqshlu.s64-instruction_handler + db 'vqshrn~~.s16',0x00 + dw ARM_instruction_vqshrn.s16-instruction_handler + db 'vqshrn~~.s32',0x00 + dw ARM_instruction_vqshrn.s32-instruction_handler + db 'vqshrn~~.s64',0x00 + dw ARM_instruction_vqshrn.s64-instruction_handler + db 'vqshrn~~.u16',0x00 + dw ARM_instruction_vqshrn.u16-instruction_handler + db 'vqshrn~~.u32',0x00 + dw ARM_instruction_vqshrn.u32-instruction_handler + db 'vqshrn~~.u64',0x00 + dw ARM_instruction_vqshrn.u64-instruction_handler + db 'vrecpe~~.f32',0x00 + dw ARM_instruction_vrecpe.f32-instruction_handler + db 'vrecpe~~.u32',0x00 + dw ARM_instruction_vrecpe.u32-instruction_handler + db 'vrecps~~.f32',0x00 + dw ARM_instruction_vrecps.f32-instruction_handler + db 'vrhadd~~.s16',0x00 + dw ARM_instruction_vrhadd.s16-instruction_handler + db 'vrhadd~~.s32',0x00 + dw ARM_instruction_vrhadd.s32-instruction_handler + db 'vrhadd~~.u16',0x00 + dw ARM_instruction_vrhadd.u16-instruction_handler + db 'vrhadd~~.u32',0x00 + dw ARM_instruction_vrhadd.u32-instruction_handler + db 'vrshrn~~.i16',0x00 + dw ARM_instruction_vrshrn.i16-instruction_handler + db 'vrshrn~~.i32',0x00 + dw ARM_instruction_vrshrn.i32-instruction_handler + db 'vrshrn~~.i64',0x00 + dw ARM_instruction_vrshrn.i64-instruction_handler + db 'vsubhn~~.i16',0x00 + dw ARM_instruction_vsubhn.i16-instruction_handler + db 'vsubhn~~.i32',0x00 + dw ARM_instruction_vsubhn.i32-instruction_handler + db 'vsubhn~~.i64',0x00 + dw ARM_instruction_vsubhn.i64-instruction_handler + db 'wunpckehsb~~',0x00 + dw ARM_instruction_wunpckehsb-instruction_handler + db 'wunpckehsh~~',0x00 + dw ARM_instruction_wunpckehsh-instruction_handler + db 'wunpckehsw~~',0x00 + dw ARM_instruction_wunpckehsw-instruction_handler + db 'wunpckehub~~',0x00 + dw ARM_instruction_wunpckehub-instruction_handler + db 'wunpckehuh~~',0x00 + dw ARM_instruction_wunpckehuh-instruction_handler + db 'wunpckehuw~~',0x00 + dw ARM_instruction_wunpckehuw-instruction_handler + db 'wunpckelsb~~',0x00 + dw ARM_instruction_wunpckelsb-instruction_handler + db 'wunpckelsh~~',0x00 + dw ARM_instruction_wunpckelsh-instruction_handler + db 'wunpckelsw~~',0x00 + dw ARM_instruction_wunpckelsw-instruction_handler + db 'wunpckelub~~',0x00 + dw ARM_instruction_wunpckelub-instruction_handler + db 'wunpckeluh~~',0x00 + dw ARM_instruction_wunpckeluh-instruction_handler + db 'wunpckeluw~~',0x00 + dw ARM_instruction_wunpckeluw-instruction_handler + db 0 +instructions_13: + db 'vcvta.s32.f32',0xf0 + dw ARM_instruction_vcvta.s32.f32-instruction_handler + db 'vcvta.s32.f64',0xf0 + dw ARM_instruction_vcvta.s32.f64-instruction_handler + db 'vcvta.u32.f32',0xf0 + dw ARM_instruction_vcvta.u32.f32-instruction_handler + db 'vcvta.u32.f64',0xf0 + dw ARM_instruction_vcvta.u32.f64-instruction_handler + db 'vcvtb.f16.f32',0xe0 + dw ARM_instruction_vcvtb.f16.f32-instruction_handler + db 'vcvtb.f16.f64',0xe0 + dw ARM_instruction_vcvtb.f16.f64-instruction_handler + db 'vcvtb.f32.f16',0xe0 + dw ARM_instruction_vcvtb.f32.f16-instruction_handler + db 'vcvtb.f64.f16',0xe0 + dw ARM_instruction_vcvtb.f64.f16-instruction_handler + db 'vcvtm.s32.f32',0xf0 + dw ARM_instruction_vcvtm.s32.f32-instruction_handler + db 'vcvtm.s32.f64',0xf0 + dw ARM_instruction_vcvtm.s32.f64-instruction_handler + db 'vcvtm.u32.f32',0xf0 + dw ARM_instruction_vcvtm.u32.f32-instruction_handler + db 'vcvtm.u32.f64',0xf0 + dw ARM_instruction_vcvtm.u32.f64-instruction_handler + db 'vcvtn.s32.f32',0xf0 + dw ARM_instruction_vcvtn.s32.f32-instruction_handler + db 'vcvtn.s32.f64',0xf0 + dw ARM_instruction_vcvtn.s32.f64-instruction_handler + db 'vcvtn.u32.f32',0xf0 + dw ARM_instruction_vcvtn.u32.f32-instruction_handler + db 'vcvtn.u32.f64',0xf0 + dw ARM_instruction_vcvtn.u32.f64-instruction_handler + db 'vcvtp.s32.f32',0xf0 + dw ARM_instruction_vcvtp.s32.f32-instruction_handler + db 'vcvtp.s32.f64',0xf0 + dw ARM_instruction_vcvtp.s32.f64-instruction_handler + db 'vcvtp.u32.f32',0xf0 + dw ARM_instruction_vcvtp.u32.f32-instruction_handler + db 'vcvtp.u32.f64',0xf0 + dw ARM_instruction_vcvtp.u32.f64-instruction_handler + db 'vcvtr.s32.f32',0xe0 + dw ARM_instruction_vcvtr.s32.f32-instruction_handler + db 'vcvtr.s32.f64',0xe0 + dw ARM_instruction_vcvtr.s32.f64-instruction_handler + db 'vcvtr.u32.f32',0xe0 + dw ARM_instruction_vcvtr.u32.f32-instruction_handler + db 'vcvtr.u32.f64',0xe0 + dw ARM_instruction_vcvtr.u32.f64-instruction_handler + db 'vcvtt.f16.f32',0xe0 + dw ARM_instruction_vcvtt.f16.f32-instruction_handler + db 'vcvtt.f16.f64',0xe0 + dw ARM_instruction_vcvtt.f16.f64-instruction_handler + db 'vcvtt.f32.f16',0xe0 + dw ARM_instruction_vcvtt.f32.f16-instruction_handler + db 'vcvtt.f64.f16',0xe0 + dw ARM_instruction_vcvtt.f64.f16-instruction_handler + db 'vqdmlal~~.s16',0x00 + dw ARM_instruction_vqdmlal.s16-instruction_handler + db 'vqdmlal~~.s32',0x00 + dw ARM_instruction_vqdmlal.s32-instruction_handler + db 'vqdmlsl~~.s16',0x00 + dw ARM_instruction_vqdmlsl.s16-instruction_handler + db 'vqdmlsl~~.s32',0x00 + dw ARM_instruction_vqdmlsl.s32-instruction_handler + db 'vqdmulh~~.s16',0x00 + dw ARM_instruction_vqdmulh.s16-instruction_handler + db 'vqdmulh~~.s32',0x00 + dw ARM_instruction_vqdmulh.s32-instruction_handler + db 'vqdmull~~.s16',0x00 + dw ARM_instruction_vqdmull.s16-instruction_handler + db 'vqdmull~~.s32',0x00 + dw ARM_instruction_vqdmull.s32-instruction_handler + db 'vqmovun~~.s16',0x00 + dw ARM_instruction_vqmovun.s16-instruction_handler + db 'vqmovun~~.s32',0x00 + dw ARM_instruction_vqmovun.s32-instruction_handler + db 'vqmovun~~.s64',0x00 + dw ARM_instruction_vqmovun.s64-instruction_handler + db 'vqrshrn~~.s16',0x00 + dw ARM_instruction_vqrshrn.s16-instruction_handler + db 'vqrshrn~~.s32',0x00 + dw ARM_instruction_vqrshrn.s32-instruction_handler + db 'vqrshrn~~.s64',0x00 + dw ARM_instruction_vqrshrn.s64-instruction_handler + db 'vqrshrn~~.u16',0x00 + dw ARM_instruction_vqrshrn.u16-instruction_handler + db 'vqrshrn~~.u32',0x00 + dw ARM_instruction_vqrshrn.u32-instruction_handler + db 'vqrshrn~~.u64',0x00 + dw ARM_instruction_vqrshrn.u64-instruction_handler + db 'vqshrun~~.s16',0x00 + dw ARM_instruction_vqshrun.s16-instruction_handler + db 'vqshrun~~.s32',0x00 + dw ARM_instruction_vqshrun.s32-instruction_handler + db 'vqshrun~~.s64',0x00 + dw ARM_instruction_vqshrun.s64-instruction_handler + db 'vraddhn~~.i16',0x00 + dw ARM_instruction_vraddhn.i16-instruction_handler + db 'vraddhn~~.i32',0x00 + dw ARM_instruction_vraddhn.i32-instruction_handler + db 'vraddhn~~.i64',0x00 + dw ARM_instruction_vraddhn.i64-instruction_handler + db 'vrsqrte~~.f32',0x00 + dw ARM_instruction_vrsqrte.f32-instruction_handler + db 'vrsqrte~~.u32',0x00 + dw ARM_instruction_vrsqrte.u32-instruction_handler + db 'vrsqrts~~.f32',0x00 + dw ARM_instruction_vrsqrts.f32-instruction_handler + db 'vrsubhn~~.i16',0x00 + dw ARM_instruction_vrsubhn.i16-instruction_handler + db 'vrsubhn~~.i32',0x00 + dw ARM_instruction_vrsubhn.i32-instruction_handler + db 'vrsubhn~~.i64',0x00 + dw ARM_instruction_vrsubhn.i64-instruction_handler + db 0 +instructions_14: + db 'vcvt~~.f16.f32',0x00 + dw ARM_instruction_vcvt.f16.f32-instruction_handler + db 'vcvt~~.f32.f16',0x00 + dw ARM_instruction_vcvt.f32.f16-instruction_handler + db 'vcvt~~.f32.f64',0x00 + dw ARM_instruction_vcvt.f32.f64-instruction_handler + db 'vcvt~~.f32.s16',0x00 + dw ARM_instruction_vcvt.f32.s16-instruction_handler + db 'vcvt~~.f32.s32',0x00 + dw ARM_instruction_vcvt.f32.s32-instruction_handler + db 'vcvt~~.f32.u16',0x00 + dw ARM_instruction_vcvt.f32.u16-instruction_handler + db 'vcvt~~.f32.u32',0x00 + dw ARM_instruction_vcvt.f32.u32-instruction_handler + db 'vcvt~~.f64.f32',0x00 + dw ARM_instruction_vcvt.f64.f32-instruction_handler + db 'vcvt~~.f64.s16',0x00 + dw ARM_instruction_vcvt.f64.s16-instruction_handler + db 'vcvt~~.f64.s32',0x00 + dw ARM_instruction_vcvt.f64.s32-instruction_handler + db 'vcvt~~.f64.u16',0x00 + dw ARM_instruction_vcvt.f64.u16-instruction_handler + db 'vcvt~~.f64.u32',0x00 + dw ARM_instruction_vcvt.f64.u32-instruction_handler + db 'vcvt~~.s16.f32',0x00 + dw ARM_instruction_vcvt.s16.f32-instruction_handler + db 'vcvt~~.s16.f64',0x00 + dw ARM_instruction_vcvt.s16.f64-instruction_handler + db 'vcvt~~.s32.f32',0x00 + dw ARM_instruction_vcvt.s32.f32-instruction_handler + db 'vcvt~~.s32.f64',0x00 + dw ARM_instruction_vcvt.s32.f64-instruction_handler + db 'vcvt~~.u16.f32',0x00 + dw ARM_instruction_vcvt.u16.f32-instruction_handler + db 'vcvt~~.u16.f64',0x00 + dw ARM_instruction_vcvt.u16.f64-instruction_handler + db 'vcvt~~.u32.f32',0x00 + dw ARM_instruction_vcvt.u32.f32-instruction_handler + db 'vcvt~~.u32.f64',0x00 + dw ARM_instruction_vcvt.u32.f64-instruction_handler + db 'vqrdmulh~~.s16',0x00 + dw ARM_instruction_vqrdmulh.s16-instruction_handler + db 'vqrdmulh~~.s32',0x00 + dw ARM_instruction_vqrdmulh.s32-instruction_handler + db 'vqrshrun~~.s16',0x00 + dw ARM_instruction_vqrshrun.s16-instruction_handler + db 'vqrshrun~~.s32',0x00 + dw ARM_instruction_vqrshrun.s32-instruction_handler + db 'vqrshrun~~.s64',0x00 + dw ARM_instruction_vqrshrun.s64-instruction_handler + db 'vrinta.f32.f32',0xf0 + dw ARM_instruction_vrinta.f32.f32-instruction_handler + db 'vrinta.f64.f64',0xf0 + dw ARM_instruction_vrinta.f64.f64-instruction_handler + db 'vrintm.f32.f32',0xf0 + dw ARM_instruction_vrintm.f32.f32-instruction_handler + db 'vrintm.f64.f64',0xf0 + dw ARM_instruction_vrintm.f64.f64-instruction_handler + db 'vrintn.f32.f32',0xf0 + dw ARM_instruction_vrintn.f32.f32-instruction_handler + db 'vrintn.f64.f64',0xf0 + dw ARM_instruction_vrintn.f64.f64-instruction_handler + db 'vrintp.f32.f32',0xf0 + dw ARM_instruction_vrintp.f32.f32-instruction_handler + db 'vrintp.f64.f64',0xf0 + dw ARM_instruction_vrintp.f64.f64-instruction_handler + db 'vrintr.f32.f32',0xe0 + dw ARM_instruction_vrintr.f32.f32-instruction_handler + db 'vrintr.f64.f64',0xe0 + dw ARM_instruction_vrintr.f64.f64-instruction_handler + db 'vrintx.f32.f32',0xe0 + dw ARM_instruction_vrintx.f32.f32-instruction_handler + db 'vrintx.f64.f64',0xe0 + dw ARM_instruction_vrintx.f64.f64-instruction_handler + db 'vrintz.f32.f32',0xe0 + dw ARM_instruction_vrintz.f32.f32-instruction_handler + db 'vrintz.f64.f64',0xe0 + dw ARM_instruction_vrintz.f64.f64-instruction_handler + db 0 +instructions_15: + db 'vcvtb~~.f16.f32',0x00 + dw ARM_instruction_vcvtb.f16.f32-instruction_handler + db 'vcvtb~~.f16.f64',0x00 + dw ARM_instruction_vcvtb.f16.f64-instruction_handler + db 'vcvtb~~.f32.f16',0x00 + dw ARM_instruction_vcvtb.f32.f16-instruction_handler + db 'vcvtb~~.f64.f16',0x00 + dw ARM_instruction_vcvtb.f64.f16-instruction_handler + db 'vcvtr~~.s32.f32',0x00 + dw ARM_instruction_vcvtr.s32.f32-instruction_handler + db 'vcvtr~~.s32.f64',0x00 + dw ARM_instruction_vcvtr.s32.f64-instruction_handler + db 'vcvtr~~.u32.f32',0x00 + dw ARM_instruction_vcvtr.u32.f32-instruction_handler + db 'vcvtr~~.u32.f64',0x00 + dw ARM_instruction_vcvtr.u32.f64-instruction_handler + db 'vcvtt~~.f16.f32',0x00 + dw ARM_instruction_vcvtt.f16.f32-instruction_handler + db 'vcvtt~~.f16.f64',0x00 + dw ARM_instruction_vcvtt.f16.f64-instruction_handler + db 'vcvtt~~.f32.f16',0x00 + dw ARM_instruction_vcvtt.f32.f16-instruction_handler + db 'vcvtt~~.f64.f16',0x00 + dw ARM_instruction_vcvtt.f64.f16-instruction_handler + db 0 +instructions_16: + db 'vrintr~~.f32.f32',0x00 + dw ARM_instruction_vrintr.f32.f32-instruction_handler + db 'vrintr~~.f64.f64',0x00 + dw ARM_instruction_vrintr.f64.f64-instruction_handler + db 'vrintx~~.f32.f32',0x00 + dw ARM_instruction_vrintx.f32.f32-instruction_handler + db 'vrintx~~.f64.f64',0x00 + dw ARM_instruction_vrintx.f64.f64-instruction_handler + db 'vrintz~~.f32.f32',0x00 + dw ARM_instruction_vrintz.f32.f32-instruction_handler + db 'vrintz~~.f64.f64',0x00 + dw ARM_instruction_vrintz.f64.f64-instruction_handler + db 0 +instructions_end: +purge dw diff --git a/source/armv8.inc b/source/armv8.inc new file mode 100644 index 0000000..5dda0b6 --- /dev/null +++ b/source/armv8.inc @@ -0,0 +1,30304 @@ +; NOTE: This software is under the same copyright as FASM with only the +; copyright holder name changed. + +; ARMv8 assembler core module v1.44 for flat assembler, +; Copyright (c) 2005-2023, revolution. +; All rights reserved. + +; This program is free for commercial and non-commercial use as long as +; the following conditions are adhered to. + +; Copyright remains revolution, and as such any Copyright notices +; in the code are not to be removed. + +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are +; met: + +; 1. Redistributions of source code must retain the above copyright notice, +; this list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. + +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR +; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +; The licence and distribution terms for any publically available +; version or derivative of this code cannot be changed. i.e. this code +; cannot simply be copied and put under another distribution licence +; (including the GNU Public Licence). + +; For best viewing pleasure use a tab stop of 8 characters and fixed +; spacing font + +; Not everything matches the ARM ADS assembly style, where possible the +; original style is used but there are some differences +; 1) label names cannot begin with a digit +; 2) CPSIE and CPSID formats are changed, use "iflags_aif" form instead of +; "aif" (eg. "CPSIE iflags_i" instead of "CPSID i") +; 3) SRS with writeback must have a separating space after the mode number +; and before "!" (eg. "SRSDB 16 !" instead of "SRSDB 16!") +; 4) macro, rept, irp, format, if, virtual etc. are all significant changes +; from the ARM ADS, so you will need to re-write those sections of +; existing code + +ARM_VERSION_STRING equ "1.44" +ARM_VERSION_MAJOR = 1 +ARM_VERSION_MINOR = 44 + +;outline of [code_type] bits + +CPU_ACTIVITY_THUMB_NON_UAL = 1 shl 1 ;1 for THUMB_NON_UAL mode, 0 for ARM or THUMB_UAL mode +CPU_ACTIVITY_THUMB_UAL = 1 shl 2 ;1 for THUMB_UAL mode, 0 for ARM or THUMB_NON_UAL mode +CPU_ACTIVITY_ARM = 1 shl 3 ;1 for ARM mode, 0 for THUMB_NON_UAL or THUMB_UAL mode +CPU_ACTIVITY_UNKNOWN = 1 shl 4 ;this the default at startup +CPU_ACTIVITY_THUMBEE = 1 shl 5 ;1 for THUMBEE mode when CPU_ACTIVITY_THUMB_UAL is active +CPU_ACTIVITY_ARM64 = 1 shl 6 ;1 for ARM64 code + +CPU32_CAPABILITY_26BIT = 0 +CPU32_CAPABILITY_V1 = 1 +CPU32_CAPABILITY_V2 = 2 +CPU32_CAPABILITY_A = 3 +CPU32_CAPABILITY_V3 = 4 +CPU32_CAPABILITY_M = 5 +CPU32_CAPABILITY_V4 = 6 +CPU32_CAPABILITY_V4T = 7 +CPU32_CAPABILITY_V5 = 8 +CPU32_CAPABILITY_V5T = 9 +CPU32_CAPABILITY_E = 10 +CPU32_CAPABILITY_P = 11 +CPU32_CAPABILITY_J = 12 +CPU32_CAPABILITY_X = 13 +CPU32_CAPABILITY_V6 = 14 +CPU32_CAPABILITY_V6T = 15 +CPU32_CAPABILITY_ALIGN = 16 +CPU32_CAPABILITY_K = 17 +CPU32_CAPABILITY_Z = 18 +CPU32_CAPABILITY_6M = 19 +CPU32_CAPABILITY_7M = 20 +CPU32_CAPABILITY_T2 = 21 +CPU32_CAPABILITY_V7 = 22 +CPU32_CAPABILITY_SYNC = 23 +CPU32_CAPABILITY_DIV = 24 +CPU32_CAPABILITY_T2EE = 25 +CPU32_CAPABILITY_MP = 26 +CPU32_CAPABILITY_VE = 27 +CPU32_CAPABILITY_V8 = 28 ;v8 instructions in ARM32 and THUMB modes +CPU32_CAPABILITY_CRC = 29 ;CRC instructions in ARM32 and THUMB modes + +COPRO_CAPABILITY_FPA_V1 = 0 +COPRO_CAPABILITY_FPA_V2 = 1 +COPRO_CAPABILITY_MAVERICK = 2 +COPRO_CAPABILITY_VFP_V1xD = 3 +COPRO_CAPABILITY_VFP_V1 = 4 +COPRO_CAPABILITY_VFP_V2 = 5 +COPRO_CAPABILITY_VFP_V3 = 6 +COPRO_CAPABILITY_VFP_D32 = 7 +COPRO_CAPABILITY_VFP_HP = 8 +COPRO_CAPABILITY_XSCALE = 9 +COPRO_CAPABILITY_IWMMXT_V1 = 10 +COPRO_CAPABILITY_IWMMXT_V2 = 11 +COPRO_CAPABILITY_SIMD_INT = 12 +COPRO_CAPABILITY_SIMD_FLOAT = 13 +COPRO_CAPABILITY_SIMD_HP = 14 +COPRO_CAPABILITY_VFP_V4 = 15 +COPRO_CAPABILITY_SIMD_V2 = 16 +COPRO_CAPABILITY_SIMD_V8 = 17 +COPRO_CAPABILITY_SIMD_CRYPTO = 18 + +CPU_CAPABILITY_DEFAULT =\ + 1 shl CPU32_CAPABILITY_26BIT +\ + 1 shl CPU32_CAPABILITY_V1 +\ + 1 shl CPU32_CAPABILITY_V2 +\ + 1 shl CPU32_CAPABILITY_A +\ + 1 shl CPU32_CAPABILITY_V3 +\ + 1 shl CPU32_CAPABILITY_M +\ + 1 shl CPU32_CAPABILITY_V4 +\ + 1 shl CPU32_CAPABILITY_V4T +\ + 1 shl CPU32_CAPABILITY_V5 +\ + 1 shl CPU32_CAPABILITY_V5T +\ + 1 shl CPU32_CAPABILITY_E +\ + 1 shl CPU32_CAPABILITY_P +\ + 1 shl CPU32_CAPABILITY_J +\ + 1 shl CPU32_CAPABILITY_X +\ + 1 shl CPU32_CAPABILITY_V6 +\ + 1 shl CPU32_CAPABILITY_V6T +\ + 1 shl CPU32_CAPABILITY_ALIGN +\ + 1 shl CPU32_CAPABILITY_K +\ + 1 shl CPU32_CAPABILITY_Z +\ + 1 shl CPU32_CAPABILITY_6M +\ + 1 shl CPU32_CAPABILITY_7M +\ + 1 shl CPU32_CAPABILITY_T2 +\ + 1 shl CPU32_CAPABILITY_V7 +\ + 1 shl CPU32_CAPABILITY_SYNC +\ + 1 shl CPU32_CAPABILITY_DIV +\ + 1 shl CPU32_CAPABILITY_T2EE +\ + 1 shl CPU32_CAPABILITY_MP +\ + 1 shl CPU32_CAPABILITY_VE +\ + 1 shl CPU32_CAPABILITY_V8 +\ + 1 shl CPU32_CAPABILITY_CRC + +COPRO_CAPABILITY_DEFAULT =\ + 1 shl COPRO_CAPABILITY_FPA_V1 +\ + 1 shl COPRO_CAPABILITY_FPA_V2 +\ + 1 shl COPRO_CAPABILITY_MAVERICK +\ + 1 shl COPRO_CAPABILITY_VFP_V1xD +\ + 1 shl COPRO_CAPABILITY_VFP_V1 +\ + 1 shl COPRO_CAPABILITY_VFP_V2 +\ + 1 shl COPRO_CAPABILITY_VFP_V3 +\ + 1 shl COPRO_CAPABILITY_VFP_D32 +\ + 1 shl COPRO_CAPABILITY_VFP_HP +\ + 1 shl COPRO_CAPABILITY_XSCALE +\ + 1 shl COPRO_CAPABILITY_IWMMXT_V1 +\ + 1 shl COPRO_CAPABILITY_IWMMXT_V2 +\ + 1 shl COPRO_CAPABILITY_SIMD_INT +\ + 1 shl COPRO_CAPABILITY_SIMD_FLOAT +\ + 1 shl COPRO_CAPABILITY_SIMD_HP +\ + 1 shl COPRO_CAPABILITY_VFP_V4 +\ + 1 shl COPRO_CAPABILITY_SIMD_V2 +\ + 1 shl COPRO_CAPABILITY_SIMD_V8 +\ + 1 shl COPRO_CAPABILITY_SIMD_CRYPTO + +CPU64_CAPABILITY_V8 = 32 ;v8 instructions in ARM64 mode +CPU64_CAPABILITY_FP = CPU64_CAPABILITY_V8 + 1 ;floating point instructions in ARM64 mode +CPU64_CAPABILITY_SIMD = CPU64_CAPABILITY_FP + 1 ;SIMD instructions in ARM64 mode +CPU64_CAPABILITY_CRC = CPU64_CAPABILITY_SIMD + 1 ;CRC instructions in ARM64 mode +CPU64_CAPABILITY_CRYPTO = CPU64_CAPABILITY_CRC + 1 ;cryptography instructions in ARM64 mode + +CPU32_CAPABILITY_ALL = CPU_CAPABILITY_DEFAULT +COPRO_CAPABILITY_ALL = COPRO_CAPABILITY_DEFAULT +CPU64_CAPABILITY_ALL =\ + 1 shl CPU64_CAPABILITY_V8 +\ + 1 shl CPU64_CAPABILITY_FP +\ + 1 shl CPU64_CAPABILITY_SIMD +\ + 1 shl CPU64_CAPABILITY_CRC +\ + 1 shl CPU64_CAPABILITY_CRYPTO + +ARM_code = CPU_ACTIVITY_ARM + +FLAG_BIT_CONDITION_SET = 0 +FLAG_BIT_FORCE_WIDE = 1 +FLAG_BIT_FORCE_NARROW = 2 +FLAG_BIT_FORCE_AUTO_WIDE = 3 + +FLAG_CONDITION_SET = 1 shl FLAG_BIT_CONDITION_SET +FLAG_FORCE_WIDE = 1 shl FLAG_BIT_FORCE_WIDE +FLAG_FORCE_NARROW = 1 shl FLAG_BIT_FORCE_NARROW +FLAG_FORCE_AUTO_WIDE = 1 shl FLAG_BIT_FORCE_AUTO_WIDE + +CONDITION_SEARCH_CHARACTER = '~' + +;undefined instruction space, we use this for triggering unencodable instructions +;xxxx_0111_1111_xxxx_xxxx_xxxx_1111_xxxx x7fxxxfx arm + +UNENCODEABLE_INSTRUCTION_ARM = 0xf7ffffff + +THUMB_FLAG_NOT_INSIDE_IT = 1 shl 0 ;not allowable inside an IT block +THUMB_FLAG_ONLY_INSIDE_IT = 1 shl 1 ;only allowable inside an IT block +THUMB_FLAG_ONLY_LAST_IT = 1 shl 2 ;only allowable as last instruction of an IT block +THUMB_FLAG_IS_BCC = 1 shl 3 ;special Bcc opcodes are conditional but exist outside an IT block + +ARM_INSTRUCTION_OPCODE_AND = 0000b +ARM_INSTRUCTION_OPCODE_EOR = 0001b +ARM_INSTRUCTION_OPCODE_SUB = 0010b +ARM_INSTRUCTION_OPCODE_RSB = 0011b +ARM_INSTRUCTION_OPCODE_ADD = 0100b +ARM_INSTRUCTION_OPCODE_ADC = 0101b +ARM_INSTRUCTION_OPCODE_SBC = 0110b +ARM_INSTRUCTION_OPCODE_RSC = 0111b +ARM_INSTRUCTION_OPCODE_TST = 1000b +ARM_INSTRUCTION_OPCODE_TEQ = 1001b +ARM_INSTRUCTION_OPCODE_CMP = 1010b +ARM_INSTRUCTION_OPCODE_CMN = 1011b +ARM_INSTRUCTION_OPCODE_ORR = 1100b +ARM_INSTRUCTION_OPCODE_MOV = 1101b +ARM_INSTRUCTION_OPCODE_BIC = 1110b +ARM_INSTRUCTION_OPCODE_MVN = 1111b + +ARM_SHIFT_OPCODE_LSL = 0 +ARM_SHIFT_OPCODE_LSR = 1 +ARM_SHIFT_OPCODE_ASR = 2 +ARM_SHIFT_OPCODE_ROR = 3 + +THUMB_INSTRUCTION_OPCODE_AND = 0000b +THUMB_INSTRUCTION_OPCODE_EOR = 0001b +THUMB_INSTRUCTION_OPCODE_LSL = 0010b +THUMB_INSTRUCTION_OPCODE_LSR = 0011b +THUMB_INSTRUCTION_OPCODE_ASR = 0100b +THUMB_INSTRUCTION_OPCODE_ADC = 0101b +THUMB_INSTRUCTION_OPCODE_SBC = 0110b +THUMB_INSTRUCTION_OPCODE_ROR = 0111b +THUMB_INSTRUCTION_OPCODE_TST = 1000b +THUMB_INSTRUCTION_OPCODE_NEG = 1001b +THUMB_INSTRUCTION_OPCODE_CMP = 1010b +THUMB_INSTRUCTION_OPCODE_CMN = 1011b +THUMB_INSTRUCTION_OPCODE_ORR = 1100b +THUMB_INSTRUCTION_OPCODE_MUL = 1101b +THUMB_INSTRUCTION_OPCODE_BIC = 1110b +THUMB_INSTRUCTION_OPCODE_MVN = 1111b + +SIMD_REG_LIST_TYPE_REGISTER = 0 ;dy +SIMD_REG_LIST_TYPE_ELEMENT = 1 ;dy[x] +SIMD_REG_LIST_TYPE_VECTOR = 2 ;dy[] + +IT_MODE_AUTO = 1 + +;conditions for choosing 16 bit thumb when two options are available: +; OPs reg,... - always encoded as short unless forced by a condition or explicit IT block +; OP reg,... - default encoded as long. If the preceeding instruction was the same type, +; then if the preceeding instruction was encoded as long we recode it as +; short+short (IT + movs reg1,reg2 i.e. to begin the IT block), or if there +; are still remaining slots available in a previous IT block, then we encode +; this instruction as short (movs reg1,reg2) and extend the previous IT block. + + ;renamed variables in X86_64 +label force_wide_flag dword at address_high +label IT_anchor_distance byte at segment_register + ;renamed variables in preprocessor for our use +label potential_IT_anchor dword at macro_line +label explicit_IT_state dword at macro_block +label current_IT_block dword at macro_block_line +label thumb32_error dword at macro_block_line_number +label thumb16_error dword at macro_symbols +label thumb32_instruction dword at struc_name + arm64_instruction equ thumb32_instruction +label thumb16_instruction word at struc_label +label anchor_instruction word at struc_label+2 +label arm_instruction dword at instant_macro_start + arm64_instruction2 equ arm_instruction +label reg_list_bitmap dword at parameters_end + label simd_reg_list_first byte at parameters_end+0 + label simd_reg_list_count byte at parameters_end+1 + label simd_reg_list_x byte at parameters_end+2 + label simd_reg_list_type byte at parameters_end+3 +label operand_registers dword at locals_counter + label operand_register0 byte at locals_counter+0 + label operand_register1 byte at locals_counter+1 + label operand_register2 byte at locals_counter+2 + label operand_register3 byte at locals_counter+3 + label instruction_condition byte at locals_counter+4 + label instruction_shift_op byte at locals_counter+5 + label copro_opcode1 byte at locals_counter+6 + label copro_opcode2 byte at locals_counter+7 +label cpu_capability_flags2 dword at default_argument_value +label immediate_value_high dword at initial_definitions +label it_control byte at macro_status + ;renamed variables in parser for our use +label immediate_value dword at current_locals_prefix +label immediate_value2 dword at anonymous_reverse + label current_reg_number byte at anonymous_forward+0 + label current_parameter byte at anonymous_forward+1 + label thumb_flags_16 byte at anonymous_forward+2 + label thumb_flags_32 byte at anonymous_forward+3 +label cpu_capability_flags dword at label_hash +label copro_capability_flags dword at label_leaf +label ARM_error_line dword at parsed_lines + ;renamed variables in AVX for our use +label first_global_symbol dword at uncompressed_displacement + ;renamed variables in x64 for our use +label can_swap_rm_rn byte at rex_prefix + +irpv any, esp { + irp reg,ax,bx,cx,dx,si,di,sp,bp \{ v\#reg equ r\#reg \} + __is_64 = 1 +rept 0 {} rept 1 { + irp reg,ax,bx,cx,dx,si,di,sp,bp \{ v\#reg equ e\#reg \} + __is_64 = 0 + ;remove this macro if you want to drop support for processors that don't have CMOVcc + irp cc,a,ae,b,be,c,e,g,ge,l,le,na,nae,nb,nbe,nc,ne,ng,nge,nl,nle,no,np,ns,nz,o,p,pe,po,s,z \{ + local i + macro cmov#cc [args] \\{ + \\common + \\local .x + j#cc .x + load i from $-2 + store (i xor 1) at $-2 + mov args + .x: + \\} + \} +} + +patch_error_displayed = 0 +macro patch labl,instr_search,instr_replace,offset { + local expecting, length, new, a, b + macro display_nibble value \{ + local nibble + nibble=(value) and 0fh + '0' + if nibble > '9' + nibble=nibble - '9' - 1 + 'a' + end if + display nibble + \} + macro display_hex prefix, address, length \{ + display prefix + while % <= length + load a byte from address + % - 1 + display_nibble a shr 4 + display_nibble a + display ' ' + end while + display 13, 10 + \} + virtual at labl + offset + expecting:: + irp i,instr_search\{i\} + length = $ - $$ + end virtual + virtual at labl + offset + new:: + irp i,instr_replace\{i\} + if $ - $$ <= length + times (length + $$ - $) nop + else + if ~ patch_error_displayed + display $ - $$ - length + '0', " too many bytes", 13, 10 + patch_error_displayed = 1 + rb -1 ; "Instruction patch is too long" + end if + end if + end virtual + while % <= length + load a byte from labl + offset + % - 1 + load b byte from expecting:labl + offset + % - 1 + if a <> b + if ~ patch_error_displayed + display_hex '-16: ', labl + offset - 16, 16 + display_hex '+00: ', labl + offset + 00, 16 + display_hex '+16: ', labl + offset + 16, 16 + display_hex 'this ', expecting:labl + offset, length + patch_error_displayed = 1 + rb -1 ; "Mismatched instructions for patch" + end if + end if + end while + while % <= length + load a byte from new:labl + offset + % - 1 + store byte a at labl + offset + % - 1 + end while + purge display_nibble, display_hex +} + +macro override labl, instr { + local new, length, a + virtual at labl + new:: + irp i,instr{i\} + length = $ - $$ + end virtual + while % <= length + load a byte from new:labl + % - 1 + store byte a at labl + % - 1 + end while +} + +;All patches are done here + +;patch to add FIT operator + + patch calculation_loop, , , 123 + __is_64 * 2 + +;patches to add PROCESSOR operator + + patch parse_instruction_arguments,\ + <,je allow_embedded_instruction>,\ + , 0 + patch parse_argument, <,je separator>, , 160 + __is_64 * 2 + patch operator_argument,, , 58 + __is_64 * 8 + patch negation_ok, , , 37 + __is_64 * 8 + +;patches to save IT data inside virtual blocks + + patch addressing_space_extension_ok, , , 60 + __is_64 * 24 + patch continue_virtual_area, , , 182 + __is_64 * 46 + patch end_virtual, , , 0 + +;patch to inhibit IT block generation across labels + + patch assemble_line, , , 35 + __is_64 * 2 + +;two patches to catch the format arguments + + patch parse_instruction_arguments,<>,<>,88 + patch parse_instruction_arguments,<>,<>,95 + +;three patches for ELF format + + patch format_elf, \ + <, \ + , \ + , \ + , \ + , \ + , \ + >, \ + <, \ + , \ + , \ + >, \ + 48 + __is_64 * 3 + patch format_elf, <>, <>, 74 + __is_64 * 10 ;CODE32 + patch format_elf64, \ + <, \ + , \ + , \ + , \ + , \ + , \ + >, \ + <, \ + , \ + , \ + >, \ + 32 + __is_64 * 3 + patch elf_exe_brand_ok, <>, <>, 0 + +;nine patches for PE format + + patch format_pe, <>, <>, 2 ;ARM + patch format_pe, <>, <>, 11 ;WinCE + patch format_pe, <>, <>, 20 ;3.0 + patch format_pe, <>, <>, 30 + patch pe_settings, <>, <>, -19 + patch init_peplus_specific,<>, <>, 4 + __is_64 + patch pe_org_ok, <>, <>, 14 ;CODE32 + patch new_section, <>, <>, 83 + __is_64 * 31 ;CODE32 + patch pe_alignment_ok, <>,\ + <>, 0 + +;three patches to allow {} around register lists and custom address formats + + patch parse_argument, <,je address_argument>, <,je ARM_square_parser>, 99 + __is_64 * 2 + patch parse_argument, <,je open_decorator>, <,je ARM_curly_parser>, 115 + __is_64 * 2 + patch parse_argument, <,je unallowed_character>, <,je separator>, 131 + __is_64 * 2 + +;a patch for setting the alignment bytes to 0xff + + patch nops, <>, <>, 0 + +;patch to give us control when the code stream has finished being assembled + + macro finish_elf_exe_patch_code { mov ebx,[number_of_sections] } + patch finish_elf_segment, finish_elf_exe_patch_code, jmp ARM_finish_elf_segment, 0 + +;patch the reset state at beginning of assembly passes + + patch pass_loop, , , 0 + +;patch to allow alternative half-precision number range + + patch fp_word_ok, , , 8 + +;patch to use a custom instruction searcher to convert '~~' to conditionals + + override get_instruction, jmp ARM_get_instruction + +;patch to allow skipping of commas inside address expressions + + override skip_address, jmp skip_done + +;patch to allow %p and %c predefined variables + + override get_predefined_id, jmp ARM_get_predefined_id ;in PARSER.INC + override predefined_label, jmp ARM_predefined_label ;in EXPRCALC.INC + +;patch to use a custom instruction handler to store address of line start + + override instruction_handler, jmp ARM_instruction_handler + +;patch to disable use of 0x13 as code type setting (this is now a directive) + + patch assemble_line, , , 61 + __is_64 * 2 + +;patches to recognise base address registers in virtual + + patch symbol_value, <>, , 46 + __is_64 * 12 + patch address_size_ok, <,>, , 52 + __is_64 * 5 + +;patch to allow for 17 character symbols + + patch get_symbol, <>,<>,10 + __is_64 * 7 + +;seven patches for the IDE caption + + if defined _caption + + patch convert_table, ,,256 + patch loading_error, ,,26 + patch not_enough_mem, ,,23 + patch move_file_name, ,,76 + patch open_single_file, ,,52 + patch run_object, ,,2 + patch drop_files, ,,102 + + ARM_push_caption: + mov eax,_logo + xchg eax,[esp] + jmp vax + + end if + +;patch the error_summary_dialog to show the full error message by wrapping the text + +macro dialogitem class,title,id,x,y,cx,cy,style,exstyle { + if (style) and SS_LEFTNOWORDWRAP = SS_LEFTNOWORDWRAP ;check for error_summary_dialog message item + dialogitem class,,id,x,y-5,cx,cy+16,(style) and (not SS_LEFTNOWORDWRAP),exstyle + else + dialogitem class,<title>,id,x,y,cx,cy,style,exstyle + end if +} + +;ARM, ARM64, THUMB and THUMB_T2 encodings are sufficiently different that we use separate decoding code for each. +;The basic premise is that we decode all three together as much a possible using the templates. +;We decode the parameters and then split into each separate encoder once basic syntax checks are passed. +;Once split off, specific invalid encodings are checked by each encoder. +; +;In T2 mode, the IT instruction is checked by a common handler function and it is possible that previous +;instructions will be recoded if IT prediction was sub-optimal or invalid. + +;decoder template definitions: + +align 4 + +struc make_template_entry [name] { + common + local counter + counter = 0 + forward + dd decode_template.#name + name = counter + counter = counter + 1 +} + +template_decode_table make_template_entry \ + TMPL_modifier_exclaim ,\;'!' + TMPL_modifier_translate ,\;'^' + TMPL_cpu_sel ,\;cpu32_*, cpu64_* + TMPL_copro_sel ,\;copro32_ + TMPL_copro_opcode1 ,\;imm + TMPL_copro_opcode2 ,\;imm + TMPL_EOL ,\;0xf + TMPL_base_reg ,\;r0-r15 + TMPL_base_reg! ,\;r0!-r15! + TMPL_cpro_sel ,\;p0-p15 + TMPL_cpro_reg ,\;c0-c15 + TMPL_endian ,\;le,be + TMPL_shift_op ,\;lsl,lsr,asr,ror + TMPL_shift_op3 ,\;lsl,lsr,asr + TMPL_rrx_op ,\;rrx + TMPL_lsl ,\;lsl + TMPL_msl ,\;msl + TMPL_vfps_reg ,\;s0-s31 + TMPL_vfpd_reg ,\;d0-d31 + TMPL_acc_40bt ,\;acc0-acc7 + TMPL_vfp_syst ,\;vfp_syst + TMPL_iflags ,\;iflags_* + TMPL_psr ,\;cpsr_*,spsr_* + TMPL_imm ,\;'(' + TMPL_imm2 ,\;'(' + TMPL_imm64 ,\;64-bit immediates + TMPL_bracket_left ,\;'[' + TMPL_bracket_right ,\;']' + TMPL_reg_list ,\;'{..}' + TMPL_vfp_reg_list_s ,\;'{..}' + TMPL_vfp_reg_list_d ,\;'{..}' + TMPL_add_sub_reg ,\;-rm, +rm + TMPL_expression ,\;implicit or explicit reg + offset + TMPL_address ,\;code address immediate + TMPL_address64 ,\;64-bit code address immediate + TMPL_option ,\;{imm} + TMPL_comma ,\;, + TMPL_iwmmx_wreg ,\;wr0-wr15 + TMPL_iwmmx_creg ,\;iwmmx_creg + TMPL_mvrk_areg ,\;a0-a3 + TMPL_mvrk_psc ,\;dspsc + TMPL_fpa_freg ,\;f0-f7 + TMPL_imm_float ,\;float + TMPL_barrier ,\;barrier + TMPL_condition ,\;conditions + TMPL_condition_nv ,\;conditions with nv + TMPL_simd_qreg ,\;q0-q15 + TMPL_vfpdx_reg ,\;d0[x]-d31[x] x=0-7 + TMPL_simd_reg_list ,\;{d0,d1,...}, {d0,d2,...}, {d0[x],d1[x],...}, {d0[x],d2[x],...}, {d0[],d1[],...}, {d0[],d2[],...} + TMPL_address_reg@ ,\;r0@x-r15@x + TMPL_sysm_reg ,\;apsr, iapsr, eapsr, xpsr, ipsr, epsr, iepsr, msp, psp, primask, basepri, basepri_max, faultmask, control + TMPL_banked_reg ,\;banked registers for MSR/MRS access + TMPL_word_z_reg ,\;32-bit w0-w30,wzr + TMPL_word_s_reg ,\;32-bit w0-w30,wsp + TMPL_dword_z_reg ,\;64-bit x0-x30,xzr + TMPL_dword_s_reg ,\;64-bit x0-x30,sp + TMPL_word_gen_reg ,\;32-bit w0-w30 + TMPL_word_zr_reg ,\;32-bit wzr + TMPL_word_sp_reg ,\;32-bit wsp + TMPL_dword_gen_reg ,\;64-bit x0-x30 + TMPL_dword_zr_reg ,\;64-bit xzr + TMPL_dword_sp_reg ,\;64-bit sp + TMPL_vect_breg ,\;b0-b31 + TMPL_vect_hreg ,\;h0-h31 + TMPL_vect_sreg ,\;s0-s31 + TMPL_vect_dreg ,\;d0-d31 + TMPL_vect_qreg ,\;q0-q31 + TMPL_vect_v8b ,\;v0.8b-v31.8b + TMPL_vect_v16b ,\;v0.16b-v31.16b + TMPL_vect_v4h ,\;v0.4h-v31.4h + TMPL_vect_v8h ,\;v0.8h-v31.8h + TMPL_vect_v2s ,\;v0.2s-v31.2s + TMPL_vect_v4s ,\;v0.4s-v31.4s + TMPL_vect_v1d ,\;v0.1d-v31.1d + TMPL_vect_v2d ,\;v0.2d-v31.2d + TMPL_vect_v1q ,\;v0.1q-v31.1q + TMPL_extend ,\;[su]xt[]bhwx] + TMPL_always ,\;always match everything + TMPL_never ,\;never match anything + TMPL_at_op ,\;at ops + TMPL_dc_op ,\;dc ops + TMPL_ic_op ,\;ic ops + TMPL_tlbi_op ,\;tlbi ops + TMPL_prf_op ,\;pldl1keep-pstl3strm + TMPL_msr_reg ,\;msr registers + TMPL_pstate_reg ,\;pstate registers + TMPL_sysreg_dynamic ,\;s<op0>_<op1>_<Cn>_<Cm>_<op2> registers + TMPL_vect_element_b ,\;v0.b[imm]-v31.b[imm] + TMPL_vect_element_h ,\;v0.h[imm]-v31.h[imm] + TMPL_vect_element_s ,\;v0.s[imm]-v31.s[imm] + TMPL_vect_element_d ,\;v0.d[imm]-v31.d[imm] + TMPL_vect_list_8b ,\;{v.8b,...} + TMPL_vect_list_16b ,\;{v.16b,...} + TMPL_vect_list_4h ,\;{v.4h,...} + TMPL_vect_list_8h ,\;{v.8h,...} + TMPL_vect_list_2s ,\;{v.2s,...} + TMPL_vect_list_4s ,\;{v.4s,...} + TMPL_vect_list_1d ,\;{v.1d,...} + TMPL_vect_list_2d ,\;{v.2d,...} + TMPL_vect_list_vb ,\;{v0.b}[imm]-{v31.b}[imm] + TMPL_vect_list_vh ,\;{v0.b}[imm]-{v31.b}[imm] + TMPL_vect_list_vs ,\;{v0.b}[imm]-{v31.b}[imm] + TMPL_vect_list_vd ,\;{v0.b}[imm]-{v31.b}[imm] + TMPL_size_1 ,\;set operand_size to byte + TMPL_size_2 ,\;set operand_size to hword + TMPL_size_4 ,\;set operand_size to word + TMPL_size_8 ,\;set operand_size to dword + TMPL_size_16 ,\;set operand_size to qword + TMPL_size_32 ;set operand_size to dqword + +restruc make_template_entry + +TEMPLATE_maximum_operand= 9 +TEMPLATE_length = TEMPLATE_maximum_operand + +macro TEMPLATE [arg] { + common + local .x,.y + db 0 ;index number of the last template + .x: + forward + .y = $ + irp val,arg \{ + db val + \} + db TMPL_EOL + assert ($-.y) <= TEMPLATE_maximum_operand + while ($-.y) < TEMPLATE_length + db -1 + end while + common + store byte (($-.x)/TEMPLATE_length)-1 at .x-1 +} + +decode_template: + mov [instruction_condition],al + mov [arm_instruction],edx + mov [thumb32_instruction],ecx + call ARM_generic_mode_checks + xor eax,eax + mov [immediate_value_high],eax + mov [instruction_shift_op],al + mov [current_reg_number],al + mov [operand_registers],eax + mov [current_parameter],al + mov [immediate_value2],eax + mov [immediate_value],eax + mov [thumb_flags_16],al + mov [thumb_flags_32],al + mov [copro_opcode1],al + mov [copro_opcode2],al + mov eax,[esp] ;get template definitions + mov ebx,0 ;ebx=current template definition + mov ah,[eax] ;ah=highest constraint + mov al,0 ;al=lowest constriant + .refine_constraint: + .refine_lower_constraint: + movzx ecx,al + imul ecx,ecx,TEMPLATE_length + add ecx,[esp] + lea ecx,[ecx+ebx+1] + movzx ecx,byte[ecx] ;ecx=template value + movzx eax,ax ;clear the multi-match mask + push ebx ecx esi eax + call near dword[template_decode_table+ecx*4] + pop eax edx ecx ebx + jnc .lower_constraint_found + mov esi,edx + .try_next_constraint: + inc al + cmp al,ah + ja .failed + movzx edx,al + imul edx,edx,TEMPLATE_length + add edx,[esp] + lea edx,[edx+ebx+1] + cmp cl,[edx] + jz .try_next_constraint + jmp .refine_lower_constraint + .lower_constraint_found: + test eax,0xffff0000 + setnz ch + or cl,ch ;mask off similar matches + .refine_higher_constraint: + movzx edx,ah + imul edx,edx,TEMPLATE_length + add edx,[esp] + lea edx,[edx+ebx+1] + mov ch,[edx] + test eax,0xffff0000 + setnz dl + or ch,dl ;mask off similar matches + cmp cl,ch + jz .higher_constraint_found + dec ah + cmp ah,al + jb .failed + jmp .refine_higher_constraint + .higher_constraint_found: + .next_parameter: + cmp cl,TMPL_EOL + jz .end_of_line + inc bl + cmp bl,TEMPLATE_maximum_operand + jb .refine_constraint + cmp byte[esi],0xf ;end of line? + jne .extra_characters_on_line + .end_of_line: + cmp ah,al + jnz .amibguous_definition + .finish: + ;return al=matched template ordinal + mov ecx,[esp] ;get template definitions + movzx ebx,byte[ecx] + imul ebx,ebx,TEMPLATE_length + lea ebx,[ebx+ecx+1+TEMPLATE_length] + mov [esp],ebx + test [code_type],CPU_ACTIVITY_ARM64 + jnz .ret + ;create a default instruction for ARM + mov ebp,[arm_instruction] + mov cl,[instruction_condition] + and cl,0xf0 + shl ecx,24 + or ebp,ecx + mov ecx,ebp + or ecx,1 shl 20 ;set the S bit + test [instruction_condition],FLAG_CONDITION_SET + cmovnz ebp,ecx + mov [arm_instruction],ebp + .ret: + ret + .unexpected_end_of_line: + jmp ERROR_unexpected_end_of_line + .extra_characters_on_line: + jmp extra_characters_on_line + .amibguous_definition: + .failed: + cmp [current_parameter],0 + jz ERROR_parameter_n_not_valid.first + cmp [current_parameter],1 + jz ERROR_parameter_n_not_valid.second + cmp [current_parameter],2 + jz ERROR_parameter_n_not_valid.third + cmp [current_parameter],3 + jz ERROR_parameter_n_not_valid.fourth + cmp [current_parameter],4 + jz ERROR_parameter_n_not_valid.fifth + cmp [current_parameter],5 + jz ERROR_parameter_n_not_valid.sixth + jmp ERROR_parameter_n_not_valid.all + .skip_comma: + mov al,[esi] + cmp al,0xf ;end of line? + jz .TMPL_okay + cmp al,0x0 ;end of source? + jz .TMPL_okay + cmp al,']' + jz .TMPL_okay + inc esi + cmp al,',' + jnz .expecting_comma + cmp byte[esi],0xf ;end of line? + jz .unexpected_end_of_line + cmp byte[esi],0x0 ;end of source? + jz .unexpected_end_of_line + .TMPL_always: + .TMPL_okay: + clc + retn + .expecting_comma: + .TMPL_never: + .TMPL_not_matched: + stc + retn + .TMPL_modifier_exclaim: + cmp word[esi],(modifier + 0) shr 8 + ((modifier + 0) and 0xff) shl 8 + jnz .TMPL_not_matched + add esi,2 + jmp .TMPL_okay + .TMPL_modifier_translate: + cmp word[esi],(modifier + 1) shr 8 + ((modifier + 1) and 0xff) shl 8 + jnz .TMPL_not_matched + add esi,2 + jmp .TMPL_okay + .TMPL_copro_opcode1: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [copro_opcode1],al + inc [current_parameter] + cmp eax,0xf + ja .TMPL_out_of_range + test edx,edx + jnz .TMPL_out_of_range + test byte[edi+13],1 ;check sign + jz .skip_comma + .TMPL_out_of_range: + mov ecx,ERROR_value_out_of_range + call ARM_defer_error + jmp .skip_comma + .TMPL_copro_opcode2: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [copro_opcode2],al + inc [current_parameter] + cmp eax,0x7 + ja .TMPL_out_of_range + test edx,edx + jnz .TMPL_out_of_range + test byte[edi+13],1 ;check sign + jz .skip_comma + jmp .TMPL_out_of_range + .TMPL_EOL: + cmp byte[esi],0xf ;end of line? + jz .TMPL_okay + cmp byte[esi],0x0 ;end of source? + jz .TMPL_okay + jmp .TMPL_not_matched + .TMPL_reg_decoder: + lodsw + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + shr edx,16 + cmp ax,dx + jae .TMPL_not_matched + cmp byte[esi],'(' + jz .TMPL_not_matched + .TMPL_put_reg: + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],al + inc [current_reg_number] + inc [current_parameter] + jmp .skip_comma + .TMPL_base_reg: + mov edx,base_reg + base_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_base_reg!: + mov edx,base_reg! + base_reg!.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_cpro_sel: + mov edx,cpro_sel + cpro_sel.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_cpro_reg: + mov edx,cpro_reg + cpro_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_fpa_freg: + mov edx,fpa_freg + fpa_freg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_barrier: + mov edx,barrier + barrier.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_condition_nv: + mov edx,condition + condition.size shl 16 + jmp .TMPL_condition.do + .TMPL_condition: + mov edx,condition + (condition.size-1) shl 16 ;exclude NV + .TMPL_condition.do: + cmp word[esi],(endian + 0) shr 8 + ((endian + 0) and 0xff) shl 8 ;special value for overlap with LE + mov al,0xd + jz .TMPL_condition.found2 + cmp byte[esi],0xf0 ;special value for overlap with EQ + mov al,0x0 + jz .TMPL_condition.found1 + jmp .TMPL_reg_decoder + .TMPL_condition.found2: + inc esi + .TMPL_condition.found1: + inc esi + jmp .TMPL_put_reg + .TMPL_shift_op: + lodsw + xchg ah,al + sub ax,shift_op + jb .TMPL_not_matched + cmp ax,shift_op.size + jae .TMPL_not_matched + mov [instruction_shift_op],al + jmp .TMPL_okay + .TMPL_shift_op3: + lodsw + xchg ah,al + sub ax,shift_op + jb .TMPL_not_matched + cmp ax,shift_op.size-1 ;ror not allowed + jae .TMPL_not_matched + mov [instruction_shift_op],al + jmp .TMPL_okay + .TMPL_vfpdx_reg: + cmp word[esi+2],'[(' + jnz .TMPL_not_matched + lodsd + xchg ah,al + sub ax,vfpd_reg + jb .TMPL_not_matched + cmp ax,vfpd_reg.size + jae .TMPL_not_matched + push eax + call ARM_calculate_expression + pop eax + cmp byte[esi],']' + jnz .TMPL_not_matched + cmp word[edi+10],0 ;mult2, mult1 + jnz .TMPL_not_matched + ;double and shift high bit to LSb + add al,al + mov ah,al + shr al,5 + and ax,0x1e01 + or ah,al + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],ah + inc [current_reg_number] + inc esi + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + inc [current_parameter] + cmp eax,0x7 + ja .TMPL_out_of_range + test edx,edx + jnz .TMPL_out_of_range + test byte[edi+13],1 ;check sign + jnz .TMPL_out_of_range + jmp .skip_comma + .TMPL_vfps_reg: + mov edx,vfps_reg + vfps_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vfpd_reg: + lodsw + xchg ah,al + sub ax,vfpd_reg + jb .TMPL_not_matched + cmp ax,vfpd_reg.size + jae .TMPL_not_matched + .TMPL_vfpd_reg.do: + ;double and shift high bit to LSb + add al,al + mov ah,al + shr al,5 + and ax,0x1e01 + or ah,al + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],ah + inc [current_reg_number] + inc [current_parameter] + jmp .skip_comma + .TMPL_simd_qreg: + lodsw + xchg ah,al + sub ax,simd_qreg + jb .TMPL_not_matched + cmp ax,simd_qreg.size + jae .TMPL_not_matched + add al,al + jmp .TMPL_vfpd_reg.do + .TMPL_vect_breg: + mov edx,vect_breg + vect_breg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_hreg: + mov edx,vect_hreg + vect_hreg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_sreg: + mov edx,vect_sreg + vect_sreg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_dreg: + mov edx,vect_dreg + vect_dreg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_qreg: + mov edx,vect_qreg + vect_qreg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v8b: + mov edx,vect_v8b + vect_v8b.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v16b: + mov edx,vect_v16b + vect_v16b.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v4h: + mov edx,vect_v4h + vect_v4h.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v8h: + mov edx,vect_v8h + vect_v8h.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v2s: + mov edx,vect_v2s + vect_v2s.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v4s: + mov edx,vect_v4s + vect_v4s.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v1d: + mov edx,vect_v1d + vect_v1d.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v2d: + mov edx,vect_v2d + vect_v2d.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vect_v1q: + mov edx,vect_v1q + vect_v1q.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_vfp_syst: + mov edx,vfp_syst + vfp_syst.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_acc_40bt: + mov edx,acc_40bt + acc_40bt.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_endian: + mov edx,endian + endian.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_iflags: + mov edx,iflags + iflags.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_psr: + mov edx,psr_reg + psr_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_iwmmx_wreg: + mov edx,iwmmx_wreg + iwmmx_wreg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_iwmmx_creg: + mov edx,iwmmx_creg + iwmmx_creg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_address: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + cmp byte[edx+1],'.' ;float? + jz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + inc [current_parameter] + movzx ecx,byte[edi+13] ;sign bit + and ecx,1 + or ecx,edx + jz .TMPL_okay + cdq + cmp edx,[edi+4] + jnz .TMPL_address.out_of_range + xor dl,[edi+13] ;check sign + test dl,1 + jz .TMPL_okay + jmp .TMPL_address.out_of_range + .TMPL_address64: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + cmp byte[edx+1],'.' ;float? + jz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + mov [immediate_value_high],edx + inc [current_parameter] + movzx ecx,byte[edi+13] ;sign bit + and ecx,1 + jz .TMPL_okay + test edx,edx + js .TMPL_okay + .TMPL_address.out_of_range: + mov ecx,ERROR_value_out_of_range + call ARM_defer_error + jmp .TMPL_okay + .TMPL_imm_float: + mov eax,[esi] + cmp ax,'(.' + jz .TMPL_imm + and eax,0x00ffffff + cmp eax,'#(.' + jz .TMPL_imm + jmp .TMPL_not_matched + .TMPL_imm2: + mov ecx,immediate_value2 + jmp .TMPL_imm.do + .TMPL_imm: + mov ecx,immediate_value + .TMPL_imm.do: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + push esi ecx + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop ecx esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [ecx],eax + inc [current_parameter] + movzx ecx,byte[edi+13] ;sign bit + and ecx,1 + or ecx,edx + jz .TMPL_okay + cdq + cmp edx,[edi+4] + jnz .TMPL_imm.out_of_range + xor dl,[edi+13] ;check sign + test dl,1 + jz .TMPL_okay + jmp .TMPL_imm.out_of_range + .TMPL_imm64: + cmp byte[esi],'#' + setz dl + movzx edx,dl + add edx,esi + cmp byte[edx],'(' + jnz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + mov [immediate_value_high],edx + inc [current_parameter] + movzx ecx,byte[edi+13] ;sign bit + and ecx,1 + jz .TMPL_okay + test edx,edx + js .TMPL_okay + .TMPL_imm.out_of_range: + mov ecx,ERROR_value_out_of_range + call ARM_defer_error + jmp .TMPL_okay + .TMPL_bracket_left: + mov [operand_flags],0 + mov edx,esi + mov cx,[edx] + xchg ch,cl + sub cx,size_opr + jb .no_size_operator + cmp cx,size_opr.size + jae .no_size_operator + cmp cl,[operand_size] + jnz ERROR_operand_sizes_do_not_match + add edx,2 + mov [operand_flags],1 + .no_size_operator: + cmp byte[edx],'[' + jnz .TMPL_not_matched + inc edx + mov esi,edx + jmp .TMPL_okay + .TMPL_bracket_right: + cmp byte[esi],']' + jnz .TMPL_not_matched + inc esi + cmp word[esi],(modifier + 0) shr 8 + ((modifier + 0) and 0xff) shl 8 + jnz .skip_comma + jmp .TMPL_okay + .TMPL_simd_reg_list: + cmp byte[esi],0x91 + jnz .TMPL_not_matched + inc esi + lodsw + xchg ah,al + sub ax,vfpd_reg + jb .TMPL_not_matched + cmp ax,vfpd_reg.size + jae .TMPL_not_matched + mov [simd_reg_list_first],al + mov [simd_reg_list_count],1 + mov [simd_reg_list_x],0 + mov [simd_reg_list_type],SIMD_REG_LIST_TYPE_REGISTER + cmp byte[esi],0x92 + jz .TMPL_simd_reg_list.done + cmp word[esi],'[]' + jz .TMPL_simd_reg_list.vector + cmp word[esi],'[(' + jz .TMPL_simd_reg_list.element + .TMPL_simd_reg_list.check_next: + cmp byte[esi],0x92 + jz .TMPL_simd_reg_list.done + cmp byte[esi],',' + jnz .TMPL_not_matched + inc esi + lodsw + xchg ah,al + sub ax,vfpd_reg + jb .TMPL_not_matched + cmp ax,vfpd_reg.size + jae .TMPL_not_matched + inc [simd_reg_list_count] + cmp [simd_reg_list_count],2 ;second reg sets the separation + jnz .TMPL_simd_reg_list.check_separation + sub al,[simd_reg_list_first] + dec al + test al,not 1 + jnz .TMPL_not_matched + and al,1 + ror al,1 + or [simd_reg_list_count],al + jmp .TMPL_simd_reg_list.separation_okay + .TMPL_simd_reg_list.check_separation: + mov ah,[simd_reg_list_first] + mov cl,[simd_reg_list_count] + mov ch,cl + and ch,0x7f + sub al,ah + rol cl,1 + and cl,1 + shr al,cl + jc .TMPL_not_matched + inc al + cmp al,ch + jnz .TMPL_not_matched + .TMPL_simd_reg_list.separation_okay: + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + jz .TMPL_simd_reg_list.check_vector + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + jz .TMPL_simd_reg_list.check_element + jmp .TMPL_simd_reg_list.check_next + .TMPL_simd_reg_list.check_vector: + cmp word[esi],'[]' + jnz .TMPL_not_matched + add esi,2 + jmp .TMPL_simd_reg_list.check_next + .TMPL_simd_reg_list.check_element: + cmp word[esi],'[(' + jnz .TMPL_not_matched + add esi,2 + call ARM_calculate_expression + cmp word[edi+10],0 ;mult2, mult1 + jnz .TMPL_not_matched + mov eax,[edi] + mov edx,[edi+4] + test edx,edx + jnz .TMPL_not_matched + test byte[edi+13],1 ;check sign + jnz .TMPL_not_matched + cmp eax,7 + ja .TMPL_not_matched + cmp [simd_reg_list_x],al + jnz .TMPL_not_matched + lodsb + cmp al,']' + jnz .TMPL_not_matched + jmp .TMPL_simd_reg_list.check_next + .TMPL_simd_reg_list.vector: + mov [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + add esi,2 + jmp .TMPL_simd_reg_list.check_next + .TMPL_simd_reg_list.element: + mov [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + add esi,2 + call ARM_calculate_expression + cmp word[edi+8],0 ;reg2, reg1 + jnz .TMPL_not_matched + mov eax,[edi] + mov edx,[edi+4] + test edx,edx + jnz .TMPL_not_matched + test byte[edi+13],1 ;check sign + jnz .TMPL_not_matched + cmp eax,7 + ja .TMPL_not_matched + mov [simd_reg_list_x],al + lodsb + cmp al,']' + jnz .TMPL_not_matched + jmp .TMPL_simd_reg_list.check_next + .TMPL_simd_reg_list.done: + inc esi + inc [current_parameter] + jmp .skip_comma + .TMPL_vfp_reg_list_s: + mov edx,vfps_reg + vfps_reg.size shl 16 + jmp .TMPL_reg_list.decode + .TMPL_vfp_reg_list_d: + mov edx,vfpd_reg + vfpd_reg.size shl 16 + jmp .TMPL_reg_list.decode + .TMPL_reg_list: + mov edx,base_reg + base_reg.size shl 16 + .TMPL_reg_list.decode: + cmp byte[esi],0x91 + jnz .TMPL_not_matched + mov [reg_list_bitmap],0 + .TMPL_reg_list.next: + inc esi + cmp byte[esi],0x92 + jz .TMPL_reg_list.done + lodsw + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + cmp ax,dx + jae .TMPL_not_matched + ror edx,16 + movzx ecx,al + bts [reg_list_bitmap],ecx + jc ERROR_repeated_register_in_list + cmp byte[esi],0x92 + jz .TMPL_reg_list.done + cmp byte[esi],',' + jz .TMPL_reg_list.next + cmp byte[esi],'-' + jnz .TMPL_not_matched + inc esi + lodsw + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + cmp ax,dx + jae .TMPL_not_matched + ror edx,16 + movzx ebx,al + btr [reg_list_bitmap],ecx + cmp ecx,ebx + je ERROR_repeated_register_in_list + jg .TMPL_reg_list.range_next + xchg ecx,ebx + .TMPL_reg_list.range_next: + bts [reg_list_bitmap],ecx + jc ERROR_repeated_register_in_list + dec ecx + cmp ecx,ebx + jge .TMPL_reg_list.range_next + cmp byte[esi],',' + jz .TMPL_reg_list.next + cmp byte[esi],0x92 + jnz .TMPL_not_matched + .TMPL_reg_list.done: + inc esi + cmp [reg_list_bitmap],0 + jz ERROR_empty_set + inc [current_parameter] + jmp .TMPL_okay + .TMPL_rrx_op: + cmp word[esi],rrx_op shr 8 + (rrx_op and 0xff) shl 8 + jnz .TMPL_not_matched + add esi,2 + inc [current_parameter] + jmp .TMPL_okay + .TMPL_sysm_reg: + mov ax,word[esi] + xchg ah,al + cmp ax,psr_reg+34 + jz .TMPL_sysm_reg.apsr + mov edx,sysm_reg + sysm_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_sysm_reg.apsr: + mov al,0 + add esi,2 + jmp .TMPL_put_reg + .TMPL_banked_reg: + mov edx,banked_reg + banked_reg.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_mvrk_areg: + mov ax,word[esi] + xchg ah,al + cmp ax,mvrk_areg + jnz .TMPL_mvrk_areg_a1_a3 + sub ax,mvrk_areg + jz .TMPL_mvrk_areg_a0 + .TMPL_mvrk_areg_a1_a3: + sub ax,base_reg + jb .TMPL_not_matched + cmp ax,2 + ja .TMPL_not_matched + inc al + .TMPL_mvrk_areg_a0: + add esi,2 + jmp .TMPL_put_reg + .TMPL_mvrk_psc: + cmp word[esi],mvrk_psc shr 8 + (mvrk_psc and 0xff) shl 8 + jnz .TMPL_not_matched + add esi,2 + inc [current_parameter] + jmp .skip_comma + .TMPL_add_sub_reg: + mov cl,0 + cmp byte[esi],'-' + jnz .TMPL_add_reg + mov cl,0x80 + inc esi + .TMPL_add_reg: + mov ax,[esi] + xchg ah,al + sub ax,base_reg + jb .TMPL_reg_in_expression + cmp ax,base_reg.size + jae .TMPL_reg_in_expression + add esi,2 + or al,cl + jmp .TMPL_put_reg + .TMPL_reg_in_expression: + lodsb + cmp al,'(' + jnz .TMPL_not_matched + lodsw + xchg ah,al + sub ax,base_reg + jb .TMPL_not_matched + cmp ax,base_reg.size + jae .TMPL_not_matched + cmp byte[esi],')' + jz .TMPL_reg_in_expression.add_reg + cmp word[esi],')' shl 8 + 0x83 ;unary minus? + jnz .TMPL_not_matched + or al,0x80 + inc esi + .TMPL_reg_in_expression.add_reg: + inc esi + jmp .TMPL_put_reg + .TMPL_address_reg@: + lodsw + xchg ah,al + mov edx,base_reg + (0*16) shl 16 + cmp ax,base_reg + jb @f + cmp ax,base_reg + base_reg.size + jb .TMPL_address_reg@.make + @@: mov edx,base_@16 + (1*16) shl 16 + cmp ax,base_@16 + jb @f + cmp ax,base_@16 + base_@16.size + jb .TMPL_address_reg@.make + @@: mov edx,base_@32 + (2*16) shl 16 + cmp ax,base_@32 + jb @f + cmp ax,base_@32 + base_@32.size + jb .TMPL_address_reg@.make + @@: mov edx,base_@64 + (3*16) shl 16 + cmp ax,base_@64 + jb @f + cmp ax,base_@64 + base_@64.size + jb .TMPL_address_reg@.make + @@: mov edx,base_@128 + (4*16) shl 16 + cmp ax,base_@128 + jb @f + cmp ax,base_@128 + base_@128.size + jb .TMPL_address_reg@.make + @@: mov edx,base_@256 + (5*16) shl 16 + cmp ax,base_@256 + jb .TMPL_not_matched + cmp ax,base_@256 + base_@256.size + jae .TMPL_not_matched + .TMPL_address_reg@.make: + sub ax,dx + shr edx,16 + add al,dl + jmp .TMPL_put_reg + .TMPL_expression: + xor edx,edx + cmp byte[esi],'(' + jz .TMPL_expression.start_okay + cmp byte[esi],0x10 + jnz .TMPL_not_matched + cmp byte[esi+2],'(' + jnz .TMPL_not_matched + lodsw + mov dl,ah + add edx,0x10000 + .TMPL_expression.start_okay: + push esi edx + inc esi + call ARM_calculate_expression + pop eax edx + xchg esi,edx + mov ecx,[edi+8] ;mult2, mult1, reg2, reg1 + add ecx,eax + cmp ecx,0xffff + jbe .TMPL_not_matched + xor ecx,0x00010000 + cmp ecx,0xff + ja .TMPL_invalid_expression.too_complex + test [code_type],CPU_ACTIVITY_ARM64 + jnz .TMPL_expression.64 + sub cl,base_reg - 0x1000 + jb .TMPL_invalid_expression.not_base + cmp cl,base_reg.size + jae .TMPL_invalid_expression.not_base + jmp .TMPL_expression.set_reg + .TMPL_expression.64: + cmp cl,dword_reg + 31 - 0x1000 ;xzr not allowed + je .TMPL_invalid_expression.not_base64 + mov al,dword_reg + 31 - 0x1000 + cmp cl,base_reg + 13 - 0x1000 ;sp? + cmovz ecx,eax + sub cl,dword_reg - 0x1000 + jb .TMPL_invalid_expression.not_base64 + cmp cl,dword_reg.size + jae .TMPL_invalid_expression.not_base64 + .TMPL_expression.set_reg: + xchg esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + movzx ebx,[current_reg_number] + mov [operand_register0+ebx],cl + inc [current_reg_number] + inc [current_parameter] + movzx ecx,byte[edi+13] ;sign bit + and ecx,1 + or ecx,edx + jz .TMPL_okay + cdq + cmp edx,[edi+4] + jnz .TMPL_expression.out_of_range + xor dl,[edi+13] ;check sign + test dl,1 + jz .TMPL_okay + .TMPL_expression.out_of_range: + mov ecx,ERROR_value_out_of_range + call ARM_defer_error + jmp .TMPL_okay + .TMPL_invalid_expression.too_complex: + jmp ERROR_register_out_of_range.too_complex + .TMPL_invalid_expression.not_base: + jmp ERROR_register_out_of_range.only_base + .TMPL_invalid_expression.not_base64: + jmp ERROR_register_out_of_range.only_base64 + .TMPL_option: + cmp byte[esi],0x91 + jnz .TMPL_not_matched + cmp byte[esi+1],'#' + setz dl + movzx edx,dl + lea edx,[esi+edx+1] + cmp byte[edx],'(' + jnz .TMPL_not_matched + push esi + lea esi,[edx+1] + call ARM_calculate_expression + mov edx,esi + pop esi + cmp word[edi+10],0 ;mult2, mult1 + jnz .TMPL_not_matched + inc edx + cmp byte[edx-1],0x92 + jnz .TMPL_not_matched + mov esi,edx + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + inc [current_parameter] + test edx,edx + jnz .TMPL_option.out_of_range + test byte[edi+13],1 ;check sign + jz .TMPL_okay + .TMPL_option.out_of_range: + mov ecx,ERROR_value_out_of_range + call ARM_defer_error + jmp .TMPL_okay + .TMPL_comma: + cmp byte[esi],',' + jnz .TMPL_not_matched + inc esi + jmp .TMPL_okay + .TMPL_word_z_reg: + assert TMPL_word_z_reg and not 1 = TMPL_word_s_reg and not 1 + lodsw + xchg ah,al + sub ax,word_reg + jb .TMPL_not_matched + cmp ax,word_reg.size - 2 + ja .TMPL_not_matched ;wsp not allowed + setnz cl ;wzr? + or [esp+6 + __is_64 * 4],cl + jmp .TMPL_put_reg + .TMPL_word_s_reg: + assert TMPL_word_z_reg and not 1 = TMPL_word_s_reg and not 1 + lodsw + xchg ah,al + sub ax,word_reg + jb .TMPL_not_matched + cmp ax,word_reg.size + jae .TMPL_not_matched + cmp al,word_reg.size - 2 + jz .TMPL_not_matched ;wzr not allowed + seta cl ;wsp? + sub al,cl + or [esp+6 + __is_64 * 4],cl + jmp .TMPL_put_reg + .TMPL_dword_z_reg: + assert TMPL_dword_z_reg and not 1 = TMPL_dword_s_reg and not 1 + lodsw + xchg ah,al + sub ax,dword_reg + jb .TMPL_not_matched + cmp ax,dword_reg.size - 1 + ja .TMPL_not_matched + setnz cl ;wzr? + or [esp+6 + __is_64 * 4],cl + jmp .TMPL_put_reg + .TMPL_dword_s_reg: + assert TMPL_dword_z_reg and not 1 = TMPL_dword_s_reg and not 1 + lodsw + xchg ah,al + cmp ax,base_reg + 13 ;sp? + jz .TMPL_dword_s_reg.sp + sub ax,dword_reg + jb .TMPL_not_matched + cmp ax,dword_reg.size - 1 + jae .TMPL_not_matched ;xzr not allowed + jmp .TMPL_put_reg + .TMPL_dword_s_reg.sp: + or byte[esp+6 + __is_64 * 4],1 + mov al,0x1f + jmp .TMPL_put_reg + .TMPL_word_gen_reg: + mov edx,word_reg + (word_reg.size - 2) shl 16 + jmp .TMPL_reg_decoder + .TMPL_word_zr_reg: + lodsw + cmp ax,(word_reg + word_reg.size - 2) shr 8 + ((word_reg + word_reg.size - 2) and 0xff) shl 8 + jnz .TMPL_not_matched + mov al,0x1f + jmp .TMPL_put_reg + .TMPL_word_sp_reg: + lodsw + cmp ax,(word_reg + word_reg.size - 1) shr 8 + ((word_reg + word_reg.size - 1) and 0xff) shl 8 + jnz .TMPL_not_matched + mov al,0x1f + jmp .TMPL_put_reg + .TMPL_dword_gen_reg: + mov edx,dword_reg + (dword_reg.size - 1) shl 16 + jmp .TMPL_reg_decoder + .TMPL_prf_op: + mov edx,prf_op + prf_op.size shl 16 + jmp .TMPL_reg_decoder + .TMPL_dword_zr_reg: + lodsw + cmp ax,(dword_reg + dword_reg.size - 1) shr 8 + ((dword_reg + dword_reg.size - 1) and 0xff) shl 8 + jnz .TMPL_not_matched + mov al,0x1f + jmp .TMPL_put_reg + .TMPL_dword_sp_reg: + lodsw + cmp ax,(base_reg+13) shr 8 + ((base_reg+13) and 0xff) shl 8 + jnz .TMPL_not_matched + mov al,0x1f + jmp .TMPL_put_reg + .TMPL_extend: + lodsw + xchg ah,al + sub ax,xtnd_op + jb .TMPL_not_matched + cmp ax,xtnd_op.size + jae .TMPL_not_matched + mov [instruction_shift_op],al + jmp .TMPL_okay + .TMPL_lsl: + lodsw + cmp ax,(shift_op+0) shr 8 + ((shift_op+0) and 0xff) shl 8 + jnz .TMPL_not_matched + mov [instruction_shift_op],0 + jmp .TMPL_okay + .TMPL_at_op: + lodsw + xchg ah,al + sub ax,sys_at + jb .TMPL_not_matched + cmp ax,sys_at.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_dc_op: + lodsw + xchg ah,al + sub ax,sys_dc + jb .TMPL_not_matched + cmp ax,sys_dc.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_ic_op: + lodsw + xchg ah,al + sub ax,sys_ic + jb .TMPL_not_matched + cmp ax,sys_ic.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_tlbi_op: + lodsw + xchg ah,al + sub ax,sys_tlbi + jb .TMPL_not_matched + cmp ax,sys_tlbi.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_msr_reg: + lodsw + xchg ah,al + cmp ax,banked_reg+32+20 ;spsr_abt? + mov cx,sys_msr+(sys_encode_spsr_abt-sys_encode_table_msr) shr 1 + cmovz eax,ecx + cmp ax,banked_reg+32+14 ;spsr_fiq? + mov cx,sys_msr+(sys_encode_spsr_fiq-sys_encode_table_msr) shr 1 + cmovz eax,ecx + cmp ax,banked_reg+32+16 ;spsr_irq? + mov cx,sys_msr+(sys_encode_spsr_irq-sys_encode_table_msr) shr 1 + cmovz eax,ecx + cmp ax,banked_reg+32+22 ;spsr_und? + mov cx,sys_msr+(sys_encode_spsr_und-sys_encode_table_msr) shr 1 + cmovz eax,ecx + sub ax,sys_msr + jb .TMPL_not_matched + cmp ax,sys_msr.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_pstate_reg: + lodsw + xchg ah,al + sub ax,sys_pstate + jb .TMPL_not_matched + cmp ax,sys_pstate.size + jae .TMPL_not_matched + movzx eax,ax + mov [immediate_value],eax + inc [current_parameter] + jmp .skip_comma + .TMPL_sysreg_dynamic: + lodsw + cmp ax,'(' + 0x11 shl 8 + jnz .TMPL_not_matched + lodsd + cmp byte[esi],')' + jnz .TMPL_not_matched + inc esi + xor edx,edx + mov ebx,[eax+0x18] + ;S<op0>_<op1>_<Cn>_<Cm>_<op2> + mov cl,[ebx] + inc ebx + cmp cl,'s' + jz .TMPL_sysreg_dynamic.start_okay + cmp cl,'S' + jnz .TMPL_not_matched + .TMPL_sysreg_dynamic.start_okay: + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,3 + ja .TMPL_not_matched + cmp cl,2 + jb .TMPL_not_matched + or edx,ecx + cmp byte[ebx],'_' + jnz .TMPL_not_matched + inc ebx + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,7 + ja .TMPL_not_matched + shl edx,3 + or edx,ecx + cmp word[ebx],'_c' + jz .TMPL_sysreg_dynamic.first_reg_okay + cmp word[ebx],'_C' + jnz .TMPL_not_matched + .TMPL_sysreg_dynamic.first_reg_okay: + inc ebx + inc ebx + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,9 + ja .TMPL_not_matched + cmp byte[ebx],'_' + jz .TMPL_sysreg_dynamic.place_first_reg + cmp cl,1 + jnz .TMPL_not_matched + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,5 + ja .TMPL_not_matched + add cl,10 + .TMPL_sysreg_dynamic.place_first_reg: + shl edx,4 + or edx,ecx + cmp word[ebx],'_c' + jz .TMPL_sysreg_dynamic.second_reg_okay + cmp word[ebx],'_C' + jnz .TMPL_not_matched + .TMPL_sysreg_dynamic.second_reg_okay: + inc ebx + inc ebx + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,9 + ja .TMPL_not_matched + cmp byte[ebx],'_' + jz .TMPL_sysreg_dynamic.place_second_reg + cmp cl,1 + jnz .TMPL_not_matched + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,5 + ja .TMPL_not_matched + add cl,10 + .TMPL_sysreg_dynamic.place_second_reg: + shl edx,4 + or edx,ecx + cmp byte[ebx],'_' + jnz .TMPL_not_matched + inc ebx + movzx ecx,byte[ebx] + inc ebx + sub cl,'0' + jb .TMPL_not_matched + cmp cl,7 + ja .TMPL_not_matched + shl edx,3 + or edx,ecx + cmp byte[ebx],',' + jz .TMPL_sysreg_dynamic.create + cmp byte[ebx],0 + jnz .TMPL_not_matched + .TMPL_sysreg_dynamic.create: + mov [immediate_value],edx + mov cx,[current_pass] + xchg [eax+16],cx + mov edx,[current_line] + mov [eax+28],edx + or byte[eax+8],1+2 + jmp .skip_comma + .TMPL_vect_element_b: + mov edx,vect_vb + vect_vb.size shl 16 + 15 shl 24 + jmp .TMPL_vect_element + .TMPL_vect_element_h: + mov edx,vect_vh + vect_vh.size shl 16 + 7 shl 24 + jmp .TMPL_vect_element + .TMPL_vect_element_s: + mov edx,vect_vs + vect_vs.size shl 16 + 3 shl 24 + jmp .TMPL_vect_element + .TMPL_vect_element_d: + mov edx,vect_vd + vect_vd.size shl 16 + 1 shl 24 + .TMPL_vect_element: + cmp word[esi+2],'[(' + jnz .TMPL_not_matched + lodsd + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + movzx cx,dl + cmp ax,cx + jae .TMPL_not_matched + push eax edx + call ARM_calculate_expression + pop ebx eax + cmp byte[esi],']' + jnz .TMPL_not_matched + cmp word[edi+10],0 ;mult2, mult1 + jnz .TMPL_not_matched + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],al + inc [current_reg_number] + inc esi + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,immediate_value + mov edx,immediate_value2 + test ecx,ecx + cmovnz eax,edx + mov ecx,[edi] + mov edx,[edi+4] + mov [eax],ecx + inc [current_parameter] + movzx ebx,bh + cmp ecx,ebx + ja .TMPL_out_of_range + test edx,edx + jnz .TMPL_out_of_range + test byte[edi+13],1 ;check sign + jnz .TMPL_out_of_range + jmp .skip_comma + .TMPL_vect_list_8b: + mov edx,vect_v8b + vect_v8b.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_16b: + mov edx,vect_v16b + vect_v16b.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_4h: + mov edx,vect_v4h + vect_v4h.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_8h: + mov edx,vect_v8h + vect_v8h.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_2s: + mov edx,vect_v2s + vect_v2s.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_4s: + mov edx,vect_v4s + vect_v4s.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_1d: + mov edx,vect_v1d + vect_v1d.size shl 16 + jmp .TMPL_vect_list + .TMPL_vect_list_2d: + mov edx,vect_v2d + vect_v2d.size shl 16 + .TMPL_vect_list: + lodsb + cmp al,0x91 + jnz .TMPL_not_matched + mov [simd_reg_list_count],0 + .TMPL_vect_list.next: + cmp byte[esi],0x92 + jz .TMPL_vect_list.done + lodsw + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + cmp ax,dx + jae .TMPL_not_matched + ror edx,16 + movzx eax,al + movzx ecx,[simd_reg_list_count] + test ecx,ecx + jnz .TMPL_vect_list.check_increment + mov [simd_reg_list_first],al + jmp .TMPL_vect_list.advance + .TMPL_vect_list.check_increment: + mov ebx,ecx + add bl,[simd_reg_list_first] + and bl,0x1f + cmp bl,al + jnz .TMPL_not_matched + .TMPL_vect_list.advance: + inc cl + mov [simd_reg_list_count],cl + lodsb + cmp al,',' + jz .TMPL_vect_list.next + cmp al,0x92 + jnz .TMPL_not_matched + .TMPL_vect_list.done: + cmp [simd_reg_list_count],0 + jz ERROR_empty_set + cmp [simd_reg_list_count],4 + ja .TMPL_not_matched + mov bl,[simd_reg_list_first] + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],bl + inc [current_reg_number] + inc [current_parameter] + jmp .skip_comma + .TMPL_vect_list_vb: + mov edx,vect_vb + vect_vb.size shl 16 + 15 shl 24 + jmp .TMPL_vect_list_v + .TMPL_vect_list_vh: + mov edx,vect_vh + vect_vh.size shl 16 + 7 shl 24 + jmp .TMPL_vect_list_v + .TMPL_vect_list_vs: + mov edx,vect_vs + vect_vs.size shl 16 + 3 shl 24 + jmp .TMPL_vect_list_v + .TMPL_vect_list_vd: + mov edx,vect_vd + vect_vd.size shl 16 + 1 shl 24 + .TMPL_vect_list_v: + lodsb + cmp al,0x91 + jnz .TMPL_not_matched + mov [simd_reg_list_count],0 + .TMPL_vect_list_v.next: + cmp byte[esi],0x92 + jz .TMPL_vect_list_v.done + lodsw + xchg ah,al + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + movzx cx,dl + cmp ax,cx + jae .TMPL_not_matched + ror edx,16 + movzx eax,al + movzx ecx,[simd_reg_list_count] + test ecx,ecx + jnz .TMPL_vect_list_v.check_increment + mov [simd_reg_list_first],al + jmp .TMPL_vect_list_v.advance + .TMPL_vect_list_v.check_increment: + mov ebx,ecx + add bl,[simd_reg_list_first] + and bl,0x1f + cmp bl,al + jnz .TMPL_not_matched + .TMPL_vect_list_v.advance: + inc cl + mov [simd_reg_list_count],cl + lodsb + cmp al,',' + jz .TMPL_vect_list_v.next + cmp al,0x92 + jnz .TMPL_not_matched + .TMPL_vect_list_v.done: + cmp [simd_reg_list_count],0 + jz ERROR_empty_set + cmp [simd_reg_list_count],4 + ja .TMPL_not_matched + lodsw + cmp ax,'[(' + jnz .TMPL_not_matched + push edx + call ARM_calculate_expression + pop ebx + lodsb + cmp al,']' + jnz .TMPL_not_matched + cmp word[edi+10],0 ;mult2, mult1 + jnz .TMPL_not_matched + mov bl,[simd_reg_list_first] + movzx ecx,[current_reg_number] + mov [operand_register0+ecx],bl + inc [current_reg_number] + mov eax,[edi+16] + mov [symbol_identifier],eax + mov al,[edi+12] + mov [value_type],al + mov eax,immediate_value + mov edx,immediate_value2 + test ecx,ecx + cmovnz eax,edx + mov ecx,[edi] + mov edx,[edi+4] + mov [eax],ecx + inc [current_parameter] + shr ebx,24 + cmp ecx,ebx + ja .TMPL_out_of_range + test edx,edx + jnz .TMPL_out_of_range + test byte[edi+13],1 ;check sign + jnz .TMPL_out_of_range + jmp .skip_comma + .TMPL_msl: + cmp word[esi],msl_op shr 8 + (msl_op and 0xff) shl 8 + jnz .TMPL_not_matched + add esi,2 + inc [current_parameter] + jmp .TMPL_okay + .TMPL_cpu_sel: + mov ecx,[cpu_capability_flags] + mov ebx,[cpu_capability_flags2] + mov edx,cpu_sel + cpu_sel.size shl 16 + jmp .TMPL_processor_selection + .TMPL_copro_sel: + mov ecx,[copro_capability_flags] + xor ebx,ebx + mov edx,copro_sel + copro_sel.size shl 16 + .TMPL_processor_selection: + cmp byte[esi],'-' + jz .TMPL_processor_selection.accumulate + cmp byte[esi],'+' + jz .TMPL_processor_selection.accumulate + ;start from scratch + xor ecx,ecx + xor ebx,ebx + .TMPL_processor_selection.accumulate: + xor eax,eax + cmp byte[esi],'+' + jz .TMPL_processor_selection.increment + cmp byte[esi],'-' + jnz .TMPL_processor_selection.next + or eax,-1 + .TMPL_processor_selection.increment: + inc esi + .TMPL_processor_selection.next: + lodsw + xchg ah,al + cmp ax,cpu_sel.all32 + jz .TMPL_processor_selection.cpu_sel.all32 + cmp ax,cpu_sel.all64 + jz .TMPL_processor_selection.cpu_sel.all64 + cmp ax,copro_sel.all + jz .TMPL_processor_selection.copro_sel.all + sub ax,dx + jb .TMPL_not_matched + ror edx,16 + cmp ax,dx + jae .TMPL_not_matched + ror edx,16 + cmp al,32 + jb @f + xchg ecx,ebx + @@: bts ecx,eax + test eax,eax + jns @f + btr ecx,eax + @@: cmp al,32 + jb .TMPL_processor_selection.advance + xchg ecx,ebx + .TMPL_processor_selection.advance: + mov al,[esi] + cmp al,'+' + jz .TMPL_processor_selection.accumulate + cmp al,'-' + jz .TMPL_processor_selection.accumulate + mov [immediate_value],ecx + mov [immediate_value_high],ebx + inc [current_parameter] + jmp .TMPL_okay + .TMPL_processor_selection.cpu_sel.all32: + cmp dx,cpu_sel + jnz .TMPL_not_matched + or ecx,CPU32_CAPABILITY_ALL and (1 shl 32 - 1) + or ebx,CPU32_CAPABILITY_ALL shr 32 + test eax,eax + jns .TMPL_processor_selection.advance + and ecx,not (CPU32_CAPABILITY_ALL and (1 shl 32 - 1)) + and ebx,not (CPU32_CAPABILITY_ALL shr 32) + jmp .TMPL_processor_selection.advance + .TMPL_processor_selection.cpu_sel.all64: + cmp dx,cpu_sel + jnz .TMPL_not_matched + or ecx,CPU64_CAPABILITY_ALL and (1 shl 32 - 1) + or ebx,CPU64_CAPABILITY_ALL shr 32 + test eax,eax + jns .TMPL_processor_selection.advance + and ecx,not (CPU64_CAPABILITY_ALL and (1 shl 32 - 1)) + and ebx,not (CPU64_CAPABILITY_ALL shr 32) + jmp .TMPL_processor_selection.advance + .TMPL_processor_selection.copro_sel.all: + cmp dx,copro_sel + jnz .TMPL_not_matched + or ecx,COPRO_CAPABILITY_ALL + test eax,eax + jns .TMPL_processor_selection.advance + and ecx,not COPRO_CAPABILITY_ALL + jmp .TMPL_processor_selection.advance + .TMPL_size_1: + mov [operand_size],1 + jmp .TMPL_okay + .TMPL_size_2: + mov [operand_size],2 + jmp .TMPL_okay + .TMPL_size_4: + mov [operand_size],4 + jmp .TMPL_okay + .TMPL_size_8: + mov [operand_size],8 + jmp .TMPL_okay + .TMPL_size_16: + mov [operand_size],16 + jmp .TMPL_okay + .TMPL_size_32: + mov [operand_size],32 + jmp .TMPL_okay + +ARM_code16_directive: + call ARM_generic_mode_checks + cmp [explicit_IT_state],0 + jnz ERROR_mode_change_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + mov [code_type],CPU_ACTIVITY_THUMB_NON_UAL + jmp instruction_assembled + +ARM_thumb_directive: + call ARM_generic_mode_checks + cmp [explicit_IT_state],0 + jnz ERROR_mode_change_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + mov [code_type],CPU_ACTIVITY_THUMB_UAL + jmp instruction_assembled + +ARM_itauto_directive: + or [it_control],IT_MODE_AUTO + xor eax,eax + mov [current_IT_block],eax + mov [potential_IT_anchor],eax + jmp instruction_assembled +ARM_itnoauto_directive: + and [it_control],not IT_MODE_AUTO + xor eax,eax + mov [current_IT_block],eax + jmp instruction_assembled + +ARM_thumbee_directive: + call ARM_generic_mode_checks + cmp [explicit_IT_state],0 + jnz ERROR_mode_change_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + mov [code_type],CPU_ACTIVITY_THUMB_UAL + CPU_ACTIVITY_THUMBEE + jmp instruction_assembled + +ARM_code32_directive: + call ARM_generic_mode_checks + cmp [explicit_IT_state],0 + jnz ERROR_mode_change_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + mov [code_type],CPU_ACTIVITY_ARM + jmp instruction_assembled + +ARM_code64_directive: + call ARM_generic_mode_checks + cmp [explicit_IT_state],0 + jnz ERROR_mode_change_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + mov [code_type],CPU_ACTIVITY_ARM64 + jmp instruction_assembled + +ARM_coprocessor_directive: + call decode_template + TEMPLATE \ + <TMPL_imm>,\ ;0=imm + <TMPL_copro_sel> ;1=imm + mov ecx,[immediate_value] + cmp al,1 + je .selected + and ecx,COPRO_CAPABILITY_DEFAULT + .selected: + mov [copro_capability_flags],ecx + jmp instruction_assembled + +ARM_processor_directive: + call decode_template + TEMPLATE \ + <TMPL_imm>,\ ;0=imm + <TMPL_cpu_sel> ;1=imm + mov ecx,[immediate_value] + mov edx,[immediate_value_high] + cmp al,1 + je .selected + and ecx,CPU_CAPABILITY_DEFAULT and (1 shl 32 - 1) + and edx,CPU_CAPABILITY_DEFAULT shr 32 + .selected: + mov [cpu_capability_flags],ecx + mov [cpu_capability_flags2],edx + jmp instruction_assembled + +ARM_format_directive: + cmp dword[esi],05018h + 0c019h shl 16 ;"elf dwarf" + jnz format_directive + cmp word[esi+4],01d19h ;"executable" + jnz format_directive + cmp edi,[code_start] + jne unexpected_instruction + mov edx,[addressing_space] + test byte [edx+0Ah],1 + jne unexpected_instruction + cmp [output_format],0 + jne unexpected_instruction + mov [format_flags],5 ;set to DWARF(4) + executable(1) + mov [output_format],5 ;set to ELF + mov edx,edi + mov ecx,34h shr 2 + lea eax,[edi+ecx*4] + cmp eax,[tagged_blocks] + jae out_of_memory + xor eax,eax + rep stosd + mov dword[edx],7fh + 'ELF' shl 8 + mov al,1 + mov [edx+4],al + mov [edx+5],al + mov [edx+6],al + mov byte[edx+10h],2 ;e_type + mov byte[edx+12h],40 ;machine type ARM + mov [edx+14h],al ;e_version + mov dword[edx+024h],02000016h ;e_flags + mov byte[edx+28h],34h ;e_ehsize + mov byte[edx+2ah],20h ;e_phentsize + mov byte[edx+2eh],28h ;e_shentsize + mov [code_type],ARM_code + add esi,6 + mov [image_base],0 + cmp byte[esi],80h + jne .base_ok + lodsw + cmp ah,'(' + jne invalid_argument + cmp byte[esi],'.' + je invalid_value + push edx + call get_dword_value + cmp [value_type],0 + jne invalid_use_of_symbol + mov [image_base],eax + pop edx + .base_ok: + mov ebx,edi + mov ecx,20h shr 2 + cmp [current_pass],0 + je .init_sections + imul ecx,[number_of_sections] + .init_sections: + xor eax,eax + rep stosd + mov [number_of_sections],0 + mov ecx,edi + sub ecx,[code_start] + mov eax,[image_base] + mov byte[ebx],1 ;p_type + mov [ebx+4],ecx ;file offset + mov [ebx+8],eax ;p_vaddr + mov [ebx+0ch],eax ;p_paddr + mov byte[ebx+18h],7 ;p_flags + mov word[ebx+1ch],20h ;p_align + mov [edx+18h],eax ;e_entry + or edx,-1 + mov cl,-1 + not eax + add eax,1 + adc edx,0 + adc cl,0 + add eax,edi + adc edx,0 + mov ebx,[addressing_space] + movzx ecx,cl + mov [ebx+0x00],eax + mov [ebx+0x04],edx + mov [ebx+0x08],ecx + mov dword[ebx+0x10],0 + mov dword[ebx+0x14],0 + mov [ebx+0x18],edi + mov dword[ebx+0x1c],0 + mov [symbols_stream],edi + jmp instruction_assembled + +ARM_section_directive: + cmp [output_format],5 + jnz section_directive + test [format_flags],4 + jz section_directive + mov eax,[addressing_space] + test byte[eax+0x0a],1 + jne illegal_instruction + ;first we close the current section + cmp [number_of_sections],0 + jz .first_section + call ARM_finish_elf_segment + jmp .next_section + .first_section: + cmp edi,[symbols_stream] ;has some code already been emitted? + jnz ERROR_code_is_not_in_a_section + mov eax,[image_base] + .next_section: + push eax + mov ebx,[number_of_sections] + shl ebx,5 + add ebx,[code_start] + add ebx,34h + cmp ebx,[symbols_stream] + jb .new_section_okay + mov ebx,[symbols_stream] + sub ebx,20h + mov [next_pass_needed],-1 + .new_section_okay: + push edi + mov edi,ebx + mov ecx,20h shr 2 + xor eax,eax + rep stosd + pop edi + pop ecx + mov eax,edi + sub eax,[code_start] + mov [ebx+04h],eax ;p_offset + mov [ebx+08h],ecx ;p_vaddr + mov dword[ebx+0ch],0 ;p_paddr + lodsw + cmp ax,'(' + jne ERROR_expecting_section_name + mov [ebx],esi ;we use p_type to temporarily store the string offset + mov ecx,[esi] + lea esi,[esi+4+ecx+1] + .next_attribute: + cmp byte[esi],8Ch + jz .section_alignment + cmp byte[esi],80h + jz .section_at + cmp byte[esi],19h + jnz .section_attributes_done + lodsw + sub ah,28 + jbe invalid_argument + cmp ah,1 + je .set_flag + cmp ah,3 + ja invalid_argument + xor ah,1 + cmp ah,2 + je .set_flag + inc ah + .set_flag: ;at least one flag required + test [ebx+18h],ah + jnz ERROR_duplicate_flag_setting + or [ebx+18h],ah + jmp .next_attribute + .section_alignment: ;required + inc esi + lodsb + cmp al,'(' + jne invalid_argument + cmp byte[esi],'.' + je invalid_value + push ebx + call get_dword_value + pop ebx + cmp [value_type],0 + jne ERROR_invalid_use_of_symbol_in_align + mov edx,eax + dec edx + test eax,edx + jnz invalid_value + test eax,eax + jz invalid_value + xchg [ebx+1ch],eax ;p_align + test eax,eax + jnz ERROR_duplicate_align_setting + jmp .next_attribute + .section_at: ;optional + lodsw + cmp ah,'(' + jne invalid_argument + cmp byte[esi],'.' + je invalid_value + push ebx + call get_dword_value + pop ebx + cmp [value_type],0 + jne ERROR_invalid_use_of_symbol_in_at + mov [ebx+0ch],eax ;p_paddr + or dword[ebx+018h],1 shl 31 + jmp .next_attribute + .section_attributes_done: + test byte[ebx+018h],-1 ;p_flags + jz ERROR_section_flags_zero + mov ecx,[ebx+01ch] ;p_align + sub ecx,1 + js ERROR_section_align_zero + test dword[ebx+018h],1 shl 31 + jz .no_at_specified + and dword[ebx+018h],not (1 shl 31) + mov eax,[ebx+0ch] ;p_paddr + test eax,ecx + jnz ERROR_section_at_not_aligned + jmp .finish + .no_at_specified: + mov eax,[ebx+08h] ;p_vaddr + add eax,ecx + not ecx + and eax,ecx + mov [ebx+0ch],eax ;p_paddr + .finish: + mov [ebx+08h],eax ;p_vaddr + or edx,-1 + mov cl,-1 + neg eax + cmc + adc edx,0 + adc cl,0 + add eax,edi + adc edx,0 + adc cl,0 + push eax ecx edx + call create_addressing_space + pop edx ecx eax + mov ebx,[addressing_space] + mov [ebx+0x00],eax + mov [ebx+0x04],edx + mov [ebx+0x08],cl + inc [number_of_sections] + jmp instruction_assembled + +ARM_finish_elf_segment: + ;called by close_elf after the last line is assembled + ;we must patch it to properly close the last section + cmp [output_format],5 + jnz .not_my_format + test [format_flags],4 + jz .not_my_format + mov eax,[code_start] + mov ecx,[eax] + cmp ecx,7fh + 'ELF' shl 8 + jnz .done + mov ebx,[number_of_sections] + dec ebx + shl ebx,5 + lea ebx,[ebx+eax+0x34] + cmp ebx,[symbols_stream] + jb .exe_section_ok + mov ebx,[symbols_stream] + sub ebx,20h + .exe_section_ok: + mov edx,edi ;edx=the original data end + mov eax,edi + mov ecx,[addressing_space] + sub eax,[ecx+0x18] ;length of code in this section + mov ecx,[ebx+01ch] ;align + sub ecx,1 + jc .align_done + and eax,ecx + jz .align_done + not eax + lea eax,[eax+ecx+2] + add eax,edi + cmp eax,[tagged_blocks] + jae out_of_memory + xor ecx,ecx + .align: + mov dword[edi],ecx + add edi,4 + cmp edi,eax + jb .align + mov edi,eax ;edi=the aligned data end + .align_done: + mov eax,edi + sub eax,[code_start] ;offset into file position of emitted code on disk + sub eax,[ebx+4] ;length code in this section + cmp edx,[undefined_data_end] + jne .size_ok + mov edi,[undefined_data_start] + mov dword[edi],0 + mov ecx,[addressing_space] + sub edi,[ecx+0x00] ;length of initialised code in this section + add edi,3 + and edi,not 3 + add edi,[ecx+0x00] + .size_ok: + mov [ebx+14h],eax ;p_memsz + mov eax,edi + sub eax,[code_start] ;offset into file position of emitted code on disk + sub eax,[ebx+4] ;length code in this section + mov [ebx+10h],eax ;p_filesz + mov eax,[ebx+8] ;p_vaddr + add eax,[ebx+14h] ;p_memsz + ;return eax = desired p_vaddr for next section + .done: + ret + .not_my_format: + mov ebx,[code_start] + mov dword[ebx+024h],0202h ;e_flags + .patch_start: + finish_elf_exe_patch_code + jmp finish_elf_segment+($-.patch_start) + +ARM_sections_added=7 + +ARM_close_dwarf: +;this is called after the assembler has finished + cmp [output_format],3 ;pe + jz ARM_close_pe + cmp [output_format],5 ;elf + jnz .ret + test [format_flags],4 + jz .ret + mov ebx,[code_start] + mov eax,edi + sub eax,ebx + mov [ebx+020h],eax ;e_shoff + movzx eax,word[ebx+02ch] ;e_phmnum + add eax,ARM_sections_added ;we add some sections + mov [ebx+30h],ax ;e_shnum + lea ecx,[eax*8] + sub vsp,vcx + mov vbp,vsp + ;build the .shstrtab table + mov edx,edi + sub edx,[code_start] + mov [vbp+vax*8+4-ARM_sections_added*8],edx + xor al,al + stosb + xor ecx,ecx + .next_code_section: + cmp cx,[ebx+02ch] ;e_phmnum + jae .code_section_names_done + mov edx,ecx + shl edx,5 + add edx,[ebx+01ch] ;e_phoff + add edx,[code_start] + mov eax,1 + xchg eax,[edx] ;p_type + cmp eax,1 + jnz .code_section_name_found + mov eax,ARM_string_noname_section + .code_section_name_found: + mov edx,[edx+04h] ;p_offset + mov [vbp+vcx*8+4],edx + call .add_string_to_shstrtab + add ecx,1 + jmp .next_code_section + .code_section_names_done: + lea eax,[ecx+1] + mov word[ebx+032h],ax ;e_shstrndx + mov eax,ARM_string_shstrtab + call .add_string_to_shstrtab + add ecx,1 + mov eax,ARM_string_debug_abbrev + call .add_string_to_shstrtab + add ecx,1 + mov eax,ARM_string_debug_info + call .add_string_to_shstrtab + add ecx,1 + mov eax,ARM_string_debug_line + call .add_string_to_shstrtab + add ecx,1 + mov eax,ARM_string_symtab + call .add_string_to_shstrtab + add ecx,1 + mov eax,ARM_string_strtab + call .add_string_to_shstrtab + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + add edi,[code_start] + sub ecx,ARM_sections_added-3 + ;build the .debug_abbrev table + mov edx,edi + sub edx,[code_start] + mov [vbp+vcx*8+4],edx + mov esi,ARM_data_debug_abbrev + mov edx,ecx + mov ecx,ARM_data_debug_abbrev_len + lea eax,[edi+ecx+010h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + add edi,[code_start] + lea ecx,[edx+1] + ;build the .debug_info table + mov edx,edi + sub edx,[code_start] + mov [vbp+vcx*8+4],edx + mov esi,ARM_data_debug_info + mov edx,ecx + mov ecx,ARM_data_debug_info_len + lea eax,[edi+ecx+010h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + call .get_top_level_file_name + mov ecx,esi + test byte[esi],-1 + jz .top_level_file_done + .top_level_file_loop: + add esi,1 + test byte[esi],-1 + jnz .top_level_file_loop + .top_level_file_done: + sub esi,ecx + xchg esi,ecx + lea eax,[edi+ecx+010h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + xor al,al + stosb + mov esi,ARM_data_debug_producer + mov ecx,ARM_data_debug_producer_len + lea eax,[edi+ecx+020h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + mov eax,[image_base] + stosd ;low_pc + mov eax,-1 + stosd ;high_pc + xor eax,eax + stosd ;stmt_list + stosb + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + mov eax,edi + lea ecx,[edx+1] + sub eax,[vbp+vcx*8+4-8] + add edi,[code_start] + lea edx,[eax-4] + neg eax + mov [edi+eax],edx + ;build the .debug_line table + mov edx,edi + sub edx,[code_start] + mov [vbp+vcx*8+4],edx + push ecx + mov esi,ARM_data_debug_line_prologue + mov ecx,ARM_data_debug_line_prologue_len + lea eax,[edi+ecx+010h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + PUSH vbp + call ARM_debug_add_file_names + POP vbp + mov eax,[esp] + mov eax,[vbp+vax*8+4] + add eax,[code_start] + mov ebx,edi + sub ebx,eax + sub ebx,10 + mov [eax+6],ebx + PUSH vbp + call ARM_debug_add_line_info + POP vbp + pop ecx + sub edi,[code_start] + mov eax,edi + add ecx,1 + sub eax,[vbp+vcx*8+4-8] + add edi,[code_start] + lea edx,[eax-4] + neg eax + mov [edi+eax],edx + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + add edi,[code_start] + ;build the .symtab table + mov edx,edi + sub edx,[code_start] + mov [vbp+vcx*8+4],edx + push ecx + PUSH vbp + lea eax,[edi+20h] + cmp eax,[tagged_blocks] + jae out_of_memory + xor eax,eax + stosd + stosd + stosd + stosd + call ARM_make_code_identifier_table + mov edx,edi + sub edx,[code_start] + mov [first_global_symbol],edx + call ARM_make_symbol_symtab + POP vbp + pop ecx + mov edx,[first_global_symbol] + sub edx,[vbp+vcx*8+4] + mov [first_global_symbol],edx + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + add edi,[code_start] + add ecx,1 + ;build the .strtab table + mov edx,edi + sub edx,[code_start] + mov [vbp+vcx*8+4],edx + push ecx + call ARM_make_symbol_strtab + pop ecx + mov dword[edi],0 + sub edi,[code_start] + add edi,3 + and edi,not 3 + add edi,[code_start] + add ecx,1 + mov ebx,[code_start] + mov edx,edi + sub edx,ebx + mov [vbp+vcx*8+4],edx + mov [ebx+020h],edx ;e_shoff + ;zero the new section headers + movzx ecx,word[ebx+30h] ;e_shnum + imul ecx,28h shr 2 + lea edx,[ecx*4-28h] ;skip the null section header + lea eax,[edi+ecx+10h] + cmp eax,[tagged_blocks] + jae out_of_memory + xor eax,eax + rep stosd + sub edi,edx + ;place_the code section headers + xor ecx,ecx + .next_code_placement: + cmp cx,[ebx+02ch] ;e_phmnum + jae .code_section_placement_done + mov edx,ecx + shl edx,5 + add edx,[ebx+01ch] ;e_phoff + add edx,[code_start] + mov eax,[vbp+vcx*8] + mov [edi+00h],eax ;sh_name + mov byte[edi+04h],1 ;sh_type + mov eax,[edx+018h] ;p_flags + test al,2 ;test write flag + setnz ah + and al,1 + shl al,2 + or al,ah + or al,2 + movzx eax,al + mov [edi+08h],eax ;sh_flags + mov eax,[edx+08h] ;p_vaddr + mov [edi+0ch],eax ;sh_addr + mov eax,[edx+04h] ;p_offset + mov [edi+010h],eax ;sh_offset + mov eax,[edx+010h] ;p_filesz + mov [edi+014h],eax ;sh_size + mov eax,[edx+01ch] ;p_align + mov [edi+020h],eax ;sh_addralign + add edi,028h + add ecx,1 + jmp .next_code_placement + .code_section_placement_done: + ;place the .shstrtab section header + mov dl,3 + call .make_section_header + ;place the .debug_abbrev section header + mov dl,1 + call .make_section_header + ;place the .debug_info section header + mov dl,1 + call .make_section_header + ;place the .debug_line section header + mov dl,1 + call .make_section_header + ;place the .symtab section header + mov dl,2 + call .make_section_header + mov edx,[first_global_symbol] + lea eax,[ecx+1] ;index to the next section (.strtab) + mov [edi-28h+018h],eax ;sh_link + shr edx,4 + mov [edi-28h+01ch],edx ;sh_info + mov byte[edi-28h+020h],04h ;sh_addralign + mov byte[edi-28h+024h],10h ;sh_size + ;place the .strtab section header + mov dl,3 + call .make_section_header + .done: + movzx eax,word[ebx+02ch] ;e_phmnum + add eax,ARM_sections_added + lea vsp,[vbp+vax*8] + .ret: + ret + .add_string_to_shstrtab: + ;ecx=section number + ;eax=pointer to string + push ecx + mov edx,edi + sub edx,[code_start] + sub edx,[ebx+020h] ;s_shoff + mov [vbp+vcx*8],edx ;store the string offset + mov ecx,[eax] + lea esi,[edi+ecx+010h] + cmp esi,[tagged_blocks] + jae out_of_memory + lea esi,[eax+4] + rep movsb + xor al,al + stosb + pop ecx + ret + .make_section_header: + mov eax,[vbp+vcx*8] + mov [edi+00h],eax ;sh_name + mov [edi+04h],dl ;sh_type + mov eax,[vbp+vcx*8+4] + mov dword[edi+010h],eax ;sh_offset + sub eax,[vbp+vcx*8+4+8] + neg eax + mov [edi+014h],eax ;sh_size + add edi,028h + add ecx,1 + ret + .get_top_level_file_name: + mov esi,[source_start] + mov esi,[esi+1] + mov esi,[esi] + ret + +ARM_close_pe: + mov ebx,[code_start] ;ebx points to PE header + ;calculate size of code + movzx eax,word[ebx+0x14] + lea edx,[ebx+eax+0x18] ;edx points to section headers + xor eax,eax + xor ecx,ecx + cmp cx,[ebx+6] + jae .code_size_known + .code_size_loop: + test dword[edx+0x24],0x20 + jz .next_code_section + add eax,[edx+0x10] + cmp dword[ebx+0x18+20],0 + jnz .next_code_section + mov esi,[edx+0xc] ;get virtual address + mov [ebx+0x18+20],esi ;update base of code + .next_code_section: + add edx,0x28 + inc ecx + cmp cx,[ebx+6] + jb .code_size_loop + .code_size_known: + mov [ebx+0x18+4],eax ;update the size of code + ;calculate size of initialised data + movzx eax,word[ebx+0x14] + lea edx,[ebx+eax+0x18] ;edx points to section headers + xor eax,eax + xor ecx,ecx + cmp cx,[ebx+6] + jae .initialised_size_known + .initialised_size_loop: + test dword[edx+0x24],0x40 + jz .next_initialised_section + add eax,[edx+0x10] + cmp dword[ebx+0x18+24],0 + jnz .next_initialised_section + mov esi,[edx+0xc] ;get virtual address + mov [ebx+0x18+24],esi ;update base of data + .next_initialised_section: + add edx,0x28 + inc ecx + cmp cx,[ebx+6] + jb .initialised_size_loop + .initialised_size_known: + mov [ebx+0x18+8],eax ;update the size of initialised data + ;calculate size of uninitialised data + movzx eax,word[ebx+0x14] + lea edx,[ebx+eax+0x18] ;edx points to section headers + xor eax,eax + xor ecx,ecx + cmp cx,[ebx+6] + jae .uninitialised_size_known + .uninitialised_size_loop: + test dword[edx+0x24],0x80 + jz .next_uninitialised_section + add eax,[edx+0x8] + sub eax,[edx+0x10] + .next_uninitialised_section: + add edx,0x28 + inc ecx + cmp cx,[ebx+6] + jb .uninitialised_size_loop + .uninitialised_size_known: + mov [ebx+0x18+12],eax ;update the size of uninitialised data + ;update relocs stripped flag + cmp dword[ebx+0x78+5*8+4],0 + jz .checksum + and word[ebx+0x16],not 1 + .checksum: + mov ecx,0x10 + mov dword[ebx+0x58],0 + jmp directory_ok ;recompute checksum and return + +ARM_start_line_processing: + add edi,0fh + and edi,not 0fh + cmp edi,[tagged_blocks] + jae out_of_memory + mov eax,[labels_list] + mov [tagged_blocks],eax + mov eax,[additional_memory] + mov [free_additional_memory],eax + mov eax,[additional_memory_end] + mov [structures_buffer],eax + mov esi,[source_start] + mov [code_start],edi + xor eax,eax + mov dword [adjustment],eax + mov dword [adjustment+4],eax + mov [addressing_space],eax + mov [error_line],eax + mov [counter],eax + mov [format_flags],eax + mov [number_of_relocations],eax + mov [undefined_data_end],eax + mov [file_extension],eax + mov [next_pass_needed],al + mov [output_format],al + mov [adjustment_sign],al + mov [code_type],ARM_code + call init_addressing_space + inc [current_pass] + mov ax,[current_pass] + cmp ax,[passes_limit] + je code_cannot_be_generated + ret + +ARM_debug_add_file_names: + ;file names are compared by string and not address, + ;this is because it is possible to include a file more than once, + ;then we would have duplicated entries in the table + push [code_start] + push edi + call ARM_start_line_processing + mov vbp,vsp + .neg1 = -1 + push .neg1 ;-4 total files + push [input_file] + .line_loop: + cmp byte[esi],0Fh + jne .next_line + call .find_source_line + mov eax,[eax] + mov ebx,[vbp-4] + test ebx,ebx + jz .add_file + .file_loop: + if __is_64 + movsxd rbx,ebx + end if + mov ecx,[vbp-4+vbx*4] + cmp eax,ecx + jz .next_line + .char_loop: + mov dl,[eax] + mov dh,[ecx] + add eax,1 + add ecx,1 + cmp dh,dl + jnz .next_file + test dl,dl + jnz .char_loop + jmp .next_line + .next_file: + call .find_source_line + mov eax,[eax] + add ebx,1 + jnz .file_loop + .add_file: + mov ebx,[vbp-4] + sub ebx,1 + mov [vbp-4],ebx + call .find_source_line + mov eax,[eax] + push eax + .next_line: + PUSH vbp + call assemble_line + POP vbp + jnc .line_loop + mov edi,[vbp] + xor edx,edx + cmp edx,[vbp-4] + jle .done + .copy_loop: + mov esi,[vbp-8+vdx*4] + mov ecx,[input_file] + cmp ecx,esi + jnz .not_top_level_source + test byte[esi],-1 + jz .top_level_file_done + .top_level_file_loop: + add esi,1 + test byte[esi],-1 + jnz .top_level_file_loop + .top_level_file_done: + sub esi,ecx + xchg esi,ecx + jmp .copy + .not_top_level_source: + movzx ecx,byte[esi-1] + sub ecx,1 + jns .copy + mov ecx,dword[esi-4] + .copy: + lea eax,[edi+ecx+010h] + cmp eax,[tagged_blocks] + jae out_of_memory + rep movsb + xor eax,eax + stosd + sub edx,1 + cmp edx,[vbp-4] + jg .copy_loop + .done: + xor al,al + stosb + mov [vbp],edi + mov vsp,vbp + cmp [number_of_sections],0 + jnz .section_count_okay + inc [number_of_sections] + .section_count_okay: + pop edi + pop [code_start] + .ret: + ret + .find_source_line: + mov eax,[esi+1] + .next_source_link: + test byte[eax+7],0x80 + jz .ret + mov eax,[eax+12] + jmp .next_source_link + +ARM_debug_add_line_info: + mov ecx,[code_start] + mov ecx,[ecx+0x38] + .16k = 16 shl 10 + push .16k ;+20 initial buffer size + push edi ;+16 start of line data + push ecx ;+12 offset to first program byte + push [code_start] ;+8 real generated code + push edi ;+4 current output position for line data + add eax,ARM_data_debug_line_prologue_len + push eax ;+0 file name buffer + mov vbp,vsp + .restart: + add edi,[vbp+20] + lea eax,[edi+0x20] + cmp eax,[tagged_blocks] + jae out_of_memory + call ARM_start_line_processing + push 1 ;-4 state machine file number + push 1 ;-8 state machine line number + push 0 ;-12 state machine address offset + push 0 ;-16 address before assembly + push 0 ;-20 address after assembly + push 0 ;-24 source line before assembly + .line_loop: + cmp byte[esi],0x0f + jne .skip_line + mov ecx,[addressing_space] + test byte[ecx+0x0a],1 + jnz .skip_line + mov ecx,[ecx+0x00] + sub ecx,edi + neg ecx + mov [vbp-16],ecx + mov [vbp-24],esi + PUSH vbp + call assemble_line + POP vbp + jc .close + mov ecx,[addressing_space] + test byte[ecx+0x0a],1 + jnz .line_loop + mov ecx,[ecx+0x00] + sub ecx,edi + neg ecx + mov [vbp-20],ecx + call .emit_line_data + jmp .line_loop + .skip_line: + PUSH vbp + call assemble_line + POP vbp + jnc .line_loop + .close: + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + sub eax,[vbp-12] ;current + call .pc_far + mov al,0 ;extended opcode + call .write_line_code + mov al,1 ;one byte + call .write_line_code + mov al,1 ;end sequence + call .write_line_code + mov eax,[vbp+4] + cmp eax,[code_start] + jbe .close_okay + mov edi,[vbp+16] + sub eax,edi + mov [vbp+4],edi + add eax,0x100 + mov [vbp+20],eax ;adjust the buffer size + mov vsp,vbp + jmp .restart + .close_okay: + lea vsp,[vbp+4] + cmp [number_of_sections],0 + jnz .section_count_okay + inc [number_of_sections] + .section_count_okay: + pop edi + pop [code_start] + add esp,12 + ret + .emit_line_data: + mov eax,[vbp+4] + lea eax,[eax+20h] + cmp eax,[tagged_blocks] + jae out_of_memory + mov eax,edi + sub eax,[code_start] + cmp eax,[vbp+12] ;any output yet? + jb .ret + mov eax,[vbp-20] + cmp eax,[vbp-16] + je .ret + call .update_file + call .update_address + jmp .update_line + .update_file: + mov edx,1 shl 16 ;start at file number 1 + mov ecx,[vbp] + .file_loop: + call .find_source_line + mov eax,[eax+0] ;file name + .char_loop: + mov dl,[eax] + mov dh,[ecx] + add eax,1 + add ecx,1 + cmp dh,dl + jnz .next_file + test dl,dl + jnz .char_loop + jmp .found_file + .next_file: + add edx,1 shl 16 ;bump to next file + test dh,dh + jz .skip_null + .skip_loop: + add ecx,1 + mov dh,[ecx] + test dh,dh + jnz .skip_loop + .skip_null: + add ecx,4 + cmp byte[ecx],0 + jnz .file_loop + jmp ERROR_line_processing_error + .found_file: + shr edx,16 + cmp edx,[vbp-4] + jz .ret + ;set a new file + mov [vbp-4],edx + mov al,4 ;opcode 4: set file + call .write_line_code + jmp .emit_leb128 + .update_address: + mov eax,[vbp-16] ;before + sub eax,[vbp-12] ;current + cmp eax,40 + jbe .ret + cmp eax,80 + ja .pc_far + add dword[vbp-12],40 + push eax + mov al,8 ;opcode 8: const add pc + call .write_line_code + pop eax + sub eax,40 + ret + .pc_far: + add [vbp-12],eax + test eax,eax + js .pc_negative + mov edx,eax + mov al,2 ;opcode 2: advance pc + call .write_line_code + call .emit_leb128 + xor eax,eax + ret + .pc_negative: + mov al,0 ;extended opcode + call .write_line_code + mov al,5 ;5 bytes + call .write_line_code + mov al,2 ;set address + call .write_line_code + mov eax,[vbp-12] ;LSB + call .write_line_code + shr eax,8 + call .write_line_code + shr eax,8 + call .write_line_code + shr eax,8 ;MSB + call .write_line_code + xor eax,eax + ret + .update_line: + ;eax=address advance value + push eax + call .find_source_line + mov edx,[eax+4] + sub edx,[vbp-8] + add [vbp-8],edx + pop eax + cmp edx,6 + jb .send_special_code + .send_line_advance: + push eax + mov al,3 ;opcode 3: advance line + call .write_line_code + call .emit_signed_leb + xor edx,edx + pop eax + test eax,eax + jnz .send_special_code + .copy: + mov al,1 ;opcode 1: copy + jmp .write_line_code + .send_special_code: + add [vbp-12],eax + imul eax,6 + add eax,edx + jz .copy + add eax,10 ;special opcode + jmp .write_line_code + .find_source_line: + mov eax,[vbp-24] + mov eax,[eax+1] + .next_source_link: + test byte[eax+7],0x80 + jz .ret + mov eax,[eax+12] + jmp .next_source_link + .emit_leb128: + bsr ecx,edx + jnz .leb_calcu + or ecx,-1 + .leb_calcu: + add ecx,1 + jmp .next_leb128 + .emit_signed_leb: + ;edx is the value to emit + test edx,edx + jns .leb_pos + not edx + bsr ecx,edx + not edx + jmp .leb_bits + .leb_pos: + bsr ecx,edx + .leb_bits: + jnz .leb_calc + or ecx,-1 + .leb_calc: + add ecx,2 + .next_leb128: + mov eax,edx + and eax,0x7f + shr edx,7 + sub ecx,7 + jle .write_line_code + or al,0x80 ;set continuation bit + call .write_line_code + jmp .next_leb128 + .write_line_code: + mov ebx,[vbp+4] + cmp ebx,[code_start] + jae .skip_overwrite + mov [ebx],al + .skip_overwrite: + inc ebx + mov [vbp+4],ebx + .ret: + ret + +ARM_string_arm_code_offset = 1 +ARM_string_thumb_code_offset = 1+ARM_string_arm_code_offset+ARM_string_arm_code_identifier_len +ARM_string_data_offset = 1+ARM_string_thumb_code_offset+ARM_string_thumb_code_identifier_len +ARM_string_thumbee_code_offset = 1+ARM_string_data_offset+ARM_string_data_identifier_len + +ARM_make_symbol_strtab: + mov ebx,[code_start] + xor al,al + stosb + mov esi,ARM_string_arm_code_identifier + mov ecx,ARM_string_arm_code_identifier_len + rep movsb + stosb + mov esi,ARM_string_thumb_code_identifier + mov ecx,ARM_string_thumb_code_identifier_len + rep movsb + stosb + mov esi,ARM_string_data_identifier + mov ecx,ARM_string_data_identifier_len + rep movsb + stosb + mov esi,ARM_string_thumbee_code_identifier + mov ecx,ARM_string_thumbee_code_identifier_len + rep movsb + stosb + mov esi,[ebx-4] ;esi=source of label data + mov ebx,[ebx-8] ;ebx=last address+1 + cmp esi,ebx + jae .ret + .loop: + movzx ecx,byte[esi] + lea eax,[esi+1] + mov edx,[esi+ecx+1] + lea esi,[esi+ecx+5] + test dword[edx+8],0100h + jz .skip + xchg esi,eax + lea edx,[edi+ecx+10h] + cmp edx,[tagged_blocks] + jae out_of_memory + rep movsb + xchg esi,eax + xor al,al + stosb + .skip: + cmp esi,ebx + jb .loop + .ret: + ret + +ARM_make_symbol_symtab: + mov ebx,[code_start] + mov esi,[ebx-4] ;esi=source of label data + mov ebx,[ebx-8] ;ebx=last address+1 + cmp esi,ebx + jae .ret + push ebp + mov ebp,1+ARM_string_arm_code_identifier_len+\ + 1+ARM_string_thumb_code_identifier_len+\ + 1+ARM_string_data_identifier_len+\ + 1+ARM_string_thumbee_code_identifier_len+\ + 1 + .loop: + movzx ecx,byte[esi] + mov edx,[esi+ecx+1] + lea esi,[esi+ecx+5] + test dword[edx+8],0100h + jz .skip + lea eax,[edi+20h] + cmp eax,[tagged_blocks] + jae out_of_memory + mov [edi],ebp ;name + lea ebp,[ebp+ecx+1] + mov eax,[edx] + mov [edi+4],eax ;value + movzx eax,byte[edx+10] + mov [edi+8],eax ;size + test eax,eax + setz al + movzx eax,al + add eax,1 + 1 shl 4 ;object = 1, function = 2 + binding global + mov [edi+12],ax ;binding type + mov eax,[edx] + ;find the section associated with this label + mov ecx,[code_start] + movzx edx,word[ecx+02ch] ;e_phnum + add edx,1 + .next_section: + sub edx,1 + je .no_section + lea ecx,[edx-1] + shl ecx,5 + add ecx,[code_start] + cmp eax,[ecx+034h+8] ;p_vaddr + jb .next_section + sub eax,[ecx+034h+8] ;p_vaddr + cmp eax,[ecx+034h+14h] ;p_memsz + jb .section_found + add eax,[ecx+034h+8] ;p_vaddr + jmp .next_section + .no_section: + xor edx,edx + .section_found: + mov word[edi+14],dx ;section + add edi,16 + .skip: + cmp esi,ebx + jb .loop + pop ebp + .ret: + ret + +ARM_make_code_identifier_table: + mov ecx,[code_start] + mov ecx,[ecx+38h] + .16k = 16 shl 10 + push .16k ;+16 initial buffer size + push edi ;+12 start of data + push ecx ;+8 offset to first program byte + push [code_start] + push edi ;+0 current output position + mov vbp,vsp + .restart: + add edi,[vbp+16] + lea ebx,[edi+0x20] + cmp ebx,[tagged_blocks] + jae out_of_memory + call ARM_start_line_processing + .neg1 = -1 + push .neg1 ;-4 last code type + push .neg1 ;-8 this code type + push .neg1 ;-12 this code address + .line_loop: + mov edx,esi + cmp byte[edx],0Fh + jnz .check_data + add edx,5 + .check_data: + ;any data yet? + mov eax,edi + sub eax,[code_start] + cmp eax,[vbp+8] + jb .skip_line + .find_line: + mov al,[edx] + cmp al,1 + jz .do_line + cmp al,2 + jz .do_value + cmp al,3 + jnz .skip_line + .do_value: + add edx,6 + jmp .find_line + .do_line: + mov ecx,[addressing_space] + test byte[ecx+0x0a],1 + jnz .skip_line + movzx eax,word[edx+1] + mov ecx,080h ;data code type + cmp eax,ARM_code_generator_start-instruction_handler + jb .found_generator + movzx ecx,[code_type] + .found_generator: + mov [vbp-8],ecx + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + mov [vbp-12],eax + PUSH vbp + call assemble_line + POP vbp + lahf + mov ecx,[vbp-8] + cmp ecx,[vbp-4] + jz .next_line + mov edx,[addressing_space] + test byte[edx+0x0a],1 + jnz .next_line + push eax + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + cmp eax,[vbp-12] + jz .non_code_line + xchg edi,[vbp] + lea ebx,[edi+16] + cmp ebx,[code_start] + jae .skip_overwrite1 + mov [vbp-4],ecx + lea edx,[edi+20h] + cmp edx,[tagged_blocks] + jae out_of_memory + mov edx,ARM_string_data_offset + test cl,cl + js .found_generator2 + mov edx,ARM_string_arm_code_offset + test ecx,CPU_ACTIVITY_ARM + jnz .found_generator2 + mov edx,ARM_string_thumb_code_offset + test ecx,CPU_ACTIVITY_THUMBEE + jz .found_generator2 + mov edx,ARM_string_thumbee_code_offset + .found_generator2: + mov eax,[vbp-12] + mov [edi],edx ;name + mov [edi+4],eax ;address + mov dword[edi+8],0 ;length + mov ecx,2 + cmp edx,ARM_string_data_offset + jnz @f + mov ecx,1 + @@: mov [edi+12],cx ;binding type + ;find the section associated with this address + mov ecx,[vbp+4] + movzx edx,word[ecx+02ch] ;e_phnum + add edx,1 + .next_section: + sub edx,1 + je .no_section + lea ecx,[edx-1] + shl ecx,5 + add ecx,[vbp+4] + cmp eax,[ecx+034h+8] ;p_vaddr + jb .next_section + sub eax,[ecx+034h+8] ;p_vaddr + cmp eax,[ecx+034h+14h] ;p_memsz + jb .section_found + add eax,[ecx+034h+8] ;p_vaddr + jmp .next_section + .no_section: + xor edx,edx + .section_found: + mov word[edi+14],dx ;section + .skip_overwrite1: + add edi,16 + xchg edi,[vbp] + .non_code_line: + pop eax + .next_line: + sahf + jmp .finish_line + .skip_line: + PUSH vbp + call assemble_line + POP vbp + .finish_line: + jnc .line_loop + mov ecx,[vbp-8] + test cl,cl + js .done + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + xchg edi,[vbp] + lea ebx,[edi+16] + cmp ebx,[code_start] + jae .skip_overwrite2 + mov edx,ARM_string_data_offset + mov [edi],edx ;name + mov [edi+4],eax ;address + mov dword[edi+8],0 ;length + mov word[edi+12],1 ;binding type + mov word[edi+14],0 ;section + .skip_overwrite2: + add edi,16 + xchg edi,[vbp] + .done: + mov eax,[vbp] + cmp eax,[code_start] + jb .done_okay + mov edi,[vbp+12] + mov eax,[vbp] + sub eax,edi + mov [vbp],edi + add eax,0x100 + mov [vbp+16],eax ;adjust the buffer size + mov vsp,vbp + jmp .restart + .done_okay: + mov vsp,vbp + cmp [number_of_sections],0 + jnz .section_count_okay + inc [number_of_sections] + .section_count_okay: + pop edi + pop [code_start] + add esp,12 + ret + +ARM_label_walker: + mov edi,[code_start] + add edi,4 + push edi + call .walk + pop esi + mov ebx,edi + add edi,0fh+8 + and edi,not 0fh + mov [code_start],edi + mov [edi-4],esi + mov [edi-8],ebx + mov [esi-4],eax + ret + .walk: + mov edx,32+1 + mov ebx,hash_tree + xor eax,eax + test dword[ebx],-1 + jz .done + .recur: + mov ebx,[ebx] + sub edx,1 + jz .store + test dword[ebx],-1 + jz .right + push ebx + call .recur + pop ebx + .right: + add ebx,4 + test dword[ebx],-1 + jz .done + call .recur + .done: + add edx,1 + ret + .store: + add eax,1 ;bump the label count + mov esi,[ebx+4] + mov esi,[esi+18h] ;string text name + movzx ecx,byte[esi-1] ;name length + mov [edi],cl + add edi,1 + lea esi,[edi+ecx+20h] + cmp esi,[labels_list] + jae out_of_memory + mov esi,[ebx+4] + mov esi,[esi+18h] ;string text name + rep movsb + lea esi,[ebx+4] ;offset to 24 byte data field + movsd + mov ebx,[ebx] ;next link? + test ebx,ebx + jnz .store + jmp .done + +ARM_org_directive: + cmp [output_format],5 + jnz org_directive + test [format_flags],4 + jz org_directive + jmp ERROR_org_not_allowed + +;we must supply this label for parser.inc to assemble + +prefix_instruction: ;not used in ARM + +ARM_data_debug_abbrev: + ;this is the debug_abbrev table, it is the minimum requirement to make a complete table for AXD + db 1 ;abbrev code + db 11h ;tag_compile_unit + db 1 ;has children + db 3,8 ;name,string + db 25h,8 ;producer,string + db 11h,1 ;low_pc,address + db 12h,1 ;high_pc,address + db 10h,6 ;stmt_list,data4 + db 0 ;terminate child + db 0 ;no siblings +ARM_data_debug_abbrev_len=$-ARM_data_debug_abbrev + +ARM_data_debug_producer: + db 'ARMv8 assembler core v',ARM_VERSION_STRING,' for flat assembler v',VERSION_STRING,' by revolution',0 +ARM_data_debug_producer_len=$-ARM_data_debug_producer + +ARM_data_debug_info: + dd 0 ;length + dw 2 ;version + dd 0 ;offset to abbrev table + db 4 ;address size + db 1 ;abbrev code +ARM_data_debug_info_len=$-ARM_data_debug_info + +ARM_data_debug_line_prologue: + ;this defines the layout of the line numbers table + dd 0 ;total length + dw 2 ;version + dd 0 ;prologue length + db 1 ;minimum instruction length + db 1 ;default is statment + db 0 ;line base + db 6 ;line range + db 10 ;opcode base + db 0,1,1,1,1,0,0,0,0 ;standard opcode lengths + db 0 ;no include directories +ARM_data_debug_line_prologue_len=$-ARM_data_debug_line_prologue + +ARM_string_arm_code_identifier: + db '$a' + ARM_string_arm_code_identifier_len=$-ARM_string_arm_code_identifier +ARM_string_thumb_code_identifier: + db '$t' + ARM_string_thumb_code_identifier_len=$-ARM_string_thumb_code_identifier +ARM_string_data_identifier: + db '$d' + ARM_string_data_identifier_len=$-ARM_string_data_identifier +ARM_string_thumbee_code_identifier: + db '$t.x' + ARM_string_thumbee_code_identifier_len=$-ARM_string_thumbee_code_identifier +ARM_string_shstrtab: + dd ARM_string_shstrtab_len + db '.shstrtab' + ARM_string_shstrtab_len=$-ARM_string_shstrtab-4 +ARM_string_debug_abbrev: + dd ARM_string_debug_abbrev_len + db '.debug_abbrev' + ARM_string_debug_abbrev_len=$-ARM_string_debug_abbrev-4 +ARM_string_debug_info: + dd ARM_string_debug_info_len + db '.debug_info' + ARM_string_debug_info_len=$-ARM_string_debug_info-4 +ARM_string_debug_line: + dd ARM_string_debug_line_len + db '.debug_line' + ARM_string_debug_line_len=$-ARM_string_debug_line-4 +ARM_string_symtab: + dd ARM_string_symtab_len + db '.symtab' + ARM_string_symtab_len=$-ARM_string_symtab-4 +ARM_string_strtab: + dd ARM_string_strtab_len + db '.strtab' + ARM_string_strtab_len=$-ARM_string_strtab-4 +ARM_string_noname_section: + dd ARM_string_noname_section_len + db '.flat' + ARM_string_noname_section_len=$-ARM_string_noname_section-4 + +ARM_code_generator_start: + +;ARM/THUMB jump table + +INST_ARM64 equ es +INST_ARM64S equ fs +INST_ARM64V equ gs + +ARM_instruction_adc: + INST_ARM64S + dd 0x1a000000 + dd ARM64_dz_nz_mz + mov edx,ARM_INSTRUCTION_OPCODE_ADC shl 21 + mov ecx,0xe shl 28 + 0xa shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_add: + INST_ARM64S + dd 0x00000000 + dd ARM64_arithmetic1 + mov edx,ARM_INSTRUCTION_OPCODE_ADD shl 21 + mov ecx,0xe shl 28 + 0x8 shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_addw: + mov edx,ARM_INSTRUCTION_OPCODE_ADD shl 21 + mov ecx,0xf2000000 + jmp THUMB_rd_rn_imm12 +ARM_instruction_adr: + INST_ARM64 + dd 0x10000000 + dd ARM64_adr + mov edx,ARM_INSTRUCTION_OPCODE_ADD shl 21 + jmp ARM_rd_target +ARM_instruction_and: + INST_ARM64S + dd 0x00000000 + dd ARM64_arithmetic2 + mov edx,ARM_INSTRUCTION_OPCODE_AND shl 21 + mov ecx,0xe shl 28 + 0x0 shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_asr: + INST_ARM64 + dd 0x1ac02800 + dd ARM64_arithmetic3 + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + ARM_SHIFT_OPCODE_ASR shl 5 + jmp ARM_rd_rn_shift +ARM_instruction_b: + INST_ARM64 + dd 0x14000000 + dd ARM64_b + mov edx,0x0a000000 + jmp ARM_target +ARM_instruction_bfc: + mov edx,0x07c0001f + mov ecx,0xf36f0000 + jmp ARM_rd_imm_imm +ARM_instruction_bfi: + INST_ARM64 + dd 0x33000000 + dd ARM64_bfi + mov edx,0x07c00010 + mov ecx,0xf3600000 + jmp ARM_rd_rn_imm_imm +ARM_instruction_bic: + INST_ARM64S + dd 0x00200000 + dd ARM64_arithmetic2 + mov edx,ARM_INSTRUCTION_OPCODE_BIC shl 21 + mov ecx,0xe shl 28 + 0x1 shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_bkpt: + mov edx,0x01200070 + jmp ARM_immediate16 +ARM_instruction_bl: + INST_ARM64 + dd 0x94000000 + dd ARM64_b + mov edx,0x0b000000 + jmp ARM_target +ARM_instruction_blx: + mov edx,0 ;instruction varies depending upon parameters + jmp ARM_Xtarget +ARM_instruction_bx: + mov edx,0x012fff10 + jmp ARM_rm +ARM_instruction_bxj: + mov edx,0x012fff20 + mov ecx,0xf3c08f00 + jmp ARM_rm_J +ARM_instruction_cbnz: + INST_ARM64 + dd 0x35000000 + dd ARM64_b_reg + mov ecx,0xb900 + jmp THUMB_reg_address +ARM_instruction_cbz: + INST_ARM64 + dd 0x34000000 + dd ARM64_b_reg + mov ecx,0xb100 + jmp THUMB_reg_address +ARM_instruction_cdp: + mov edx,0x0e000000 + jmp ARM_copro_op1_crd_crn_crm_op2 +ARM_instruction_cdp2: + mov edx,0xfe000000 + jmp ARM_copro_op1_crd_crn_crm_op2 +ARM_instruction_chka: + jmp THUMBEE_rn_rm +ARM_instruction_clrex: + INST_ARM64 + dd 0xd503305f + dd ARM64_clrex + mov edx,0xf57ff01f + mov ecx,0xf3bf8f2f + jmp ARM_clrex +ARM_instruction_clz: + INST_ARM64 + dd 0x5ac01000 + dd ARM64_arithmetic4 + mov edx,0x016f0f10 + mov ecx,0xfab0f080 + jmp ARM_rd_rm_CLZ +ARM_instruction_cmn: + INST_ARM64 + dd 0x20000000 + dd ARM64_arithmetic1_zr + mov edx,ARM_INSTRUCTION_OPCODE_CMN shl 21 + 1 shl 20 + mov ecx,0xe shl 28 + 0x8 shl 21 + 1 shl 20 + 0xf shl 8 + jmp ARM_rn_shifter +ARM_instruction_cmnp: + mov edx,ARM_INSTRUCTION_OPCODE_CMN shl 21 + 1 shl 20 + 0xf shl 12 + jmp ARM_rn_shifter_26bit +ARM_instruction_cmp: + INST_ARM64 + dd 0x60000000 + dd ARM64_arithmetic1_zr + mov edx,ARM_INSTRUCTION_OPCODE_CMP shl 21 + 1 shl 20 + mov ecx,0xe shl 28 + 0xd shl 21 + 1 shl 20 + 0xf shl 8 + jmp ARM_rn_shifter +ARM_instruction_cmpp: + mov edx,ARM_INSTRUCTION_OPCODE_CMP shl 21 + 1 shl 20 + 0xf shl 12 + jmp ARM_rn_shifter_26bit +ARM_instruction_cps: + mov edx,0xf1020000 + mov ecx,0xf3af8100 + jmp ARM_mode +ARM_instruction_cpsid: + mov edx,0xf10c0000 + mov ecx,0xf3af8600 + jmp ARM_iflags_mode +ARM_instruction_cpsie: + mov edx,0xf1080000 + mov ecx,0xf3af8400 + jmp ARM_iflags_mode +ARM_instruction_cpy: + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + mov ecx,0xe shl 28 + 0x2 shl 21 + 0xf shl 16 + jmp ARM_rd_rm_CPY +ARM_instruction_dbg: + mov edx,0x0320f0f0 + mov ecx,0xf3af80f0 + jmp ARM_imm4 +ARM_instruction_dmb: + INST_ARM64 + dd 0xd50330bf + dd ARM64_data_barrier + mov edx,0xf57ff050 + mov ecx,0xf3bf8f50 + jmp ARM_barrier +ARM_instruction_dsb: + INST_ARM64 + dd 0xd503309f + dd ARM64_data_barrier + mov edx,0xf57ff040 + mov ecx,0xf3bf8f40 + jmp ARM_barrier +ARM_instruction_enterx: + mov ecx,0xf3bf8f1f + jmp THUMBEE_enterx +ARM_instruction_eor: + INST_ARM64 + dd 0x40000000 + dd ARM64_arithmetic2 + mov edx,ARM_INSTRUCTION_OPCODE_EOR shl 21 + mov ecx,0xe shl 28 + 0x4 shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_hb: + mov edx,0x0000c200 + jmp THUMBEE_imm +ARM_instruction_hbl: + mov edx,0x0000c300 + jmp THUMBEE_imm +ARM_instruction_hblp: + mov edx,0x0000c400 + jmp THUMBEE_imm5_imm5 +ARM_instruction_hbp: + mov edx,0x0000c000 + jmp THUMBEE_imm3_imm5 +ARM_instruction_isb: + INST_ARM64 + dd 0xd50330df + dd ARM64_instruction_barrier + mov edx,0xf57ff060 + mov ecx,0xf3bf8f60 + jmp ARM_barrier +ARM_instruction_it: + mov ecx,0xbf08 + jmp THUMB_condition +ARM_instruction_ite: + mov ecx,0xbf0c + jmp THUMB_condition +ARM_instruction_itee: + mov ecx,0xbf0e + jmp THUMB_condition +ARM_instruction_iteee: + mov ecx,0xbf0f + jmp THUMB_condition +ARM_instruction_iteet: + mov ecx,0xbf0d + jmp THUMB_condition +ARM_instruction_itet: + mov ecx,0xbf0a + jmp THUMB_condition +ARM_instruction_itete: + mov ecx,0xbf0b + jmp THUMB_condition +ARM_instruction_itett: + mov ecx,0xbf09 + jmp THUMB_condition +ARM_instruction_itt: + mov ecx,0xbf04 + jmp THUMB_condition +ARM_instruction_itte: + mov ecx,0xbf06 + jmp THUMB_condition +ARM_instruction_ittee: + mov ecx,0xbf07 + jmp THUMB_condition +ARM_instruction_ittet: + mov ecx,0xbf05 + jmp THUMB_condition +ARM_instruction_ittt: + mov ecx,0xbf02 + jmp THUMB_condition +ARM_instruction_ittte: + mov ecx,0xbf03 + jmp THUMB_condition +ARM_instruction_itttt: + mov ecx,0xbf01 + jmp THUMB_condition +ARM_instruction_ldc: + mov edx,0x0c100000 + jmp ARM_copro_crd_address5 +ARM_instruction_ldc2: + mov edx,0xfc100000 + jmp ARM_copro_crd_address5 +ARM_instruction_ldc2l: + mov edx,0xfc500000 + jmp ARM_copro_crd_address5 +ARM_instruction_ldcl: + mov edx,0x0c500000 + jmp ARM_copro_crd_address5 +ARM_instruction_ldm: +ARM_instruction_ldmia: +ARM_instruction_ldmfd: + mov edx,0x08900000 + mov ecx,0xe8900000 + jmp ARM_rn_address4 +ARM_instruction_ldmda: +ARM_instruction_ldmfa: + mov edx,0x08100000 + jmp ARM_rn_address4 +ARM_instruction_ldmdb: +ARM_instruction_ldmea: + mov edx,0x09100000 + mov ecx,0xe9100000 + jmp ARM_rn_address4 +ARM_instruction_ldmed: +ARM_instruction_ldmib: + mov edx,0x09900000 + jmp ARM_rn_address4 +ARM_instruction_ldr: + INST_ARM64 + dd 0x38400000 + dd ARM64_memory + mov [operand_size],4 + mov edx,0x04100000 + mov ecx,0xf8500000 + jmp ARM_rd_address2 +ARM_instruction_ldrb: + INST_ARM64 + dd 0x38400000 + dd ARM64_memory_byte_hword + mov [operand_size],1 + mov edx,0x04500000 + mov ecx,0xf8100000 + jmp ARM_rd_address2 +ARM_instruction_ldrbt: + mov [operand_size],1 + mov edx,0x04700000 + mov ecx,0xf8100e00 + jmp ARM_rd_address2_post +ARM_instruction_ldrd: + mov [operand_size],8 + mov edx,0x000000d0 + mov ecx,0xe8500000 + jmp ARM_rd_address3D +ARM_instruction_ldrex: + mov [operand_size],4 + mov edx,0x01900f9f + mov ecx,0xe8500f00 + jmp ARM_rd_q_rn_p +ARM_instruction_ldrexb: + mov [operand_size],1 + mov edx,0x01d00f9f + mov ecx,0xe8d00f4f + jmp ARM_rd_q_rn_p +ARM_instruction_ldrexd: + mov [operand_size],8 + mov edx,0x01b00f9f + mov ecx,0xe8d0007f + jmp ARM_rt_rt2_q_rn_p +ARM_instruction_ldrexh: + mov [operand_size],2 + mov edx,0x01f00f9f + mov ecx,0xe8d00f5f + jmp ARM_rd_q_rn_p +ARM_instruction_ldrh: + INST_ARM64 + dd 0x38400001 + dd ARM64_memory_byte_hword + mov [operand_size],2 + mov edx,0x001000b0 + mov ecx,0xf8300000 + jmp ARM_rd_address3 +ARM_instruction_ldrht: + mov [operand_size],2 + mov edx,0x003000b0 + mov ecx,0xf8300e00 + jmp ARM_rd_address3T +ARM_instruction_ldrsb: + INST_ARM64 + dd 0x38800000 + dd ARM64_memory_signed_byte_hword + mov [operand_size],1 + mov edx,0x001000d0 + mov ecx,0xf9100000 + jmp ARM_rd_address3 +ARM_instruction_ldrsbt: + mov [operand_size],1 + mov edx,0x003000d0 + mov ecx,0xf9100e00 + jmp ARM_rd_address3T +ARM_instruction_ldrsh: + INST_ARM64 + dd 0x38800001 + dd ARM64_memory_signed_byte_hword + mov [operand_size],2 + mov edx,0x001000f0 + mov ecx,0xf9300000 + jmp ARM_rd_address3 +ARM_instruction_ldrsht: + mov [operand_size],2 + mov edx,0x003000f0 + mov ecx,0xf9300e00 + jmp ARM_rd_address3T +ARM_instruction_ldrt: + mov [operand_size],4 + mov edx,0x04300000 + mov ecx,0xf8500e00 + jmp ARM_rd_address2_post +ARM_instruction_leavex: + mov ecx,0xf3bf8f0f + jmp THUMBEE_enterx +ARM_instruction_lsl: + INST_ARM64 + dd 0x1ac02000 + dd ARM64_arithmetic3 + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + ARM_SHIFT_OPCODE_LSL shl 5 + jmp ARM_rd_rn_shift +ARM_instruction_lsr: + INST_ARM64 + dd 0x1ac02400 + dd ARM64_arithmetic3 + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + ARM_SHIFT_OPCODE_LSR shl 5 + jmp ARM_rd_rn_shift +ARM_instruction_mcr: + mov edx,0x0e000010 + jmp ARM_copro_op1_rd_crn_crm_op2 +ARM_instruction_mcr2: + mov edx,0xfe000010 + jmp ARM_copro_op1_rd_crn_crm_op2 +ARM_instruction_mcrr: + mov edx,0x0c400000 + jmp ARM_copro_op1_rd_rn_crm +ARM_instruction_mcrr2: + mov edx,0xfc400000 + jmp ARM_copro_op1_rd_rn_crm +ARM_instruction_mla: + INST_ARM64V + dd 0x0e209400 ;vector + dd 0x2f000000 ;element + dd ARM64_arithmetic17 + mov edx,0x00200090 + mov ecx,0xfb000000 + jmp ARM_rd_rm_rs_rn +ARM_instruction_mls: + INST_ARM64V + dd 0x2e209400 ;vector + dd 0x2f004000 ;element + dd ARM64_arithmetic17 + mov edx,0x00600090 + mov ecx,0xfb000010 + jmp ARM_rd_rm_rs_rn +ARM_instruction_mov: + INST_ARM64 + dd 0x00000000 + dd ARM64_mov_aliases + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + mov ecx,0xe shl 28 + 0x2 shl 21 + 0xf shl 16 + jmp ARM_rd_shifter_exp +ARM_instruction_movt: + mov edx,0x03400000 + mov ecx,0xf2c00000 + jmp ARM_rd_imm16 +ARM_instruction_movw: + mov edx,0x03000000 + mov ecx,0xf2400000 + jmp ARM_rd_imm16 +ARM_instruction_mrc: + mov edx,0x0e100010 + jmp ARM_copro_op1_rd_crn_crm_op2 +ARM_instruction_mrc2: + mov edx,0xfe100010 + jmp ARM_copro_op1_rd_crn_crm_op2 +ARM_instruction_mrrc: + mov edx,0x0c500000 + jmp ARM_copro_op1_rd_rn_crm +ARM_instruction_mrrc2: + mov edx,0xfc500000 + jmp ARM_copro_op1_rd_rn_crm +ARM_instruction_mrs: + INST_ARM64 + dd 0xd5200000 + dd ARM64_sys_predefined_mrs + mov edx,0x010f0000 + mov ecx,0xf3ef8000 + jmp ARM_rd_psr +ARM_instruction_msr: + INST_ARM64 + dd 0xd5000000 + dd ARM64_sys_predefined_msr + mov edx,0x0120f000 + mov ecx,0xf3808000 + jmp ARM_psr_value +ARM_instruction_mul: + INST_ARM64 + dd 0x00000000 + dd ARM64_arithmetic6 + mov edx,0x00000090 + mov ecx,0xfb00f000 + jmp ARM_rd_rm_rs +ARM_instruction_mvn: + INST_ARM64 + dd 0x00000000 + dd ARM64_arithmetic7 + mov edx,ARM_INSTRUCTION_OPCODE_MVN shl 21 + mov ecx,0xe shl 28 + 0x3 shl 21 + 0xf shl 16 + jmp ARM_rd_shifter +ARM_instruction_neg: + INST_ARM64S + dd 0x4b0003e0 + dd ARM64_arithmetic8 + mov edx,ARM_INSTRUCTION_OPCODE_RSB shl 21 + mov ecx,0xe shl 28 + 0xe shl 21 + jmp ARM_rd_rm +ARM_instruction_nop: + INST_ARM64 + dd 0xd503201f + dd ARM64_debug3 + mov edx,0x0320f000 + jmp ARM_nop +ARM_instruction_orn: + INST_ARM64 + dd 0x20200000 + dd ARM64_arithmetic2 + mov ecx,0xe shl 28 + 0x3 shl 21 + jmp THUMB_rd_rn_shifter_ORN +ARM_instruction_orr: + INST_ARM64 + dd 0x20000000 + dd ARM64_arithmetic2 + mov edx,ARM_INSTRUCTION_OPCODE_ORR shl 21 + mov ecx,0xe shl 28 + 0x2 shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_pkhbt: + mov edx,0x06800010 + mov ecx,0xeac00000 + jmp ARM_rd_rn_rm_shift_imm +ARM_instruction_pkhtb: + mov edx,0x06800050 + mov ecx,0xeac00020 + jmp ARM_rd_rn_rm_shift_imm +ARM_instruction_pld: + mov [operand_size],1 + mov edx,0x04500000 + mov ecx,0xf810f000 + jmp ARM_address2 +ARM_instruction_pldw: + mov [operand_size],1 + mov edx,0x04100000 + mov ecx,0xf830f000 + jmp ARM_address2 +ARM_instruction_pli: + mov [operand_size],1 + mov edx,0x05500000 + mov ecx,0xf910f000 + jmp ARM_address2 +ARM_instruction_pop: + mov edx,0x08900000 + mov ecx,0xe8900000 + jmp ARM_address4 +ARM_instruction_push: + mov edx,0x09000000 + mov ecx,0xe9000000 + jmp ARM_address4 +ARM_instruction_qadd: + mov edx,0x01000050 + mov ecx,0xfa80f080 + jmp ARM_rd_rm_rn +ARM_instruction_qadd16: + mov edx,0x06200f10 + mov ecx,0xfa90f010 + jmp ARM_rd_rn_rm +ARM_instruction_qadd8: + mov edx,0x06200f90 + mov ecx,0xfa80f010 + jmp ARM_rd_rn_rm +ARM_instruction_qaddsubx: +ARM_instruction_qasx: + mov edx,0x06200f30 + mov ecx,0xfaa0f010 + jmp ARM_rd_rn_rm +ARM_instruction_qdadd: + mov edx,0x01400050 + mov ecx,0xfa80f090 + jmp ARM_rd_rm_rn +ARM_instruction_qdsub: + mov edx,0x01600050 + mov ecx,0xfa80f0b0 + jmp ARM_rd_rm_rn +ARM_instruction_qsub: + mov edx,0x01200050 + mov ecx,0xfa80f0a0 + jmp ARM_rd_rm_rn +ARM_instruction_qsub16: + mov edx,0x06200f70 + mov ecx,0xfad0f010 + jmp ARM_rd_rn_rm +ARM_instruction_qsub8: + mov edx,0x06200ff0 + mov ecx,0xfac0f010 + jmp ARM_rd_rn_rm +ARM_instruction_qsubaddx: +ARM_instruction_qsax: + mov edx,0x06200f50 + mov ecx,0xfae0f010 + jmp ARM_rd_rn_rm +ARM_instruction_rbit: + INST_ARM64 + dd 0x5ac00000 + dd ARM64_arithmetic10 + mov edx,0x06ff0f30 + mov ecx,0xfa90f0a0 + jmp ARM_rd_rm_REV +ARM_instruction_rev: + INST_ARM64 + dd 0x5ac00800 + dd ARM64_arithmetic11 + mov edx,0x06bf0f30 + mov ecx,0xfa90f080 + jmp ARM_rd_rm_REV +ARM_instruction_rev16: + INST_ARM64 + dd 0x5ac00400 + dd ARM64_arithmetic12 + mov edx,0x06bf0fb0 + mov ecx,0xfa90f090 + jmp ARM_rd_rm_REV +ARM_instruction_revsh: + mov edx,0x06ff0fb0 + mov ecx,0xfa90f0b0 + jmp ARM_rd_rm_REV +ARM_instruction_rfe: +ARM_instruction_rfeia: +ARM_instruction_rfefd: + mov edx,0xf8900a00 + mov ecx,0xe990c000 + jmp ARM_rn +ARM_instruction_rfeda: +ARM_instruction_rfefa: + mov edx,0xf8100a00 + jmp ARM_rn +ARM_instruction_rfedb: +ARM_instruction_rfeea: + mov edx,0xf9100a00 + mov ecx,0xe810c000 + jmp ARM_rn +ARM_instruction_rfeib: +ARM_instruction_rfeed: + mov edx,0xf9900a00 + jmp ARM_rn +ARM_instruction_ror: + INST_ARM64 + dd 0x1ac02c00 + dd ARM64_arithmetic3 + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + ARM_SHIFT_OPCODE_ROR shl 5 + jmp ARM_rd_rn_shift +ARM_instruction_rrx: + mov edx,ARM_INSTRUCTION_OPCODE_MOV shl 21 + ARM_SHIFT_OPCODE_ROR shl 5 + mov ecx,0xea4f0000 + jmp ARM_rd_shift +ARM_instruction_rsb: + mov edx,ARM_INSTRUCTION_OPCODE_RSB shl 21 + mov ecx,0xe shl 28 + 0xe shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_rsc: + mov edx,ARM_INSTRUCTION_OPCODE_RSC shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_sadd16: + mov edx,0x06100f10 + mov ecx,0xfa90f000 + jmp ARM_rd_rn_rm +ARM_instruction_sadd8: + mov edx,0x06100f90 + mov ecx,0xfa80f000 + jmp ARM_rd_rn_rm +ARM_instruction_saddsubx: +ARM_instruction_sasx: + mov edx,0x06100f30 + mov ecx,0xfaa0f000 + jmp ARM_rd_rn_rm +ARM_instruction_sbc: + INST_ARM64S + dd 0x5a000000 + dd ARM64_dz_nz_mz + mov edx,ARM_INSTRUCTION_OPCODE_SBC shl 21 + mov ecx,0xe shl 28 + 0xb shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_sbfx: + INST_ARM64 + dd 0x13000000 + dd ARM64_bfxil + mov edx,0x07a00050 + mov ecx,0xf3400000 + jmp ARM_rd_rn_imm_imm_X +ARM_instruction_sdiv: + INST_ARM64 + dd 0x1ac00c00 + dd ARM64_dz_nz_mz + mov edx,0x0710f010 + mov ecx,0xfb90f0f0 + jmp ARM_rd_rn_rm_DIV +ARM_instruction_sel: + mov edx,0x06800fb0 + mov ecx,0xfaa0f080 + jmp ARM_rd_rn_rm +ARM_instruction_setend: + mov edx,0xf1010000 + jmp ARM_endian +ARM_instruction_sev: + INST_ARM64 + dd 0xd503209f + dd ARM64_debug3 + mov edx,0x0320f004 + mov ecx,0xf3af8004 + jmp ARM_nops +ARM_instruction_shadd16: + mov edx,0x06300f10 + mov ecx,0xfa90f020 + jmp ARM_rd_rn_rm +ARM_instruction_shadd8: + mov edx,0x06300f90 + mov ecx,0xfa80f020 + jmp ARM_rd_rn_rm +ARM_instruction_shaddsubx: +ARM_instruction_shasx: + mov edx,0x06300f30 + mov ecx,0xfaa0f020 + jmp ARM_rd_rn_rm +ARM_instruction_shsub16: + mov edx,0x06300f70 + mov ecx,0xfad0f020 + jmp ARM_rd_rn_rm +ARM_instruction_shsub8: + mov edx,0x06300ff0 + mov ecx,0xfac0f020 + jmp ARM_rd_rn_rm +ARM_instruction_shsubaddx: +ARM_instruction_shsax: + mov edx,0x06300f50 + mov ecx,0xfae0f020 + jmp ARM_rd_rn_rm +ARM_instruction_smc: + INST_ARM64 + dd 0xd4000003 + dd ARM64_debug +ARM_instruction_smi: + mov edx,0x01600070 + mov ecx,0xf7f08000 + jmp ARM_immediate4 +ARM_instruction_smlabb: + mov edx,0x01000080 + mov ecx,0xfb100000 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlabt: + mov edx,0x010000c0 + mov ecx,0xfb100010 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlad: + mov edx,0x07000010 + mov ecx,0xfb200000 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smladx: + mov edx,0x07000030 + mov ecx,0xfb200010 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smlal: + INST_ARM64V + dd 0x0e208000 ;vector + dd 0x0f002000 ;element + dd ARM64_arithmetic18_long + mov edx,0x00e00090 + mov ecx,0xfbc00000 + jmp ARM_rdlo_rdhi_rm_rs +ARM_instruction_smlalbb: + mov edx,0x01400080 + mov ecx,0xfbc00080 + jmp ARM_rdlo_rdhi_rm_rs_E +ARM_instruction_smlalbt: + mov edx,0x014000c0 + mov ecx,0xfbc00090 + jmp ARM_rdlo_rdhi_rm_rs_E +ARM_instruction_smlald: + mov edx,0x07400010 + mov ecx,0xfbc000c0 + jmp ARM_rdlo_rdhi_rm_rs_D +ARM_instruction_smlaldx: + mov edx,0x07400030 + mov ecx,0xfbc000d0 + jmp ARM_rdlo_rdhi_rm_rs_D +ARM_instruction_smlaltb: + mov edx,0x014000a0 + mov ecx,0xfbc000a0 + jmp ARM_rdlo_rdhi_rm_rs_E +ARM_instruction_smlaltt: + mov edx,0x014000e0 + mov ecx,0xfbc000b0 + jmp ARM_rdlo_rdhi_rm_rs_E +ARM_instruction_smlatb: + mov edx,0x010000a0 + mov ecx,0xfb100020 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlatt: + mov edx,0x010000e0 + mov ecx,0xfb100030 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlawb: + mov edx,0x01200080 + mov ecx,0xfb300000 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlawt: + mov edx,0x012000c0 + mov ecx,0xfb300010 + jmp ARM_rd_rm_rs_rn_E +ARM_instruction_smlsd: + mov edx,0x07000050 + mov ecx,0xfb400000 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smlsdx: + mov edx,0x07000070 + mov ecx,0xfb400010 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smlsld: + mov edx,0x07400050 + mov ecx,0xfbd000c0 + jmp ARM_rdlo_rdhi_rm_rs_D +ARM_instruction_smlsldx: + mov edx,0x07400070 + mov ecx,0xfbd000d0 + jmp ARM_rdlo_rdhi_rm_rs_D +ARM_instruction_smmla: + mov edx,0x07500010 + mov ecx,0xfb500000 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smmlar: + mov edx,0x07500030 + mov ecx,0xfb500010 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smmls: + mov edx,0x075000d0 + mov ecx,0xfb600000 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smmlsr: + mov edx,0x075000f0 + mov ecx,0xfb600010 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_smmul: + mov edx,0x0750f010 + mov ecx,0xfb50f000 + jmp ARM_rd_rm_rs_M +ARM_instruction_smmulr: + mov edx,0x0750f030 + mov ecx,0xfb50f010 + jmp ARM_rd_rm_rs_M +ARM_instruction_smuad: + mov edx,0x0700f010 + mov ecx,0xfb20f000 + jmp ARM_rd_rm_rs_M +ARM_instruction_smuadx: + mov edx,0x0700f030 + mov ecx,0xfb20f010 + jmp ARM_rd_rm_rs_M +ARM_instruction_smulbb: + mov edx,0x01600080 + mov ecx,0xfb10f000 + jmp ARM_rd_rm_rs_E +ARM_instruction_smulbt: + mov edx,0x016000c0 + mov ecx,0xfb10f010 + jmp ARM_rd_rm_rs_E +ARM_instruction_smull: + INST_ARM64 + dd 0x9b207c00 + dd ARM64_arithmetic15 + mov edx,0x00c00090 + mov ecx,0xfb800000 + jmp ARM_rdlo_rdhi_rm_rs +ARM_instruction_smultb: + mov edx,0x016000a0 + mov ecx,0xfb10f020 + jmp ARM_rd_rm_rs_E +ARM_instruction_smultt: + mov edx,0x016000e0 + mov ecx,0xfb10f030 + jmp ARM_rd_rm_rs_E +ARM_instruction_smulwb: + mov edx,0x012000a0 + mov ecx,0xfb30f000 + jmp ARM_rd_rm_rs_E +ARM_instruction_smulwt: + mov edx,0x012000e0 + mov ecx,0xfb30f010 + jmp ARM_rd_rm_rs_E +ARM_instruction_smusd: + mov edx,0x0700f050 + mov ecx,0xfb40f000 + jmp ARM_rd_rm_rs_M +ARM_instruction_smusdx: + mov edx,0x0700f070 + mov ecx,0xfb40f010 + jmp ARM_rd_rm_rs_M +ARM_instruction_srs: +ARM_instruction_srsia: +ARM_instruction_srsea: + mov edx,0xf8cd0500 + mov ecx,0xe98dc000 + jmp ARM_reg_mode +ARM_instruction_srsda: +ARM_instruction_srsfa: + mov edx,0xf84d0500 + jmp ARM_reg_mode +ARM_instruction_srsdb: +ARM_instruction_srsfd: + mov edx,0xf94d0500 + mov ecx,0xe80dc000 + jmp ARM_reg_mode +ARM_instruction_srsib: +ARM_instruction_srsed: + mov edx,0xf9cd0500 + jmp ARM_reg_mode +ARM_instruction_ssat: + mov edx,0x06a00010 + mov ecx,0xf3000000 + jmp ARM_rd_imm_rm_shift +ARM_instruction_ssat16: + mov edx,0x06a00f30 + mov ecx,0xf3200000 + jmp ARM_rd_imm_rm +ARM_instruction_ssub16: + mov edx,0x06100f70 + mov ecx,0xfad0f000 + jmp ARM_rd_rn_rm +ARM_instruction_ssub8: + mov edx,0x06100ff0 + mov ecx,0xfac0f000 + jmp ARM_rd_rn_rm +ARM_instruction_ssubaddx: +ARM_instruction_ssax: + mov edx,0x06100f50 + mov ecx,0xfae0f000 + jmp ARM_rd_rn_rm +ARM_instruction_stc: + mov edx,0x0c000000 + jmp ARM_copro_crd_address5 +ARM_instruction_stc2: + mov edx,0xfc000000 + jmp ARM_copro_crd_address5 +ARM_instruction_stc2l: + mov edx,0xfc400000 + jmp ARM_copro_crd_address5 +ARM_instruction_stcl: + mov edx,0x0c400000 + jmp ARM_copro_crd_address5 +ARM_instruction_stm: +ARM_instruction_stmia: +ARM_instruction_stmea: + mov edx,0x08800000 + mov ecx,0xe8800000 + jmp ARM_rn_address4 +ARM_instruction_stmda: +ARM_instruction_stmed: + mov edx,0x08000000 + jmp ARM_rn_address4 +ARM_instruction_stmdb: +ARM_instruction_stmfd: + mov edx,0x09000000 + mov ecx,0xe9000000 + jmp ARM_rn_address4 +ARM_instruction_stmib: +ARM_instruction_stmfa: + mov edx,0x09800000 + jmp ARM_rn_address4 +ARM_instruction_str: + INST_ARM64 + dd 0x38000000 + dd ARM64_memory + mov [operand_size],4 + mov edx,0x04000000 + mov ecx,0xf8400000 + jmp ARM_rd_address2 +ARM_instruction_strb: + INST_ARM64 + dd 0x38000000 + dd ARM64_memory_byte_hword + mov [operand_size],1 + mov edx,0x04400000 + mov ecx,0xf8000000 + jmp ARM_rd_address2 +ARM_instruction_strbt: + mov [operand_size],1 + mov edx,0x04600000 + mov ecx,0xf8000e00 + jmp ARM_rd_address2_post +ARM_instruction_strd: + mov [operand_size],8 + mov edx,0x000000f0 + mov ecx,0xe8400000 + jmp ARM_rd_address3D +ARM_instruction_strex: + mov [operand_size],4 + mov edx,0x01800f90 + mov ecx,0xe8400000 + jmp ARM_rd_rm_q_rn_p_STREX +ARM_instruction_strexb: + mov [operand_size],1 + mov edx,0x01c00f90 + mov ecx,0xe8c00f40 + jmp ARM_rd_rm_q_rn_p_STREX +ARM_instruction_strexd: + mov [operand_size],8 + mov edx,0x01a00f90 + mov ecx,0xe8c00070 + jmp ARM_rd_rt_rt2_q_rn_p +ARM_instruction_strexh: + mov [operand_size],2 + mov edx,0x01e00f90 + mov ecx,0xe8c00f50 + jmp ARM_rd_rm_q_rn_p_STREX +ARM_instruction_strh: + INST_ARM64 + dd 0x38000001 + dd ARM64_memory_byte_hword + mov [operand_size],2 + mov edx,0x000000b0 + mov ecx,0xf8200000 + jmp ARM_rd_address3 +ARM_instruction_strht: + mov [operand_size],2 + mov edx,0x002000b0 + mov ecx,0xf8200e00 + jmp ARM_rd_address3T +ARM_instruction_strt: + mov [operand_size],4 + mov edx,0x04200000 + mov ecx,0xf8400e00 + jmp ARM_rd_address2_post +ARM_instruction_sub: + INST_ARM64S + dd 0x40000000 + dd ARM64_arithmetic1 + mov edx,ARM_INSTRUCTION_OPCODE_SUB shl 21 + mov ecx,0xe shl 28 + 0xd shl 21 + jmp ARM_rd_rn_shifter +ARM_instruction_subw: + mov edx,ARM_INSTRUCTION_OPCODE_SUB shl 21 + mov ecx,0xf2000000 + 5 shl 21 + jmp THUMB_rd_rn_imm12 +ARM_instruction_svc: + INST_ARM64 + dd 0xd4000001 + dd ARM64_debug +ARM_instruction_swi: + mov edx,0x0f000000 + jmp ARM_immediate24 +ARM_instruction_swp: + mov edx,0x01000090 + jmp ARM_rd_rm_q_rn_p +ARM_instruction_swpb: + mov edx,0x01400090 + jmp ARM_rd_rm_q_rn_p +ARM_instruction_sxtab: + mov edx,0x06a00070 + mov ecx,0xfa40f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_sxtab16: + mov edx,0x06800070 + mov ecx,0xfa20f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_sxtah: + mov edx,0x06b00070 + mov ecx,0xfa00f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_sxtb: + INST_ARM64 + dd 0x13001c00 + dd ARM64_dz_nw + mov edx,0x06af0070 + mov ecx,0xfa4ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_sxtb16: + mov edx,0x068f0070 + mov ecx,0xfa2ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_sxth: + INST_ARM64 + dd 0x13003c00 + dd ARM64_dz_nw + mov edx,0x06bf0070 + mov ecx,0xfa0ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_tbb: + mov ecx,0xe8d0f000 + jmp THUMB_q_rn_rm_p +ARM_instruction_tbh: + mov ecx,0xe8d0f010 + jmp THUMB_q_rn_rm_lsl_1_p +ARM_instruction_teq: + mov edx,ARM_INSTRUCTION_OPCODE_TEQ shl 21 + 1 shl 20 + mov ecx,0xe shl 28 + 0x4 shl 21 + 1 shl 20 + 0xf shl 8 + jmp ARM_rn_shifter +ARM_instruction_teqp: + mov edx,ARM_INSTRUCTION_OPCODE_TEQ shl 21 + 1 shl 20 + 0xf shl 12 + jmp ARM_rn_shifter_26bit +ARM_instruction_tst: + INST_ARM64 + dd 0x60000000 + dd ARM64_arithmetic16 + mov edx,ARM_INSTRUCTION_OPCODE_TST shl 21 + 1 shl 20 + mov ecx,0xe shl 28 + 0x0 shl 21 + 1 shl 20 + 0xf shl 8 + jmp ARM_rn_shifter +ARM_instruction_tstp: + mov edx,ARM_INSTRUCTION_OPCODE_TST shl 21 + 1 shl 20 + 0xf shl 12 + jmp ARM_rn_shifter_26bit +ARM_instruction_uadd16: + mov edx,0x06500f10 + mov ecx,0xfa90f040 + jmp ARM_rd_rn_rm +ARM_instruction_uadd8: + mov edx,0x06500f90 + mov ecx,0xfa80f040 + jmp ARM_rd_rn_rm +ARM_instruction_uaddsubx: +ARM_instruction_uasx: + mov edx,0x06500f30 + mov ecx,0xfaa0f040 + jmp ARM_rd_rn_rm +ARM_instruction_ubfx: + INST_ARM64 + dd 0x53000000 + dd ARM64_bfxil + mov edx,0x07e00050 + mov ecx,0xf3c00000 + jmp ARM_rd_rn_imm_imm_X +ARM_instruction_udiv: + INST_ARM64 + dd 0x1ac00800 + dd ARM64_dz_nz_mz + mov edx,0x0730f010 + mov ecx,0xfbb0f0f0 + jmp ARM_rd_rn_rm_DIV +ARM_instruction_uhadd16: + mov edx,0x06700f10 + mov ecx,0xfa90f060 + jmp ARM_rd_rn_rm +ARM_instruction_uhadd8: + mov edx,0x06700f90 + mov ecx,0xfa80f060 + jmp ARM_rd_rn_rm +ARM_instruction_uhaddsubx: +ARM_instruction_uhasx: + mov edx,0x06700f30 + mov ecx,0xfaa0f060 + jmp ARM_rd_rn_rm +ARM_instruction_uhsub16: + mov edx,0x06700f70 + mov ecx,0xfad0f060 + jmp ARM_rd_rn_rm +ARM_instruction_uhsub8: + mov edx,0x06700ff0 + mov ecx,0xfac0f060 + jmp ARM_rd_rn_rm +ARM_instruction_uhsubaddx: +ARM_instruction_uhsax: + mov edx,0x06700f50 + mov ecx,0xfae0f060 + jmp ARM_rd_rn_rm +ARM_instruction_umaal: + mov edx,0x00400090 + mov ecx,0xfbe00060 + jmp ARM_rdlo_rdhi_rm_rs +ARM_instruction_umlal: + INST_ARM64V + dd 0x2e208000 ;vector + dd 0x2f002000 ;element + dd ARM64_arithmetic18_long + mov edx,0x00a00090 + mov ecx,0xfbe00000 + jmp ARM_rdlo_rdhi_rm_rs +ARM_instruction_umull: + INST_ARM64 + dd 0x9ba07c00 + dd ARM64_arithmetic15 + mov edx,0x00800090 + mov ecx,0xfba00000 + jmp ARM_rdlo_rdhi_rm_rs +ARM_instruction_und: + mov edx,0x07f000f0 + mov ecx,0xf7f0a0f0 + jmp ARM_und +ARM_instruction_uqadd16: + mov edx,0x06600f10 + mov ecx,0xfa90f050 + jmp ARM_rd_rn_rm +ARM_instruction_uqadd8: + mov edx,0x06600f90 + mov ecx,0xfa80f050 + jmp ARM_rd_rn_rm +ARM_instruction_uqaddsubx: +ARM_instruction_uqasx: + mov edx,0x06600f30 + mov ecx,0xfaa0f050 + jmp ARM_rd_rn_rm +ARM_instruction_uqsub16: + mov edx,0x06600f70 + mov ecx,0xfad0f050 + jmp ARM_rd_rn_rm +ARM_instruction_uqsub8: + mov edx,0x06600ff0 + mov ecx,0xfac0f050 + jmp ARM_rd_rn_rm +ARM_instruction_uqsubaddx: +ARM_instruction_uqsax: + mov edx,0x06600f50 + mov ecx,0xfae0f050 + jmp ARM_rd_rn_rm +ARM_instruction_usad8: + mov edx,0x0780f010 + mov ecx,0xfb70f000 + jmp ARM_rd_rm_rs_SAD +ARM_instruction_usada8: + mov edx,0x07800010 + mov ecx,0xfb700000 + jmp ARM_rd_rm_rs_rn_D +ARM_instruction_usat: + mov edx,0x06e00010 + mov ecx,0xf3800000 + jmp ARM_rd_imm_rm_shift +ARM_instruction_usat16: + mov edx,0x06e00f30 + mov ecx,0xf3a00000 + jmp ARM_rd_imm_rm +ARM_instruction_usub16: + mov edx,0x06500f70 + mov ecx,0xfad0f040 + jmp ARM_rd_rn_rm +ARM_instruction_usub8: + mov edx,0x06500ff0 + mov ecx,0xfac0f040 + jmp ARM_rd_rn_rm +ARM_instruction_usubaddx: +ARM_instruction_usax: + mov edx,0x06500f50 + mov ecx,0xfae0f040 + jmp ARM_rd_rn_rm +ARM_instruction_uxtab: + mov edx,0x06e00070 + mov ecx,0xfa50f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_uxtab16: + mov edx,0x06c00070 + mov ecx,0xfa30f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_uxtah: + mov edx,0x06f00070 + mov ecx,0xfa10f080 + jmp ARM_rd_rn_rm_rotation +ARM_instruction_uxtb: + INST_ARM64 + dd 0x53001c00 + dd ARM64_dw_nw + mov edx,0x06ef0070 + mov ecx,0xfa5ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_uxtb16: + mov edx,0x06cf0070 + mov ecx,0xfa3ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_uxth: + INST_ARM64 + dd 0x53003c00 + dd ARM64_dw_nw + mov edx,0x06ff0070 + mov ecx,0xfa1ff080 + jmp ARM_rd_rm_rotation +ARM_instruction_wfe: + INST_ARM64 + dd 0xd503205f + dd ARM64_debug3 + mov edx,0x0320f002 + mov ecx,0xf3af8002 + jmp ARM_nops +ARM_instruction_wfi: + INST_ARM64 + dd 0xd503207f + dd ARM64_debug3 + mov edx,0x0320f003 + mov ecx,0xf3af8003 + jmp ARM_nops +ARM_instruction_yield: + INST_ARM64 + dd 0xd503203f + dd ARM64_debug3 + mov edx,0x0320f001 + mov ecx,0xf3af8001 + jmp ARM_nops + +;FPA jump table + +ARM_instruction_absd: + mov edx,0x0e208180 + jmp FPA_fd_fm +ARM_instruction_absdm: + mov edx,0x0e2081c0 + jmp FPA_fd_fm +ARM_instruction_absdp: + mov edx,0x0e2081a0 + jmp FPA_fd_fm +ARM_instruction_absdz: + mov edx,0x0e2081e0 + jmp FPA_fd_fm +ARM_instruction_abse: + mov edx,0x0e288100 + jmp FPA_fd_fm +ARM_instruction_absem: + mov edx,0x0e288140 + jmp FPA_fd_fm +ARM_instruction_absep: + mov edx,0x0e288120 + jmp FPA_fd_fm +ARM_instruction_absez: + mov edx,0x0e288160 + jmp FPA_fd_fm +ARM_instruction_abss: + mov edx,0x0e208100 + jmp FPA_fd_fm +ARM_instruction_abssm: + mov edx,0x0e208140 + jmp FPA_fd_fm +ARM_instruction_abssp: + mov edx,0x0e208120 + jmp FPA_fd_fm +ARM_instruction_abssz: + mov edx,0x0e208160 + jmp FPA_fd_fm +ARM_instruction_acsd: + mov edx,0x0ec08180 + jmp FPA_fd_fm +ARM_instruction_acsdm: + mov edx,0x0ec081c0 + jmp FPA_fd_fm +ARM_instruction_acsdp: + mov edx,0x0ec081a0 + jmp FPA_fd_fm +ARM_instruction_acsdz: + mov edx,0x0ec081e0 + jmp FPA_fd_fm +ARM_instruction_acse: + mov edx,0x0ec88100 + jmp FPA_fd_fm +ARM_instruction_acsem: + mov edx,0x0ec88140 + jmp FPA_fd_fm +ARM_instruction_acsep: + mov edx,0x0ec88120 + jmp FPA_fd_fm +ARM_instruction_acsez: + mov edx,0x0ec88160 + jmp FPA_fd_fm +ARM_instruction_acss: + mov edx,0x0ec08100 + jmp FPA_fd_fm +ARM_instruction_acssm: + mov edx,0x0ec08140 + jmp FPA_fd_fm +ARM_instruction_acssp: + mov edx,0x0ec08120 + jmp FPA_fd_fm +ARM_instruction_acssz: + mov edx,0x0ec08160 + jmp FPA_fd_fm +ARM_instruction_adfd: + mov edx,0x0e000180 + jmp FPA_fd_fn_fm +ARM_instruction_adfdm: + mov edx,0x0e0001c0 + jmp FPA_fd_fn_fm +ARM_instruction_adfdp: + mov edx,0x0e0001a0 + jmp FPA_fd_fn_fm +ARM_instruction_adfdz: + mov edx,0x0e0001e0 + jmp FPA_fd_fn_fm +ARM_instruction_adfe: + mov edx,0x0e080100 + jmp FPA_fd_fn_fm +ARM_instruction_adfem: + mov edx,0x0e080140 + jmp FPA_fd_fn_fm +ARM_instruction_adfep: + mov edx,0x0e080120 + jmp FPA_fd_fn_fm +ARM_instruction_adfez: + mov edx,0x0e080160 + jmp FPA_fd_fn_fm +ARM_instruction_adfs: + mov edx,0x0e000100 + jmp FPA_fd_fn_fm +ARM_instruction_adfsm: + mov edx,0x0e000140 + jmp FPA_fd_fn_fm +ARM_instruction_adfsp: + mov edx,0x0e000120 + jmp FPA_fd_fn_fm +ARM_instruction_adfsz: + mov edx,0x0e000160 + jmp FPA_fd_fn_fm +ARM_instruction_asnd: + mov edx,0x0eb08180 + jmp FPA_fd_fm +ARM_instruction_asndm: + mov edx,0x0eb081c0 + jmp FPA_fd_fm +ARM_instruction_asndp: + mov edx,0x0eb081a0 + jmp FPA_fd_fm +ARM_instruction_asndz: + mov edx,0x0eb081e0 + jmp FPA_fd_fm +ARM_instruction_asne: + mov edx,0x0eb88100 + jmp FPA_fd_fm +ARM_instruction_asnem: + mov edx,0x0eb88140 + jmp FPA_fd_fm +ARM_instruction_asnep: + mov edx,0x0eb88120 + jmp FPA_fd_fm +ARM_instruction_asnez: + mov edx,0x0eb88160 + jmp FPA_fd_fm +ARM_instruction_asns: + mov edx,0x0eb08100 + jmp FPA_fd_fm +ARM_instruction_asnsm: + mov edx,0x0eb08140 + jmp FPA_fd_fm +ARM_instruction_asnsp: + mov edx,0x0eb08120 + jmp FPA_fd_fm +ARM_instruction_asnsz: + mov edx,0x0eb08160 + jmp FPA_fd_fm +ARM_instruction_atnd: + mov edx,0x0ed08180 + jmp FPA_fd_fm +ARM_instruction_atndm: + mov edx,0x0ed081c0 + jmp FPA_fd_fm +ARM_instruction_atndp: + mov edx,0x0ed081a0 + jmp FPA_fd_fm +ARM_instruction_atndz: + mov edx,0x0ed081e0 + jmp FPA_fd_fm +ARM_instruction_atne: + mov edx,0x0ed88100 + jmp FPA_fd_fm +ARM_instruction_atnem: + mov edx,0x0ed88140 + jmp FPA_fd_fm +ARM_instruction_atnep: + mov edx,0x0ed88120 + jmp FPA_fd_fm +ARM_instruction_atnez: + mov edx,0x0ed88160 + jmp FPA_fd_fm +ARM_instruction_atns: + mov edx,0x0ed08100 + jmp FPA_fd_fm +ARM_instruction_atnsm: + mov edx,0x0ed08140 + jmp FPA_fd_fm +ARM_instruction_atnsp: + mov edx,0x0ed08120 + jmp FPA_fd_fm +ARM_instruction_atnsz: + mov edx,0x0ed08160 + jmp FPA_fd_fm +ARM_instruction_cmf: + mov edx,0x0e90f110 + jmp FPA_fn_fm +ARM_instruction_cmfe: + mov edx,0x0ed0f110 + jmp FPA_fn_fm +ARM_instruction_cnf: + mov edx,0x0eb0f110 + jmp FPA_fn_fm +ARM_instruction_cnfe: + mov edx,0x0ef0f110 + jmp FPA_fn_fm +ARM_instruction_cosd: + mov edx,0x0e908180 + jmp FPA_fd_fm +ARM_instruction_cosdm: + mov edx,0x0e9081c0 + jmp FPA_fd_fm +ARM_instruction_cosdp: + mov edx,0x0e9081a0 + jmp FPA_fd_fm +ARM_instruction_cosdz: + mov edx,0x0e9081e0 + jmp FPA_fd_fm +ARM_instruction_cose: + mov edx,0x0e988100 + jmp FPA_fd_fm +ARM_instruction_cosem: + mov edx,0x0e988140 + jmp FPA_fd_fm +ARM_instruction_cosep: + mov edx,0x0e988120 + jmp FPA_fd_fm +ARM_instruction_cosez: + mov edx,0x0e988160 + jmp FPA_fd_fm +ARM_instruction_coss: + mov edx,0x0e908100 + jmp FPA_fd_fm +ARM_instruction_cossm: + mov edx,0x0e908140 + jmp FPA_fd_fm +ARM_instruction_cossp: + mov edx,0x0e908120 + jmp FPA_fd_fm +ARM_instruction_cossz: + mov edx,0x0e908160 + jmp FPA_fd_fm +ARM_instruction_dvfd: + mov edx,0x0e400180 + jmp FPA_fd_fn_fm +ARM_instruction_dvfdm: + mov edx,0x0e4001c0 + jmp FPA_fd_fn_fm +ARM_instruction_dvfdp: + mov edx,0x0e4001a0 + jmp FPA_fd_fn_fm +ARM_instruction_dvfdz: + mov edx,0x0e4001e0 + jmp FPA_fd_fn_fm +ARM_instruction_dvfe: + mov edx,0x0e480100 + jmp FPA_fd_fn_fm +ARM_instruction_dvfem: + mov edx,0x0e480140 + jmp FPA_fd_fn_fm +ARM_instruction_dvfep: + mov edx,0x0e480120 + jmp FPA_fd_fn_fm +ARM_instruction_dvfez: + mov edx,0x0e480160 + jmp FPA_fd_fn_fm +ARM_instruction_dvfs: + mov edx,0x0e400100 + jmp FPA_fd_fn_fm +ARM_instruction_dvfsm: + mov edx,0x0e400140 + jmp FPA_fd_fn_fm +ARM_instruction_dvfsp: + mov edx,0x0e400120 + jmp FPA_fd_fn_fm +ARM_instruction_dvfsz: + mov edx,0x0e400160 + jmp FPA_fd_fn_fm +ARM_instruction_expd: + mov edx,0x0e708180 + jmp FPA_fd_fm +ARM_instruction_expdm: + mov edx,0x0e7081c0 + jmp FPA_fd_fm +ARM_instruction_expdp: + mov edx,0x0e7081a0 + jmp FPA_fd_fm +ARM_instruction_expdz: + mov edx,0x0e7081e0 + jmp FPA_fd_fm +ARM_instruction_expe: + mov edx,0x0e788100 + jmp FPA_fd_fm +ARM_instruction_expem: + mov edx,0x0e788140 + jmp FPA_fd_fm +ARM_instruction_expep: + mov edx,0x0e788120 + jmp FPA_fd_fm +ARM_instruction_expez: + mov edx,0x0e788160 + jmp FPA_fd_fm +ARM_instruction_exps: + mov edx,0x0e708100 + jmp FPA_fd_fm +ARM_instruction_expsm: + mov edx,0x0e708140 + jmp FPA_fd_fm +ARM_instruction_expsp: + mov edx,0x0e708120 + jmp FPA_fd_fm +ARM_instruction_expsz: + mov edx,0x0e708160 + jmp FPA_fd_fm +ARM_instruction_fdvd: + mov edx,0x0ea00180 + jmp FPA_fd_fn_fm +ARM_instruction_fdvdm: + mov edx,0x0ea001c0 + jmp FPA_fd_fn_fm +ARM_instruction_fdvdp: + mov edx,0x0ea001a0 + jmp FPA_fd_fn_fm +ARM_instruction_fdvdz: + mov edx,0x0ea001e0 + jmp FPA_fd_fn_fm +ARM_instruction_fdve: + mov edx,0x0ea80100 + jmp FPA_fd_fn_fm +ARM_instruction_fdvem: + mov edx,0x0ea80140 + jmp FPA_fd_fn_fm +ARM_instruction_fdvep: + mov edx,0x0ea80120 + jmp FPA_fd_fn_fm +ARM_instruction_fdvez: + mov edx,0x0ea80160 + jmp FPA_fd_fn_fm +ARM_instruction_fdvs: + mov edx,0x0ea00100 + jmp FPA_fd_fn_fm +ARM_instruction_fdvsm: + mov edx,0x0ea00140 + jmp FPA_fd_fn_fm +ARM_instruction_fdvsp: + mov edx,0x0ea00120 + jmp FPA_fd_fn_fm +ARM_instruction_fdvsz: + mov edx,0x0ea00160 + jmp FPA_fd_fn_fm +ARM_instruction_fix: + mov edx,0x0e100110 + jmp FPA_rd_fm +ARM_instruction_fixm: + mov edx,0x0e100150 + jmp FPA_rd_fm +ARM_instruction_fixp: + mov edx,0x0e100130 + jmp FPA_rd_fm +ARM_instruction_fixz: + mov edx,0x0e100170 + jmp FPA_rd_fm +ARM_instruction_fltd: + mov edx,0x0e000190 + jmp FPA_fn_rd +ARM_instruction_fltdm: + mov edx,0x0e0001d0 + jmp FPA_fn_rd +ARM_instruction_fltdp: + mov edx,0x0e0001b0 + jmp FPA_fn_rd +ARM_instruction_fltdz: + mov edx,0x0e0001f0 + jmp FPA_fn_rd +ARM_instruction_flte: + mov edx,0x0e080110 + jmp FPA_fn_rd +ARM_instruction_fltem: + mov edx,0x0e080150 + jmp FPA_fn_rd +ARM_instruction_fltep: + mov edx,0x0e080130 + jmp FPA_fn_rd +ARM_instruction_fltez: + mov edx,0x0e080170 + jmp FPA_fn_rd +ARM_instruction_flts: + mov edx,0x0e000110 + jmp FPA_fn_rd +ARM_instruction_fltsm: + mov edx,0x0e000150 + jmp FPA_fn_rd +ARM_instruction_fltsp: + mov edx,0x0e000130 + jmp FPA_fn_rd +ARM_instruction_fltsz: + mov edx,0x0e000170 + jmp FPA_fn_rd +ARM_instruction_fmld: + mov edx,0x0e900180 + jmp FPA_fd_fn_fm +ARM_instruction_fmldm: + mov edx,0x0e9001c0 + jmp FPA_fd_fn_fm +ARM_instruction_fmldp: + mov edx,0x0e9001a0 + jmp FPA_fd_fn_fm +ARM_instruction_fmldz: + mov edx,0x0e9001e0 + jmp FPA_fd_fn_fm +ARM_instruction_fmle: + mov edx,0x0e980100 + jmp FPA_fd_fn_fm +ARM_instruction_fmlem: + mov edx,0x0e980140 + jmp FPA_fd_fn_fm +ARM_instruction_fmlep: + mov edx,0x0e980120 + jmp FPA_fd_fn_fm +ARM_instruction_fmlez: + mov edx,0x0e980160 + jmp FPA_fd_fn_fm +ARM_instruction_fmls: + INST_ARM64V + dd 0x5f805000 ;scalar + dd 0x0f805000 ;vector + dd ARM64_vector_scalar_sd_two_reg_element_sub + mov edx,0x0e900100 + jmp FPA_fd_fn_fm +ARM_instruction_fmlsm: + mov edx,0x0e900140 + jmp FPA_fd_fn_fm +ARM_instruction_fmlsp: + mov edx,0x0e900120 + jmp FPA_fd_fn_fm +ARM_instruction_fmlsz: + mov edx,0x0e900160 + jmp FPA_fd_fn_fm +ARM_instruction_frdd: + mov edx,0x0eb00180 + jmp FPA_fd_fn_fm +ARM_instruction_frddm: + mov edx,0x0eb001c0 + jmp FPA_fd_fn_fm +ARM_instruction_frddp: + mov edx,0x0eb001a0 + jmp FPA_fd_fn_fm +ARM_instruction_frddz: + mov edx,0x0eb001e0 + jmp FPA_fd_fn_fm +ARM_instruction_frde: + mov edx,0x0eb80100 + jmp FPA_fd_fn_fm +ARM_instruction_frdem: + mov edx,0x0eb80140 + jmp FPA_fd_fn_fm +ARM_instruction_frdep: + mov edx,0x0eb80120 + jmp FPA_fd_fn_fm +ARM_instruction_frdez: + mov edx,0x0eb80160 + jmp FPA_fd_fn_fm +ARM_instruction_frds: + mov edx,0x0eb00100 + jmp FPA_fd_fn_fm +ARM_instruction_frdsm: + mov edx,0x0eb00140 + jmp FPA_fd_fn_fm +ARM_instruction_frdsp: + mov edx,0x0eb00120 + jmp FPA_fd_fn_fm +ARM_instruction_frdsz: + mov edx,0x0eb00160 + jmp FPA_fd_fn_fm +ARM_instruction_ldfd: + mov edx,0x0c108100 + jmp FPA_fd_address5 +ARM_instruction_ldfe: + mov edx,0x0c500100 + jmp FPA_fd_address5 +ARM_instruction_ldfp: + mov edx,0x0c508100 + jmp FPA_fd_address5 +ARM_instruction_ldfs: + mov edx,0x0c100100 + jmp FPA_fd_address5 +ARM_instruction_lfm: + mov edx,0x0c100200 + jmp FPA_fd_imm_address5 +ARM_instruction_lfmea: + mov edx,0x0d100200 + jmp FPA_fd_imm_rn +ARM_instruction_lfmfd: + mov edx,0x0c900200 + jmp FPA_fd_imm_rn +ARM_instruction_lgnd: + mov edx,0x0e608180 + jmp FPA_fd_fm +ARM_instruction_lgndm: + mov edx,0x0e6081c0 + jmp FPA_fd_fm +ARM_instruction_lgndp: + mov edx,0x0e6081a0 + jmp FPA_fd_fm +ARM_instruction_lgndz: + mov edx,0x0e6081e0 + jmp FPA_fd_fm +ARM_instruction_lgne: + mov edx,0x0e688100 + jmp FPA_fd_fm +ARM_instruction_lgnem: + mov edx,0x0e688140 + jmp FPA_fd_fm +ARM_instruction_lgnep: + mov edx,0x0e688120 + jmp FPA_fd_fm +ARM_instruction_lgnez: + mov edx,0x0e688160 + jmp FPA_fd_fm +ARM_instruction_lgns: + mov edx,0x0e608100 + jmp FPA_fd_fm +ARM_instruction_lgnsm: + mov edx,0x0e608140 + jmp FPA_fd_fm +ARM_instruction_lgnsp: + mov edx,0x0e608120 + jmp FPA_fd_fm +ARM_instruction_lgnsz: + mov edx,0x0e608160 + jmp FPA_fd_fm +ARM_instruction_logd: + mov edx,0x0e508180 + jmp FPA_fd_fm +ARM_instruction_logdm: + mov edx,0x0e5081c0 + jmp FPA_fd_fm +ARM_instruction_logdp: + mov edx,0x0e5081a0 + jmp FPA_fd_fm +ARM_instruction_logdz: + mov edx,0x0e5081e0 + jmp FPA_fd_fm +ARM_instruction_loge: + mov edx,0x0e588100 + jmp FPA_fd_fm +ARM_instruction_logem: + mov edx,0x0e588140 + jmp FPA_fd_fm +ARM_instruction_logep: + mov edx,0x0e588120 + jmp FPA_fd_fm +ARM_instruction_logez: + mov edx,0x0e588160 + jmp FPA_fd_fm +ARM_instruction_logs: + mov edx,0x0e508100 + jmp FPA_fd_fm +ARM_instruction_logsm: + mov edx,0x0e508140 + jmp FPA_fd_fm +ARM_instruction_logsp: + mov edx,0x0e508120 + jmp FPA_fd_fm +ARM_instruction_logsz: + mov edx,0x0e508160 + jmp FPA_fd_fm +ARM_instruction_mnfd: + mov edx,0x0e108180 + jmp FPA_fd_fm +ARM_instruction_mnfdm: + mov edx,0x0e1081c0 + jmp FPA_fd_fm +ARM_instruction_mnfdp: + mov edx,0x0e1081a0 + jmp FPA_fd_fm +ARM_instruction_mnfdz: + mov edx,0x0e1081e0 + jmp FPA_fd_fm +ARM_instruction_mnfe: + mov edx,0x0e188100 + jmp FPA_fd_fm +ARM_instruction_mnfem: + mov edx,0x0e188140 + jmp FPA_fd_fm +ARM_instruction_mnfep: + mov edx,0x0e188120 + jmp FPA_fd_fm +ARM_instruction_mnfez: + mov edx,0x0e188160 + jmp FPA_fd_fm +ARM_instruction_mnfs: + mov edx,0x0e108100 + jmp FPA_fd_fm +ARM_instruction_mnfsm: + mov edx,0x0e108140 + jmp FPA_fd_fm +ARM_instruction_mnfsp: + mov edx,0x0e108120 + jmp FPA_fd_fm +ARM_instruction_mnfsz: + mov edx,0x0e108160 + jmp FPA_fd_fm +ARM_instruction_mufd: + mov edx,0x0e100180 + jmp FPA_fd_fn_fm +ARM_instruction_mufdm: + mov edx,0x0e1001c0 + jmp FPA_fd_fn_fm +ARM_instruction_mufdp: + mov edx,0x0e1001a0 + jmp FPA_fd_fn_fm +ARM_instruction_mufdz: + mov edx,0x0e1001e0 + jmp FPA_fd_fn_fm +ARM_instruction_mufe: + mov edx,0x0e180100 + jmp FPA_fd_fn_fm +ARM_instruction_mufem: + mov edx,0x0e180140 + jmp FPA_fd_fn_fm +ARM_instruction_mufep: + mov edx,0x0e180120 + jmp FPA_fd_fn_fm +ARM_instruction_mufez: + mov edx,0x0e180160 + jmp FPA_fd_fn_fm +ARM_instruction_mufs: + mov edx,0x0e100100 + jmp FPA_fd_fn_fm +ARM_instruction_mufsm: + mov edx,0x0e100140 + jmp FPA_fd_fn_fm +ARM_instruction_mufsp: + mov edx,0x0e100120 + jmp FPA_fd_fn_fm +ARM_instruction_mufsz: + mov edx,0x0e100160 + jmp FPA_fd_fn_fm +ARM_instruction_mvfd: + mov edx,0x0e008180 + jmp FPA_fd_fm +ARM_instruction_mvfdm: + mov edx,0x0e0081c0 + jmp FPA_fd_fm +ARM_instruction_mvfdp: + mov edx,0x0e0081a0 + jmp FPA_fd_fm +ARM_instruction_mvfdz: + mov edx,0x0e0081e0 + jmp FPA_fd_fm +ARM_instruction_mvfe: + mov edx,0x0e088100 + jmp FPA_fd_fm +ARM_instruction_mvfem: + mov edx,0x0e088140 + jmp FPA_fd_fm +ARM_instruction_mvfep: + mov edx,0x0e088120 + jmp FPA_fd_fm +ARM_instruction_mvfez: + mov edx,0x0e088160 + jmp FPA_fd_fm +ARM_instruction_mvfs: + mov edx,0x0e008100 + jmp FPA_fd_fm +ARM_instruction_mvfsm: + mov edx,0x0e008140 + jmp FPA_fd_fm +ARM_instruction_mvfsp: + mov edx,0x0e008120 + jmp FPA_fd_fm +ARM_instruction_mvfsz: + mov edx,0x0e008160 + jmp FPA_fd_fm +ARM_instruction_nrmd: + mov edx,0x0ef08180 + jmp FPA_fd_fm +ARM_instruction_nrmdm: + mov edx,0x0ef081c0 + jmp FPA_fd_fm +ARM_instruction_nrmdp: + mov edx,0x0ef081a0 + jmp FPA_fd_fm +ARM_instruction_nrmdz: + mov edx,0x0ef081e0 + jmp FPA_fd_fm +ARM_instruction_nrme: + mov edx,0x0ef88100 + jmp FPA_fd_fm +ARM_instruction_nrmem: + mov edx,0x0ef88140 + jmp FPA_fd_fm +ARM_instruction_nrmep: + mov edx,0x0ef88120 + jmp FPA_fd_fm +ARM_instruction_nrmez: + mov edx,0x0ef88160 + jmp FPA_fd_fm +ARM_instruction_nrms: + mov edx,0x0ef08100 + jmp FPA_fd_fm +ARM_instruction_nrmsm: + mov edx,0x0ef08140 + jmp FPA_fd_fm +ARM_instruction_nrmsp: + mov edx,0x0ef08120 + jmp FPA_fd_fm +ARM_instruction_nrmsz: + mov edx,0x0ef08160 + jmp FPA_fd_fm +ARM_instruction_pold: + mov edx,0x0ec00180 + jmp FPA_fd_fn_fm +ARM_instruction_poldm: + mov edx,0x0ec001c0 + jmp FPA_fd_fn_fm +ARM_instruction_poldp: + mov edx,0x0ec001a0 + jmp FPA_fd_fn_fm +ARM_instruction_poldz: + mov edx,0x0ec001e0 + jmp FPA_fd_fn_fm +ARM_instruction_pole: + mov edx,0x0ec80100 + jmp FPA_fd_fn_fm +ARM_instruction_polem: + mov edx,0x0ec80140 + jmp FPA_fd_fn_fm +ARM_instruction_polep: + mov edx,0x0ec80120 + jmp FPA_fd_fn_fm +ARM_instruction_polez: + mov edx,0x0ec80160 + jmp FPA_fd_fn_fm +ARM_instruction_pols: + mov edx,0x0ec00100 + jmp FPA_fd_fn_fm +ARM_instruction_polsm: + mov edx,0x0ec00140 + jmp FPA_fd_fn_fm +ARM_instruction_polsp: + mov edx,0x0ec00120 + jmp FPA_fd_fn_fm +ARM_instruction_polsz: + mov edx,0x0ec00160 + jmp FPA_fd_fn_fm +ARM_instruction_powd: + mov edx,0x0e600180 + jmp FPA_fd_fn_fm +ARM_instruction_powdm: + mov edx,0x0e6001c0 + jmp FPA_fd_fn_fm +ARM_instruction_powdp: + mov edx,0x0e6001a0 + jmp FPA_fd_fn_fm +ARM_instruction_powdz: + mov edx,0x0e6001e0 + jmp FPA_fd_fn_fm +ARM_instruction_powe: + mov edx,0x0e680100 + jmp FPA_fd_fn_fm +ARM_instruction_powem: + mov edx,0x0e680140 + jmp FPA_fd_fn_fm +ARM_instruction_powep: + mov edx,0x0e680120 + jmp FPA_fd_fn_fm +ARM_instruction_powez: + mov edx,0x0e680160 + jmp FPA_fd_fn_fm +ARM_instruction_pows: + mov edx,0x0e600100 + jmp FPA_fd_fn_fm +ARM_instruction_powsm: + mov edx,0x0e600140 + jmp FPA_fd_fn_fm +ARM_instruction_powsp: + mov edx,0x0e600120 + jmp FPA_fd_fn_fm +ARM_instruction_powsz: + mov edx,0x0e600160 + jmp FPA_fd_fn_fm +ARM_instruction_rdfd: + mov edx,0x0e500180 + jmp FPA_fd_fn_fm +ARM_instruction_rdfdm: + mov edx,0x0e5001c0 + jmp FPA_fd_fn_fm +ARM_instruction_rdfdp: + mov edx,0x0e5001a0 + jmp FPA_fd_fn_fm +ARM_instruction_rdfdz: + mov edx,0x0e5001e0 + jmp FPA_fd_fn_fm +ARM_instruction_rdfe: + mov edx,0x0e580100 + jmp FPA_fd_fn_fm +ARM_instruction_rdfem: + mov edx,0x0e580140 + jmp FPA_fd_fn_fm +ARM_instruction_rdfep: + mov edx,0x0e580120 + jmp FPA_fd_fn_fm +ARM_instruction_rdfez: + mov edx,0x0e580160 + jmp FPA_fd_fn_fm +ARM_instruction_rdfs: + mov edx,0x0e500100 + jmp FPA_fd_fn_fm +ARM_instruction_rdfsm: + mov edx,0x0e500140 + jmp FPA_fd_fn_fm +ARM_instruction_rdfsp: + mov edx,0x0e500120 + jmp FPA_fd_fn_fm +ARM_instruction_rdfsz: + mov edx,0x0e500160 + jmp FPA_fd_fn_fm +ARM_instruction_rfc: + mov edx,0x0e500110 + jmp FPA_rd +ARM_instruction_rfs: + mov edx,0x0e300110 + jmp FPA_rd +ARM_instruction_rmfd: + mov edx,0x0e800180 + jmp FPA_fd_fn_fm +ARM_instruction_rmfdm: + mov edx,0x0e8001c0 + jmp FPA_fd_fn_fm +ARM_instruction_rmfdp: + mov edx,0x0e8001a0 + jmp FPA_fd_fn_fm +ARM_instruction_rmfdz: + mov edx,0x0e8001e0 + jmp FPA_fd_fn_fm +ARM_instruction_rmfe: + mov edx,0x0e880100 + jmp FPA_fd_fn_fm +ARM_instruction_rmfem: + mov edx,0x0e880140 + jmp FPA_fd_fn_fm +ARM_instruction_rmfep: + mov edx,0x0e880120 + jmp FPA_fd_fn_fm +ARM_instruction_rmfez: + mov edx,0x0e880160 + jmp FPA_fd_fn_fm +ARM_instruction_rmfs: + mov edx,0x0e800100 + jmp FPA_fd_fn_fm +ARM_instruction_rmfsm: + mov edx,0x0e800140 + jmp FPA_fd_fn_fm +ARM_instruction_rmfsp: + mov edx,0x0e800120 + jmp FPA_fd_fn_fm +ARM_instruction_rmfsz: + mov edx,0x0e800160 + jmp FPA_fd_fn_fm +ARM_instruction_rndd: + mov edx,0x0e308180 + jmp FPA_fd_fm +ARM_instruction_rnddm: + mov edx,0x0e3081c0 + jmp FPA_fd_fm +ARM_instruction_rnddp: + mov edx,0x0e3081a0 + jmp FPA_fd_fm +ARM_instruction_rnddz: + mov edx,0x0e3081e0 + jmp FPA_fd_fm +ARM_instruction_rnde: + mov edx,0x0e388100 + jmp FPA_fd_fm +ARM_instruction_rndem: + mov edx,0x0e388140 + jmp FPA_fd_fm +ARM_instruction_rndep: + mov edx,0x0e388120 + jmp FPA_fd_fm +ARM_instruction_rndez: + mov edx,0x0e388160 + jmp FPA_fd_fm +ARM_instruction_rnds: + mov edx,0x0e308100 + jmp FPA_fd_fm +ARM_instruction_rndsm: + mov edx,0x0e308140 + jmp FPA_fd_fm +ARM_instruction_rndsp: + mov edx,0x0e308120 + jmp FPA_fd_fm +ARM_instruction_rndsz: + mov edx,0x0e308160 + jmp FPA_fd_fm +ARM_instruction_rpwd: + mov edx,0x0e700180 + jmp FPA_fd_fn_fm +ARM_instruction_rpwdm: + mov edx,0x0e7001c0 + jmp FPA_fd_fn_fm +ARM_instruction_rpwdp: + mov edx,0x0e7001a0 + jmp FPA_fd_fn_fm +ARM_instruction_rpwdz: + mov edx,0x0e7001e0 + jmp FPA_fd_fn_fm +ARM_instruction_rpwe: + mov edx,0x0e780100 + jmp FPA_fd_fn_fm +ARM_instruction_rpwem: + mov edx,0x0e780140 + jmp FPA_fd_fn_fm +ARM_instruction_rpwep: + mov edx,0x0e780120 + jmp FPA_fd_fn_fm +ARM_instruction_rpwez: + mov edx,0x0e780160 + jmp FPA_fd_fn_fm +ARM_instruction_rpws: + mov edx,0x0e700100 + jmp FPA_fd_fn_fm +ARM_instruction_rpwsm: + mov edx,0x0e700140 + jmp FPA_fd_fn_fm +ARM_instruction_rpwsp: + mov edx,0x0e700120 + jmp FPA_fd_fn_fm +ARM_instruction_rpwsz: + mov edx,0x0e700160 + jmp FPA_fd_fn_fm +ARM_instruction_rsfd: + mov edx,0x0e300180 + jmp FPA_fd_fn_fm +ARM_instruction_rsfdm: + mov edx,0x0e3001c0 + jmp FPA_fd_fn_fm +ARM_instruction_rsfdp: + mov edx,0x0e3001a0 + jmp FPA_fd_fn_fm +ARM_instruction_rsfdz: + mov edx,0x0e3001e0 + jmp FPA_fd_fn_fm +ARM_instruction_rsfe: + mov edx,0x0e380100 + jmp FPA_fd_fn_fm +ARM_instruction_rsfem: + mov edx,0x0e380140 + jmp FPA_fd_fn_fm +ARM_instruction_rsfep: + mov edx,0x0e380120 + jmp FPA_fd_fn_fm +ARM_instruction_rsfez: + mov edx,0x0e380160 + jmp FPA_fd_fn_fm +ARM_instruction_rsfs: + mov edx,0x0e300100 + jmp FPA_fd_fn_fm +ARM_instruction_rsfsm: + mov edx,0x0e300140 + jmp FPA_fd_fn_fm +ARM_instruction_rsfsp: + mov edx,0x0e300120 + jmp FPA_fd_fn_fm +ARM_instruction_rsfsz: + mov edx,0x0e300160 + jmp FPA_fd_fn_fm +ARM_instruction_sfm: + mov edx,0x0c000200 + jmp FPA_fd_imm_address5 +ARM_instruction_sfmea: + mov edx,0x0c800200 + jmp FPA_fd_imm_rn +ARM_instruction_sfmfd: + mov edx,0x0d000200 + jmp FPA_fd_imm_rn +ARM_instruction_sind: + mov edx,0x0e808180 + jmp FPA_fd_fm +ARM_instruction_sindm: + mov edx,0x0e8081c0 + jmp FPA_fd_fm +ARM_instruction_sindp: + mov edx,0x0e8081a0 + jmp FPA_fd_fm +ARM_instruction_sindz: + mov edx,0x0e8081e0 + jmp FPA_fd_fm +ARM_instruction_sine: + mov edx,0x0e888100 + jmp FPA_fd_fm +ARM_instruction_sinem: + mov edx,0x0e888140 + jmp FPA_fd_fm +ARM_instruction_sinep: + mov edx,0x0e888120 + jmp FPA_fd_fm +ARM_instruction_sinez: + mov edx,0x0e888160 + jmp FPA_fd_fm +ARM_instruction_sins: + mov edx,0x0e808100 + jmp FPA_fd_fm +ARM_instruction_sinsm: + mov edx,0x0e808140 + jmp FPA_fd_fm +ARM_instruction_sinsp: + mov edx,0x0e808120 + jmp FPA_fd_fm +ARM_instruction_sinsz: + mov edx,0x0e808160 + jmp FPA_fd_fm +ARM_instruction_sqtd: + mov edx,0x0e408180 + jmp FPA_fd_fm +ARM_instruction_sqtdm: + mov edx,0x0e4081c0 + jmp FPA_fd_fm +ARM_instruction_sqtdp: + mov edx,0x0e4081a0 + jmp FPA_fd_fm +ARM_instruction_sqtdz: + mov edx,0x0e4081e0 + jmp FPA_fd_fm +ARM_instruction_sqte: + mov edx,0x0e488100 + jmp FPA_fd_fm +ARM_instruction_sqtem: + mov edx,0x0e488140 + jmp FPA_fd_fm +ARM_instruction_sqtep: + mov edx,0x0e488120 + jmp FPA_fd_fm +ARM_instruction_sqtez: + mov edx,0x0e488160 + jmp FPA_fd_fm +ARM_instruction_sqts: + mov edx,0x0e408100 + jmp FPA_fd_fm +ARM_instruction_sqtsm: + mov edx,0x0e408140 + jmp FPA_fd_fm +ARM_instruction_sqtsp: + mov edx,0x0e408120 + jmp FPA_fd_fm +ARM_instruction_sqtsz: + mov edx,0x0e408160 + jmp FPA_fd_fm +ARM_instruction_stfd: + mov edx,0x0c008100 + jmp FPA_fd_address5 +ARM_instruction_stfe: + mov edx,0x0c400100 + jmp FPA_fd_address5 +ARM_instruction_stfp: + mov edx,0x0c408100 + jmp FPA_fd_address5 +ARM_instruction_stfs: + mov edx,0x0c000100 + jmp FPA_fd_address5 +ARM_instruction_sufd: + mov edx,0x0e200180 + jmp FPA_fd_fn_fm +ARM_instruction_sufdm: + mov edx,0x0e2001c0 + jmp FPA_fd_fn_fm +ARM_instruction_sufdp: + mov edx,0x0e2001a0 + jmp FPA_fd_fn_fm +ARM_instruction_sufdz: + mov edx,0x0e2001e0 + jmp FPA_fd_fn_fm +ARM_instruction_sufe: + mov edx,0x0e280100 + jmp FPA_fd_fn_fm +ARM_instruction_sufem: + mov edx,0x0e280140 + jmp FPA_fd_fn_fm +ARM_instruction_sufep: + mov edx,0x0e280120 + jmp FPA_fd_fn_fm +ARM_instruction_sufez: + mov edx,0x0e280160 + jmp FPA_fd_fn_fm +ARM_instruction_sufs: + mov edx,0x0e200100 + jmp FPA_fd_fn_fm +ARM_instruction_sufsm: + mov edx,0x0e200140 + jmp FPA_fd_fn_fm +ARM_instruction_sufsp: + mov edx,0x0e200120 + jmp FPA_fd_fn_fm +ARM_instruction_sufsz: + mov edx,0x0e200160 + jmp FPA_fd_fn_fm +ARM_instruction_tand: + mov edx,0x0ea08180 + jmp FPA_fd_fm +ARM_instruction_tandm: + mov edx,0x0ea081c0 + jmp FPA_fd_fm +ARM_instruction_tandp: + mov edx,0x0ea081a0 + jmp FPA_fd_fm +ARM_instruction_tandz: + mov edx,0x0ea081e0 + jmp FPA_fd_fm +ARM_instruction_tane: + mov edx,0x0ea88100 + jmp FPA_fd_fm +ARM_instruction_tanem: + mov edx,0x0ea88140 + jmp FPA_fd_fm +ARM_instruction_tanep: + mov edx,0x0ea88120 + jmp FPA_fd_fm +ARM_instruction_tanez: + mov edx,0x0ea88160 + jmp FPA_fd_fm +ARM_instruction_tans: + mov edx,0x0ea08100 + jmp FPA_fd_fm +ARM_instruction_tansm: + mov edx,0x0ea08140 + jmp FPA_fd_fm +ARM_instruction_tansp: + mov edx,0x0ea08120 + jmp FPA_fd_fm +ARM_instruction_tansz: + mov edx,0x0ea08160 + jmp FPA_fd_fm +ARM_instruction_urdd: + mov edx,0x0ee08180 + jmp FPA_fd_fm +ARM_instruction_urddm: + mov edx,0x0ee081c0 + jmp FPA_fd_fm +ARM_instruction_urddp: + mov edx,0x0ee081a0 + jmp FPA_fd_fm +ARM_instruction_urddz: + mov edx,0x0ee081e0 + jmp FPA_fd_fm +ARM_instruction_urde: + mov edx,0x0ee88100 + jmp FPA_fd_fm +ARM_instruction_urdem: + mov edx,0x0ee88140 + jmp FPA_fd_fm +ARM_instruction_urdep: + mov edx,0x0ee88120 + jmp FPA_fd_fm +ARM_instruction_urdez: + mov edx,0x0ee88160 + jmp FPA_fd_fm +ARM_instruction_urds: + mov edx,0x0ee08100 + jmp FPA_fd_fm +ARM_instruction_urdsm: + mov edx,0x0ee08140 + jmp FPA_fd_fm +ARM_instruction_urdsp: + mov edx,0x0ee08120 + jmp FPA_fd_fm +ARM_instruction_urdsz: + mov edx,0x0ee08160 + jmp FPA_fd_fm +ARM_instruction_wfc: + mov edx,0x0e400110 + jmp FPA_rd +ARM_instruction_wfs: + mov edx,0x0e200110 + jmp FPA_rd + +;Maverick jump table + +ARM_instruction_cfabs32: + mov edx,0x0e300500 + jmp MAVERICK_crd_crn +ARM_instruction_cfabs64: + mov edx,0x0e300520 + jmp MAVERICK_crd_crn +ARM_instruction_cfabsd: + mov edx,0x0e300420 + jmp MAVERICK_crd_crn +ARM_instruction_cfabss: + mov edx,0x0e300400 + jmp MAVERICK_crd_crn +ARM_instruction_cfadd32: + mov edx,0x0e300580 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfadd64: + mov edx,0x0e3005a0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfaddd: + mov edx,0x0e3004a0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfadds: + mov edx,0x0e300480 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfcmp32: + mov edx,0x0e100590 + jmp MAVERICK_rd_crn_crm +ARM_instruction_cfcmp64: + mov edx,0x0e1005b0 + jmp MAVERICK_rd_crn_crm +ARM_instruction_cfcmpd: + mov edx,0x0e1004b0 + jmp MAVERICK_rd_crn_crm +ARM_instruction_cfcmps: + mov edx,0x0e100490 + jmp MAVERICK_rd_crn_crm +ARM_instruction_cfcpyd: + mov edx,0x0e000420 + jmp MAVERICK_crd_crn +ARM_instruction_cfcpys: + mov edx,0x0e000400 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvt32d: + mov edx,0x0e0004a0 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvt32s: + mov edx,0x0e000480 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvt64d: + mov edx,0x0e0004e0 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvt64s: + mov edx,0x0e0004c0 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvtd32: + mov edx,0x0e1005a0 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvtds: + mov edx,0x0e000440 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvts32: + mov edx,0x0e100580 + jmp MAVERICK_crd_crn +ARM_instruction_cfcvtsd: + mov edx,0x0e000460 + jmp MAVERICK_crd_crn +ARM_instruction_cfldr32: + mov edx,0x0c100500 + jmp MAVERICK_crd_address5 +ARM_instruction_cfldr64: + mov edx,0x0c500500 + jmp MAVERICK_crd_address5 +ARM_instruction_cfldrd: + mov edx,0x0c500400 + jmp MAVERICK_crd_address5 +ARM_instruction_cfldrs: + mov edx,0x0c100400 + jmp MAVERICK_crd_address5 +ARM_instruction_cfmac32: + mov edx,0x0e100540 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmadd32: + mov edx,0x0e000600 + jmp MAVERICK_aa_crd_crn_crm +ARM_instruction_cfmadda32: + mov edx,0x0e200600 + jmp MAVERICK_aa_ad_crn_crm +ARM_instruction_cfmsc32: + mov edx,0x0e100560 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmsub32: + mov edx,0x0e100600 + jmp MAVERICK_aa_crd_crn_crm +ARM_instruction_cfmsuba32: + mov edx,0x0e300600 + jmp MAVERICK_aa_ad_crn_crm +ARM_instruction_cfmul32: + mov edx,0x0e100500 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmul64: + mov edx,0x0e100520 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmuld: + mov edx,0x0e100420 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmuls: + mov edx,0x0e100400 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfmv32a: + mov edx,0x0e1004a0 + jmp MAVERICK_crd_an +ARM_instruction_cfmv32ah: + mov edx,0x0e100480 + jmp MAVERICK_crd_an +ARM_instruction_cfmv32al: + mov edx,0x0e100440 + jmp MAVERICK_crd_an +ARM_instruction_cfmv32am: + mov edx,0x0e100460 + jmp MAVERICK_crd_an +ARM_instruction_cfmv32sc: + mov edx,0x0e1004e0 + jmp MAVERICK_crd_psc +ARM_instruction_cfmv64a: + mov edx,0x0e1004c0 + jmp MAVERICK_crd_an +ARM_instruction_cfmv64hr: + mov edx,0x0e000530 + jmp MAVERICK_crn_rd +ARM_instruction_cfmv64lr: + mov edx,0x0e000510 + jmp MAVERICK_crn_rd +ARM_instruction_cfmva32: + mov edx,0x0e2004a0 + jmp MAVERICK_ad_crn +ARM_instruction_cfmva64: + mov edx,0x0e2004c0 + jmp MAVERICK_ad_crn +ARM_instruction_cfmvah32: + mov edx,0x0e200480 + jmp MAVERICK_ad_crn +ARM_instruction_cfmval32: + mov edx,0x0e200440 + jmp MAVERICK_ad_crn +ARM_instruction_cfmvam32: + mov edx,0x0e200460 + jmp MAVERICK_ad_crn +ARM_instruction_cfmvdhr: + mov edx,0x0e000430 + jmp MAVERICK_crn_rd +ARM_instruction_cfmvdlr: + mov edx,0x0e000410 + jmp MAVERICK_crn_rd +ARM_instruction_cfmvr64h: + mov edx,0x0e100530 + jmp MAVERICK_rd_crn +ARM_instruction_cfmvr64l: + mov edx,0x0e100510 + jmp MAVERICK_rd_crn +ARM_instruction_cfmvrdh: + mov edx,0x0e100430 + jmp MAVERICK_rd_crn +ARM_instruction_cfmvrdl: + mov edx,0x0e100410 + jmp MAVERICK_rd_crn +ARM_instruction_cfmvrs: + mov edx,0x0e100450 + jmp MAVERICK_rd_crn +ARM_instruction_cfmvsc32: + mov edx,0x0e2004e0 + jmp MAVERICK_psc_crd +ARM_instruction_cfmvsr: + mov edx,0x0e000450 + jmp MAVERICK_crn_rd +ARM_instruction_cfneg32: + mov edx,0x0e300540 + jmp MAVERICK_crd_crn +ARM_instruction_cfneg64: + mov edx,0x0e300560 + jmp MAVERICK_crd_crn +ARM_instruction_cfnegd: + mov edx,0x0e300460 + jmp MAVERICK_crd_crn +ARM_instruction_cfnegs: + mov edx,0x0e300440 + jmp MAVERICK_crd_crn +ARM_instruction_cfrshl32: + mov edx,0x0e000550 + jmp MAVERICK_crm_crn_rd +ARM_instruction_cfrshl64: + mov edx,0x0e000570 + jmp MAVERICK_crm_crn_rd +ARM_instruction_cfsh32: + mov edx,0x0e000500 + jmp MAVERICK_crd_crn_imm +ARM_instruction_cfsh64: + mov edx,0x0e200500 + jmp MAVERICK_crd_crn_imm +ARM_instruction_cfstr32: + mov edx,0x0c000500 + jmp MAVERICK_crd_address5 +ARM_instruction_cfstr64: + mov edx,0x0c400500 + jmp MAVERICK_crd_address5 +ARM_instruction_cfstrd: + mov edx,0x0c400400 + jmp MAVERICK_crd_address5 +ARM_instruction_cfstrs: + mov edx,0x0c000400 + jmp MAVERICK_crd_address5 +ARM_instruction_cfsub32: + mov edx,0x0e3005c0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfsub64: + mov edx,0x0e3005e0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfsubd: + mov edx,0x0e3004e0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cfsubs: + mov edx,0x0e3004c0 + jmp MAVERICK_crd_crn_crm +ARM_instruction_cftruncd32: + mov edx,0x0e1005e0 + jmp MAVERICK_crd_crn +ARM_instruction_cftruncs32: + mov edx,0x0e1005c0 + jmp MAVERICK_crd_crn + +;VFP jump table + +ARM_instruction_fabsd: + mov edx,0x0eb00bc0 + jmp VFP_dd_dm +ARM_instruction_fabss: + mov edx,0x0eb00ac0 + jmp VFP_sd_sm +ARM_instruction_faddd: + mov edx,0x0e300b00 + jmp VFP_dd_dn_dm +ARM_instruction_fadds: + mov edx,0x0e300a00 + jmp VFP_sd_sn_sm +ARM_instruction_fcmpd: + mov edx,0x0eb40b40 + jmp VFP_dd_dm_zero +ARM_instruction_fcmped: + mov edx,0x0eb40bc0 + jmp VFP_dd_dm_zero +ARM_instruction_fcmpes: + mov edx,0x0eb40ac0 + jmp VFP_sd_sm_zero +ARM_instruction_fcmpezd: + mov edx,0x0eb50bc0 + jmp VFP_dd +ARM_instruction_fcmpezs: + mov edx,0x0eb50ac0 + jmp VFP_sd +ARM_instruction_fcmps: + mov edx,0x0eb40a40 + jmp VFP_sd_sm_zero +ARM_instruction_fcmpzd: + mov edx,0x0eb50b40 + jmp VFP_dd +ARM_instruction_fcmpzs: + mov edx,0x0eb50a40 + jmp VFP_sd +ARM_instruction_fconstd: + mov edx,0x0eb00b00 + jmp VFP_dm_imm +ARM_instruction_fconsts: + mov edx,0x0eb00a00 + jmp VFP_sm_imm +ARM_instruction_fcpyd: + mov edx,0x0eb00b40 + jmp VFP_dd_dm +ARM_instruction_fcpys: + mov edx,0x0eb00a40 + jmp VFP_sd_sm +ARM_instruction_fcvtds: + mov edx,0x0eb70ac0 + jmp VFP_dd_sm +ARM_instruction_fcvtsd: + mov edx,0x0eb70bc0 + jmp VFP_sd_dm +ARM_instruction_fdivd: + mov edx,0x0e800b00 + jmp VFP_dd_dn_dm +ARM_instruction_fdivs: + mov edx,0x0e800a00 + jmp VFP_sd_sn_sm +ARM_instruction_fldd: + mov edx,0x0d100b00 + jmp VFP_dd_rn_offset +ARM_instruction_fldmdbd: +ARM_instruction_fldmead: + mov edx,0xd100b00 + jmp VFP_rn_list_d +ARM_instruction_fldmdbx: +ARM_instruction_fldmeax: + mov edx,0xd100b01 + jmp VFP_rn_list_d +ARM_instruction_fldmdbs: +ARM_instruction_fldmeas: + mov edx,0xd100a00 + jmp VFP_rn_list_s +ARM_instruction_fldmd: +ARM_instruction_fldmiad: +ARM_instruction_fldmfdd: + mov edx,0xc900b00 + jmp VFP_rn_list_d +ARM_instruction_fldmx: +ARM_instruction_fldmiax: +ARM_instruction_fldmfdx: + mov edx,0xc900b01 + jmp VFP_rn_list_d +ARM_instruction_fldms: +ARM_instruction_fldmias: +ARM_instruction_fldmfds: + mov edx,0xc900a00 + jmp VFP_rn_list_s +ARM_instruction_flds: + mov edx,0x0d100a00 + jmp VFP_sd_rn_offset +ARM_instruction_fmacd: + mov edx,0x0e000b00 + jmp VFP_FLOAT_dd_dn_dm +ARM_instruction_fmacs: + mov edx,0x0e000a00 + jmp VFP_FLOAT_sd_sn_sm +ARM_instruction_fmdhr: + mov edx,0xe200b10 + jmp VFP_dn_rd +ARM_instruction_fmdlr: + mov edx,0xe000b10 + jmp VFP_dn_rd +ARM_instruction_fmdrr: + mov edx,0x0c400b10 + jmp VFP_dm_rd_rn +ARM_instruction_fmrdh: + mov edx,0x0e300b10 + jmp VFP_rd_dn +ARM_instruction_fmrdl: + mov edx,0x0e100b10 + jmp VFP_rd_dn +ARM_instruction_fmrrd: + mov edx,0x0c500b10 + jmp VFP_rd_rn_dm +ARM_instruction_fmrrs: + mov edx,0x0c500a10 + jmp VFP_rd_rn_sm +ARM_instruction_fmrs: + mov edx,0x0e100a10 + jmp VFP_rd_sn +ARM_instruction_fmrx: + mov edx,0x0ef00a10 + jmp VFP_rd_sysreg +ARM_instruction_fmscd: + mov edx,0x0e100b00 + jmp VFP_FLOAT_dd_dn_dm +ARM_instruction_fmscs: + mov edx,0x0e100a00 + jmp VFP_FLOAT_sd_sn_sm +ARM_instruction_fmsr: + mov edx,0x0e000a10 + jmp VFP_sn_rd +ARM_instruction_fmsrr: + mov edx,0x0c400a10 + jmp VFP_sm_rd_rn +ARM_instruction_fmstat: + mov edx,0x0ef1fa10 + jmp VFP_fmstat +ARM_instruction_fmuld: + mov edx,0x0e200b00 + jmp VFP_dd_dn_dm +ARM_instruction_fmuls: + mov edx,0x0e200a00 + jmp VFP_sd_sn_sm +ARM_instruction_fmxr: + mov edx,0x0ee00a10 + jmp VFP_sysreg_rd +ARM_instruction_fnegd: + mov edx,0x0eb10b40 + jmp VFP_dd_dm +ARM_instruction_fnegs: + mov edx,0x0eb10a40 + jmp VFP_sd_sm +ARM_instruction_fnmacd: + mov edx,0x0e000b40 + jmp VFP_FLOAT_dd_dn_dm +ARM_instruction_fnmacs: + mov edx,0x0e000a40 + jmp VFP_FLOAT_sd_sn_sm +ARM_instruction_fnmscd: + mov edx,0x0e100b40 + jmp VFP_FLOAT_dd_dn_dm +ARM_instruction_fnmscs: + mov edx,0x0e100a40 + jmp VFP_FLOAT_sd_sn_sm +ARM_instruction_fnmuld: + mov edx,0x0e200b40 + jmp VFP_dd_dn_dm +ARM_instruction_fnmuls: + mov edx,0x0e200a40 + jmp VFP_sd_sn_sm +ARM_instruction_fshtod: + mov edx,0x0eba0b40 + jmp VFP_dd_dd_imm +ARM_instruction_fshtos: + mov edx,0x0eba0a40 + jmp VFP_sd_sd_imm +ARM_instruction_fsitod: + mov edx,0x0eb80bc0 + jmp VFP_dd_sm +ARM_instruction_fsitos: + mov edx,0x0eb80ac0 + jmp VFP_sd_sm +ARM_instruction_fsltod: + mov edx,0x0eba0bc0 + jmp VFP_dd_dd_imm +ARM_instruction_fsltos: + mov edx,0x0eba0ac0 + jmp VFP_sd_sd_imm +ARM_instruction_fsqrtd: + mov edx,0x0eb10bc0 + jmp VFP_dd_dm +ARM_instruction_fsqrts: + mov edx,0x0eb10ac0 + jmp VFP_sd_sm +ARM_instruction_fstd: + mov edx,0x0d000b00 + jmp VFP_dd_rn_offset +ARM_instruction_fstmdbd: +ARM_instruction_fstmfdd: + mov edx,0xd000b00 + jmp VFP_rn_list_d +ARM_instruction_fstmdbx: +ARM_instruction_fstmfdx: + mov edx,0xd000b01 + jmp VFP_rn_list_d +ARM_instruction_fstmdbs: +ARM_instruction_fstmfds: + mov edx,0xd000a00 + jmp VFP_rn_list_s +ARM_instruction_fstmd: +ARM_instruction_fstmiad: +ARM_instruction_fstmead: + mov edx,0xc800b00 + jmp VFP_rn_list_d +ARM_instruction_fstmx: +ARM_instruction_fstmiax: +ARM_instruction_fstmeax: + mov edx,0xc800b01 + jmp VFP_rn_list_d +ARM_instruction_fstms: +ARM_instruction_fstmias: +ARM_instruction_fstmeas: + mov edx,0xc800a00 + jmp VFP_rn_list_s +ARM_instruction_fsts: + mov edx,0x0d000a00 + jmp VFP_sd_rn_offset +ARM_instruction_fsubd: + mov edx,0x0e300b40 + jmp VFP_dd_dn_dm +ARM_instruction_fsubs: + mov edx,0x0e300a40 + jmp VFP_sd_sn_sm +ARM_instruction_ftoshd: + mov edx,0x0ebe0b40 + jmp VFP_dd_dd_imm +ARM_instruction_ftoshs: + mov edx,0x0ebe0a40 + jmp VFP_sd_sd_imm +ARM_instruction_ftosid: + mov edx,0x0ebd0b40 + jmp VFP_sd_dm +ARM_instruction_ftosis: + mov edx,0x0ebd0a40 + jmp VFP_sd_sm +ARM_instruction_ftosizd: + mov edx,0x0ebd0bc0 + jmp VFP_sd_dm +ARM_instruction_ftosizs: + mov edx,0x0ebd0ac0 + jmp VFP_sd_sm +ARM_instruction_ftosld: + mov edx,0x0ebe0bc0 + jmp VFP_dd_dd_imm +ARM_instruction_ftosls: + mov edx,0x0ebe0ac0 + jmp VFP_sd_sd_imm +ARM_instruction_ftouhd: + mov edx,0x0ebf0b40 + jmp VFP_dd_dd_imm +ARM_instruction_ftouhs: + mov edx,0x0ebf0a40 + jmp VFP_sd_sd_imm +ARM_instruction_ftouid: + mov edx,0x0ebc0b40 + jmp VFP_sd_dm +ARM_instruction_ftouis: + mov edx,0x0ebc0a40 + jmp VFP_sd_sm +ARM_instruction_ftouizd: + mov edx,0x0ebc0bc0 + jmp VFP_sd_dm +ARM_instruction_ftouizs: + mov edx,0x0ebc0ac0 + jmp VFP_sd_sm +ARM_instruction_ftould: + mov edx,0x0ebf0bc0 + jmp VFP_dd_dd_imm +ARM_instruction_ftouls: + mov edx,0x0ebf0ac0 + jmp VFP_sd_sd_imm +ARM_instruction_fuhtod: + mov edx,0x0ebb0b40 + jmp VFP_dd_dd_imm +ARM_instruction_fuhtos: + mov edx,0x0ebb0a40 + jmp VFP_sd_sd_imm +ARM_instruction_fuitod: + mov edx,0x0eb80b40 + jmp VFP_dd_sm +ARM_instruction_fuitos: + mov edx,0x0eb80a40 + jmp VFP_sd_sm +ARM_instruction_fultod: + mov edx,0x0ebb0bc0 + jmp VFP_dd_dd_imm +ARM_instruction_fultos: + mov edx,0x0ebb0ac0 + jmp VFP_sd_sd_imm +ARM_instruction_vcvtb.f16.f32: + mov edx,0x0eb30a40 + jmp VFP_sd_sm_HP +ARM_instruction_vcvtb.f32.f16: + mov edx,0x0eb20a40 + jmp VFP_sd_sm_HP +ARM_instruction_vcvtt.f16.f32: + mov edx,0x0eb30ac0 + jmp VFP_sd_sm_HP +ARM_instruction_vcvtt.f32.f16: + mov edx,0x0eb20ac0 + jmp VFP_sd_sm_HP + +;xScale jump table + +ARM_instruction_mar: + mov edx,0x0c400000 + jmp XSCALE_acc_rdlo_rdhi +ARM_instruction_mia: + mov edx,0x0e200010 + jmp XSCALE_acc_rm_rs +ARM_instruction_miabb: + mov edx,0x0e2c0010 + jmp XSCALE_acc_rm_rs +ARM_instruction_miabt: + mov edx,0x0e2d0010 + jmp XSCALE_acc_rm_rs +ARM_instruction_miaph: + mov edx,0x0e280010 + jmp XSCALE_acc_rm_rs +ARM_instruction_miatb: + mov edx,0x0e2e0010 + jmp XSCALE_acc_rm_rs +ARM_instruction_miatt: + mov edx,0x0e2f0010 + jmp XSCALE_acc_rm_rs +ARM_instruction_mra: + mov edx,0x0c500000 + jmp XSCALE_rdlo_rdhi_acc + +;IWMMXT v1 jump table + +ARM_instruction_tandcb: + mov edx,0x0e13f130 + jmp IWMMXT_r15 +ARM_instruction_tandch: + mov edx,0x0e53f130 + jmp IWMMXT_r15 +ARM_instruction_tandcw: + mov edx,0x0e93f130 + jmp IWMMXT_r15 +ARM_instruction_tbcstb: + mov edx,0x0e400010 + jmp IWMMXT_wrd_rn +ARM_instruction_tbcsth: + mov edx,0x0e400050 + jmp IWMMXT_wrd_rn +ARM_instruction_tbcstw: + mov edx,0x0e400090 + jmp IWMMXT_wrd_rn +ARM_instruction_textrcb: + mov edx,0x0e13f170 + jmp IWMMXT_r15_imm +ARM_instruction_textrch: + mov edx,0x0e53f170 + jmp IWMMXT_r15_imm +ARM_instruction_textrcw: + mov edx,0x0e93f170 + jmp IWMMXT_r15_imm +ARM_instruction_textrmsb: + mov edx,0x0e100078 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_textrmsh: + mov edx,0x0e500078 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_textrmsw: + mov edx,0x0e900078 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_textrmub: + mov edx,0x0e100070 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_textrmuh: + mov edx,0x0e500070 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_textrmuw: + mov edx,0x0e900070 + jmp IWMMXT_rd_wrn_imm +ARM_instruction_tinsrb: + mov edx,0x0e600010 + jmp IWMMXT_wrd_rn_imm +ARM_instruction_tinsrh: + mov edx,0x0e600050 + jmp IWMMXT_wrd_rn_imm +ARM_instruction_tinsrw: + mov edx,0x0e600090 + jmp IWMMXT_wrd_rn_imm +ARM_instruction_tmcr: + mov edx,0x0e000110 + jmp IWMMXT_wcd_rn +ARM_instruction_tmcrr: + mov edx,0x0c400000 + jmp IWMMXT_wrd_rdlo_rdhi +ARM_instruction_tmia: + mov edx,0x0e200010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmiabb: + mov edx,0x0e2c0010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmiabt: + mov edx,0x0e2d0010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmiaph: + mov edx,0x0e280010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmiatb: + mov edx,0x0e2e0010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmiatt: + mov edx,0x0e2f0010 + jmp IWMMXT_wrd_rm_rs +ARM_instruction_tmovmskb: + mov edx,0x0e100030 + jmp IWMMXT_rd_wrn +ARM_instruction_tmovmskh: + mov edx,0x0e500030 + jmp IWMMXT_rd_wrn +ARM_instruction_tmovmskw: + mov edx,0x0e900030 + jmp IWMMXT_rd_wrn +ARM_instruction_tmrc: + mov edx,0x0e100110 + jmp IWMMXT_rd_wcn +ARM_instruction_tmrrc: + mov edx,0x0c500000 + jmp IWMMXT_rdlo_rdhi_wrn +ARM_instruction_torcb: + mov edx,0x0e13f150 + jmp IWMMXT_r15 +ARM_instruction_torch: + mov edx,0x0e53f150 + jmp IWMMXT_r15 +ARM_instruction_torcw: + mov edx,0x0e93f150 + jmp IWMMXT_r15 +ARM_instruction_waccb: + mov edx,0x0e0001c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wacch: + mov edx,0x0e4001c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_waccw: + mov edx,0x0e8001c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_waddb: + mov edx,0x0e000180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddbss: + mov edx,0x0e300180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddbus: + mov edx,0x0e100180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddh: + mov edx,0x0e400180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddhss: + mov edx,0x0e700180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddhus: + mov edx,0x0e500180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddw: + mov edx,0x0e800180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddwss: + mov edx,0x0eb00180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waddwus: + mov edx,0x0e900180 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_waligni: + mov edx,0x0e000020 + jmp IWMMXT_wrd_wrn_wrm_imm +ARM_instruction_walignr0: + mov edx,0x0e800020 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_walignr1: + mov edx,0x0e900020 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_walignr2: + mov edx,0x0ea00020 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_walignr3: + mov edx,0x0eb00020 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wand: + mov edx,0x0e200000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wandn: + mov edx,0x0e300000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wavg2b: + mov edx,0x0e800000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wavg2br: + mov edx,0x0e900000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wavg2h: + mov edx,0x0ec00000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wavg2hr: + mov edx,0x0ed00000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpeqb: + mov edx,0x0e000060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpeqh: + mov edx,0x0e400060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpeqw: + mov edx,0x0e800060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtsb: + mov edx,0x0e300060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtsh: + mov edx,0x0e700060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtsw: + mov edx,0x0eb00060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtub: + mov edx,0x0e100060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtuh: + mov edx,0x0e500060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wcmpgtuw: + mov edx,0x0e900060 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wldrb: + mov edx,0x0c100000 + jmp IWMMXT_wrd_address5 +ARM_instruction_wldrd: + mov edx,0x0c500100 + jmp IWMMXT_wrd_address5_reg_offset +ARM_instruction_wldrh: + mov edx,0x0c500000 + jmp IWMMXT_wrd_address5 +ARM_instruction_wldrw: + mov edx,0x0c100100 + jmp IWMMXT_wrd_address5 +ARM_instruction_wmacs: + mov edx,0x0e600100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmacsz: + mov edx,0x0e700100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmacu: + mov edx,0x0e400100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmacuz: + mov edx,0x0e500100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmadds: + mov edx,0x0ea00100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaddu: + mov edx,0x0e800100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxsb: + mov edx,0x0e200160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxsh: + mov edx,0x0e600160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxsw: + mov edx,0x0ea00160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxub: + mov edx,0x0e000160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxuh: + mov edx,0x0e400160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmaxuw: + mov edx,0x0e800160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminsb: + mov edx,0x0e300160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminsh: + mov edx,0x0e700160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminsw: + mov edx,0x0eb00160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminub: + mov edx,0x0e100160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminuh: + mov edx,0x0e500160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wminuw: + mov edx,0x0e900160 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmov: + mov edx,0x0e000000 + jmp IWMMXT_wrd_wrn_WMOV +ARM_instruction_wmulsl: + mov edx,0x0e200100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmulsm: + mov edx,0x0e300100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmulul: + mov edx,0x0e000100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wmulum: + mov edx,0x0e100100 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wor: + mov edx,0x0e000000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackdss: + mov edx,0x0ef00080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackdus: + mov edx,0x0ed00080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackhss: + mov edx,0x0e700080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackhus: + mov edx,0x0e500080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackwss: + mov edx,0x0eb00080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wpackwus: + mov edx,0x0e900080 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wrord: + mov edx,0x0ef00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wrordg: + mov edx,0x0ef00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wrorh: + mov edx,0x0e700040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wrorhg: + mov edx,0x0e700140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wrorw: + mov edx,0x0eb00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wrorwg: + mov edx,0x0eb00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsadb: + mov edx,0x0e000120 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsadbz: + mov edx,0x0e100120 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsadh: + mov edx,0x0e400120 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsadhz: + mov edx,0x0e500120 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wshufh: + mov edx,0x0e0001e0 + jmp IWMMXT_wrd_wrn_imm +ARM_instruction_wslld: + mov edx,0x0ed00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wslldg: + mov edx,0x0ed00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsllh: + mov edx,0x0e500040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsllhg: + mov edx,0x0e500140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsllw: + mov edx,0x0e900040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsllwg: + mov edx,0x0e900140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsrad: + mov edx,0x0ec00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsradg: + mov edx,0x0ec00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsrah: + mov edx,0x0e400040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsrahg: + mov edx,0x0e400140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsraw: + mov edx,0x0e800040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsrawg: + mov edx,0x0e800140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsrld: + mov edx,0x0ee00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsrldg: + mov edx,0x0ee00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsrlh: + mov edx,0x0e600040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsrlhg: + mov edx,0x0e600140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wsrlw: + mov edx,0x0ea00040 + jmp IWMMXT_wrd_wrn_param +ARM_instruction_wsrlwg: + mov edx,0x0ea00140 + jmp IWMMXT_wrd_wrn_wcm +ARM_instruction_wstrb: + mov edx,0x0c000000 + jmp IWMMXT_wrd_address5 +ARM_instruction_wstrd: + mov edx,0x0c400100 + jmp IWMMXT_wrd_address5_reg_offset +ARM_instruction_wstrh: + mov edx,0x0c400000 + jmp IWMMXT_wrd_address5 +ARM_instruction_wstrw: + mov edx,0x0c000100 + jmp IWMMXT_wrd_address5 +ARM_instruction_wsubb: + mov edx,0x0e0001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubbss: + mov edx,0x0e3001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubbus: + mov edx,0x0e1001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubh: + mov edx,0x0e4001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubhss: + mov edx,0x0e7001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubhus: + mov edx,0x0e5001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubw: + mov edx,0x0e8001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubwss: + mov edx,0x0eb001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wsubwus: + mov edx,0x0e9001a0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckehsb: + mov edx,0x0e2000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckehsh: + mov edx,0x0e6000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckehsw: + mov edx,0x0ea000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckehub: + mov edx,0x0e0000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckehuh: + mov edx,0x0e4000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckehuw: + mov edx,0x0e8000c0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckelsb: + mov edx,0x0e2000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckelsh: + mov edx,0x0e6000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckelsw: + mov edx,0x0ea000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckelub: + mov edx,0x0e0000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckeluh: + mov edx,0x0e4000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckeluw: + mov edx,0x0e8000e0 + jmp IWMMXT_wrd_wrn +ARM_instruction_wunpckihb: + mov edx,0x0e1000c0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckihh: + mov edx,0x0e5000c0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckihw: + mov edx,0x0e9000c0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckilb: + mov edx,0x0e1000e0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckilh: + mov edx,0x0e5000e0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wunpckilw: + mov edx,0x0e9000e0 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wxor: + mov edx,0x0e100000 + jmp IWMMXT_wrd_wrn_wrm +ARM_instruction_wzero: + mov edx,0x0e300000 + jmp IWMMXT_wrd +;IWMMXT V2 jump table +ARM_instruction_torvscb: + mov edx,0x0e12f190 + jmp IWMMXT_r15_v2 +ARM_instruction_torvsch: + mov edx,0x0e52f190 + jmp IWMMXT_r15_v2 +ARM_instruction_torvscw: + mov edx,0x0e92f190 + jmp IWMMXT_r15_v2 +ARM_instruction_wabsb: + mov edx,0x0e2001c0 + jmp IWMMXT_rd_rn_v2 +ARM_instruction_wabsh: + mov edx,0x0e6001c0 + jmp IWMMXT_rd_rn_v2 +ARM_instruction_wabsw: + mov edx,0x0ea001c0 + jmp IWMMXT_rd_rn_v2 +ARM_instruction_wabsdiffb: + mov edx,0x0e1001c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wabsdiffh: + mov edx,0x0e5001c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wabsdiffw: + mov edx,0x0e9001c0 + jmp IWMMXT_rd_rn_rm_v2 +;;ARM_instruction_waddbhusl: +;; mov edx,0x0e2001a0 +;; jmp IWMMXT_rd_rn_rm_v2 +;;ARM_instruction_waddbhusm: +;; mov edx,0x0e6001a0 +;; jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_waddhc: + mov edx,0x0e600180 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_waddwc: + mov edx,0x0ea00180 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_waddsubhx: + mov edx,0x0ea001a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wavg4: + mov edx,0x0e400000 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wavg4r: + mov edx,0x0e500000 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmaddsn: + mov edx,0x0ee00100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmaddsx: + mov edx,0x0eb00100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmaddun: + mov edx,0x0ec00100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmaddux: + mov edx,0x0e900100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmerge: + mov edx,0x0e000080 + jmp IWMMXT_rd_rn_rm_imm +ARM_instruction_wmiabb: + mov edx,0x0e0000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiabt: + mov edx,0x0e1000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiatb: + mov edx,0x0e2000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiatt: + mov edx,0x0e3000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiabbn: + mov edx,0x0e4000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiabtn: + mov edx,0x0e5000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiatbn: + mov edx,0x0e6000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiattn: + mov edx,0x0e7000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawbb: + mov edx,0x0e800120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawbt: + mov edx,0x0e900120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawtb: + mov edx,0x0ea00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawtt: + mov edx,0x0eb00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawbbn: + mov edx,0x0ec00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawbtn: + mov edx,0x0ed00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawtbn: + mov edx,0x0ee00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmiawttn: + mov edx,0x0ef00120 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulsmr: + mov edx,0x0ef00100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulumr: + mov edx,0x0ed00100 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulwumr: + mov edx,0x0ec000c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulwsmr: + mov edx,0x0ee000c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulwum: + mov edx,0x0ed000c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulwsm: + mov edx,0x0ef000c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wmulwl: + mov edx,0x0eb000c0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiabb: + mov edx,0x0e8000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiabt: + mov edx,0x0e9000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiatb: + mov edx,0x0ea000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiatt: + mov edx,0x0eb000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiabbn: + mov edx,0x0ec000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiabtn: + mov edx,0x0ed000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiatbn: + mov edx,0x0ee000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmiattn: + mov edx,0x0ef000a0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmulm: + mov edx,0x0e100080 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmulmr: + mov edx,0x0e300080 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmulwm: + mov edx,0x0ec000e0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wqmulwmr: + mov edx,0x0ee000e0 + jmp IWMMXT_rd_rn_rm_v2 +ARM_instruction_wsubaddhx: + mov edx,0x0ed001c0 + jmp IWMMXT_rd_rn_rm_v2 + +;SIMD int & float jump table, with some aliases to VFP opcodes + +ARM_instruction_vaba.s16: + mov edx,0xf2100710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vaba.s32: + mov edx,0xf2200710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vaba.s8: + mov edx,0xf2000710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vaba.u16: + mov edx,0xf3100710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vaba.u32: + mov edx,0xf3200710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vaba.u8: + mov edx,0xf3000710 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vabal.s16: + mov edx,0xf2900500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabal.s32: + mov edx,0xf2a00500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabal.s8: + mov edx,0xf2800500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabal.u16: + mov edx,0xf3900500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabal.u32: + mov edx,0xf3a00500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabal.u8: + mov edx,0xf3800500 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabd.f32: + mov edx,0xf3200d00 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vabd.s16: + mov edx,0xf2100700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabd.s32: + mov edx,0xf2200700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabd.s8: + mov edx,0xf2000700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabd.u16: + mov edx,0xf3100700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabd.u32: + mov edx,0xf3200700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabd.u8: + mov edx,0xf3000700 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vabdl.s16: + mov edx,0xf2900700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabdl.s32: + mov edx,0xf2a00700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabdl.s8: + mov edx,0xf2800700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabdl.u16: + mov edx,0xf3900700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabdl.u32: + mov edx,0xf3a00700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabdl.u8: + mov edx,0xf3800700 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vabs.f32: + mov edx,0xf3b90700 + mov ecx,0x0eb00ac0 + jmp SIMD_FLOAT_vd_vm_f32 +ARM_instruction_vabs.f64 = ARM_instruction_fabsd +ARM_instruction_vabs.s16: + mov edx,0xf3b50300 + jmp SIMD_INT_vd_vm +ARM_instruction_vabs.s32: + mov edx,0xf3b90300 + jmp SIMD_INT_vd_vm +ARM_instruction_vabs.s8: + mov edx,0xf3b10300 + jmp SIMD_INT_vd_vm +ARM_instruction_vacge.f32: + mov edx,0xf3000e10 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vacgt.f32: + mov edx,0xf3200e10 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vacle.f32: + mov edx,0xf3000e10 + jmp SIMD_FLOAT_vd_vm_vn_alt +ARM_instruction_vaclt.f32: + mov edx,0xf3200e10 + jmp SIMD_FLOAT_vd_vm_vn_alt +ARM_instruction_vadd.f32: + mov edx,0xf2000d00 + mov ecx,0x0e300a00 + jmp SIMD_FLOAT_vd_vn_vm_f32 +ARM_instruction_vadd.f64 = ARM_instruction_faddd +ARM_instruction_vadd.i16: + mov edx,0xf2100800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vadd.i32: + mov edx,0xf2200800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vadd.i64: + mov edx,0xf2300800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vadd.i8: + mov edx,0xf2000800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vaddhn.i16: + mov edx,0xf2800400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vaddhn.i32: + mov edx,0xf2900400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vaddhn.i64: + mov edx,0xf2a00400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vaddl.s16: + mov edx,0xf2900000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddl.s32: + mov edx,0xf2a00000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddl.s8: + mov edx,0xf2800000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddl.u16: + mov edx,0xf3900000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddl.u32: + mov edx,0xf3a00000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddl.u8: + mov edx,0xf3800000 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vaddw.s16: + mov edx,0xf2900100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vaddw.s32: + mov edx,0xf2a00100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vaddw.s8: + mov edx,0xf2800100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vaddw.u16: + mov edx,0xf3900100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vaddw.u32: + mov edx,0xf3a00100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vaddw.u8: + mov edx,0xf3800100 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vand.i16: + mov edx,0xf2800931 + jmp SIMD_INT_vd_imm +ARM_instruction_vand.i32: + mov edx,0xf2800131 + jmp SIMD_INT_vd_imm +ARM_instruction_vand: + mov edx,0xf2000110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vbic.i16: + mov edx,0xf2800930 + jmp SIMD_INT_vd_imm +ARM_instruction_vbic.i32: + mov edx,0xf2800130 + jmp SIMD_INT_vd_imm +ARM_instruction_vbic: + mov edx,0xf2100110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vbif: + mov edx,0xf3300110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vbit: + mov edx,0xf3200110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vbsl: + mov edx,0xf3100110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vceq.f32: + mov edx,0xf2000e00 + mov ecx,0xf3b90500 + jmp SIMD_FLOAT_vd_vn_vm_alt_zero +ARM_instruction_vceq.i16: + mov edx,0xf3100810 + mov ecx,0xf3b50100 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vceq.i32: + mov edx,0xf3200810 + mov ecx,0xf3b90100 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vceq.i8: + mov edx,0xf3000810 + mov ecx,0xf3b10100 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcge.f32: + mov edx,0xf3000e00 + mov ecx,0xf3b90480 + jmp SIMD_FLOAT_vd_vn_vm_alt_zero +ARM_instruction_vcge.s16: + mov edx,0xf2100310 + mov ecx,0xf3b50080 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcge.s32: + mov edx,0xf2200310 + mov ecx,0xf3b90080 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcge.s8: + mov edx,0xf2000310 + mov ecx,0xf3b10080 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcge.u16: + mov edx,0xf3100310 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcge.u32: + mov edx,0xf3200310 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcge.u8: + mov edx,0xf3000310 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcgt.f32: + mov edx,0xf3200e00 + mov ecx,0xf3b90400 + jmp SIMD_FLOAT_vd_vn_vm_alt_zero +ARM_instruction_vcgt.s16: + mov edx,0xf2100300 + mov ecx,0xf3b50000 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcgt.s32: + mov edx,0xf2200300 + mov ecx,0xf3b90000 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcgt.s8: + mov edx,0xf2000300 + mov ecx,0xf3b10000 + jmp SIMD_INT_vd_vn_vm_alt_zero +ARM_instruction_vcgt.u16: + mov edx,0xf3100300 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcgt.u32: + mov edx,0xf3200300 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcgt.u8: + mov edx,0xf3000300 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vcle.f32: + mov edx,0xf3000e00 + mov ecx,0xf3b90580 + jmp SIMD_FLOAT_vd_vn_vm_alt_zero_swap +ARM_instruction_vcle.s16: + mov edx,0xf2100310 + mov ecx,0xf3b50180 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vcle.s32: + mov edx,0xf2200310 + mov ecx,0xf3b90180 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vcle.s8: + mov edx,0xf2000310 + mov ecx,0xf3b10180 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vcle.u16: + mov edx,0xf3100310 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vcle.u32: + mov edx,0xf3200310 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vcle.u8: + mov edx,0xf3000310 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vcls.s16: + mov edx,0xf3b40400 + jmp SIMD_INT_vd_vm +ARM_instruction_vcls.s32: + mov edx,0xf3b80400 + jmp SIMD_INT_vd_vm +ARM_instruction_vcls.s8: + mov edx,0xf3b00400 + jmp SIMD_INT_vd_vm +ARM_instruction_vclt.f32: + mov edx,0xf3200e00 + mov ecx,0xf3b90600 + jmp SIMD_FLOAT_vd_vn_vm_alt_zero_swap +ARM_instruction_vclt.s16: + mov edx,0xf2100300 + mov ecx,0xf3b50200 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vclt.s32: + mov edx,0xf2200300 + mov ecx,0xf3b90200 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vclt.s8: + mov edx,0xf2000300 + mov ecx,0xf3b10200 + jmp SIMD_INT_vd_vn_vm_alt_zero_swap +ARM_instruction_vclt.u16: + mov edx,0xf3100300 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vclt.u32: + mov edx,0xf3200300 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vclt.u8: + mov edx,0xf3000300 + jmp SIMD_INT_vd_vn_vm_alt_swap +ARM_instruction_vclz.i16: + mov edx,0xf3b40480 + jmp SIMD_INT_vd_vm +ARM_instruction_vclz.i32: + mov edx,0xf3b80480 + jmp SIMD_INT_vd_vm +ARM_instruction_vclz.i8: + mov edx,0xf3b00480 + jmp SIMD_INT_vd_vm +ARM_instruction_vcmp.f32 = ARM_instruction_fcmps +ARM_instruction_vcmp.f64 = ARM_instruction_fcmpd +ARM_instruction_vcmpe.f32 = ARM_instruction_fcmpes +ARM_instruction_vcmpe.f64 = ARM_instruction_fcmped +ARM_instruction_vcnt.8: + mov edx,0xf3b00500 + jmp SIMD_INT_vd_vm +ARM_instruction_vcvt.f16.f32: + mov edx,0xf3b60600 + jmp SIMD_FLOAT_dd_qm +ARM_instruction_vcvt.f32.f16: + mov edx,0xf3b60700 + jmp SIMD_FLOAT_qd_dm +ARM_instruction_vcvt.f32.f64 = ARM_instruction_fcvtsd +ARM_instruction_vcvt.f32.s16 = ARM_instruction_fshtos +ARM_instruction_vcvt.f32.s32: + mov edx,0xf3bb0600 + mov ecx,0x0eb80ac0 ;FSITOS + jmp SIMD_FLOAT_vd_vm_imm +ARM_instruction_vcvt.f32.u16 = ARM_instruction_fuhtos +ARM_instruction_vcvt.f32.u32: + mov edx,0xf3bb0680 + mov ecx,0x0eb80a40 ;FUITOS + jmp SIMD_FLOAT_vd_vm_imm +ARM_instruction_vcvt.f64.f32 = ARM_instruction_fcvtds +ARM_instruction_vcvt.f64.s16 = ARM_instruction_fshtod +ARM_instruction_vcvt.f64.s32: + mov edx,0x0eb80bc0 ;FSITOD + mov ecx,0x0eba0bc0 ;FSLTOD + jmp SIMD_FLOAT_dd_sm_CVT +ARM_instruction_vcvt.f64.u16 = ARM_instruction_fuhtod +ARM_instruction_vcvt.f64.u32: + mov edx,0x0eb80b40 ;FUITOD + mov ecx,0x0ebb0bc0 ;FULTOD + jmp SIMD_FLOAT_dd_sm_CVT +ARM_instruction_vcvt.s16.f32 = ARM_instruction_ftoshs +ARM_instruction_vcvt.s16.f64 = ARM_instruction_ftoshd +ARM_instruction_vcvt.s32.f32: + mov edx,0xf3bb0700 + mov ecx,0x0ebd0ac0 ;FTOSIZS + jmp SIMD_FLOAT_vd_vm_imm +ARM_instruction_vcvt.s32.f64: + mov edx,0x0ebd0bc0 ;FTOSIZD + mov ecx,0x0ebe0bc0 ;FTOSLD + jmp SIMD_FLOAT_sd_dm_CVT +ARM_instruction_vcvt.u16.f32 = ARM_instruction_ftouhs +ARM_instruction_vcvt.u16.f64 = ARM_instruction_ftouhd +ARM_instruction_vcvt.u32.f32: + mov edx,0xf3bb0780 + mov ecx,0x0ebc0ac0 ;FTOUIZS + jmp SIMD_FLOAT_vd_vm_imm +ARM_instruction_vcvt.u32.f64: + mov edx,0x0ebc0bc0 ;FTOUIZD + mov ecx,0x0ebf0bc0 ;FTOULD + jmp SIMD_FLOAT_sd_dm_CVT +ARM_instruction_vcvtr.s32.f32 = ARM_instruction_ftosis +ARM_instruction_vcvtr.s32.f64 = ARM_instruction_ftosid +ARM_instruction_vcvtr.u32.f32 = ARM_instruction_ftouis +ARM_instruction_vcvtr.u32.f64 = ARM_instruction_ftouid +ARM_instruction_vdiv.f32 = ARM_instruction_fdivs +ARM_instruction_vdiv.f64 = ARM_instruction_fdivd +ARM_instruction_vdup.16: + mov edx,0xf3b20c00 + mov ecx,0x0e800b30 + jmp SIMD_INT_qd_dmx +ARM_instruction_vdup.32: + mov edx,0xf3b30c00 + mov ecx,0x0e800b10 + jmp SIMD_INT_qd_dmx +ARM_instruction_vdup.8: + mov edx,0xf3b10c00 + mov ecx,0x0ec00b10 + jmp SIMD_INT_qd_dmx +ARM_instruction_veor: + mov edx,0xf3000110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vext.16: + mov edx,0xf2b00200 + jmp SIMD_INT_vd_vn_vm_imm +ARM_instruction_vext.32: + mov edx,0xf2b00400 + jmp SIMD_INT_vd_vn_vm_imm +ARM_instruction_vext.64: + mov edx,0xf2b00800 + jmp SIMD_INT_vd_vn_vm_imm +ARM_instruction_vext.8: + mov edx,0xf2b00100 + jmp SIMD_INT_vd_vn_vm_imm +ARM_instruction_vhadd.s16: + mov edx,0xf2100000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhadd.s32: + mov edx,0xf2200000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhadd.s8: + mov edx,0xf2000000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhadd.u16: + mov edx,0xf3100000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhadd.u32: + mov edx,0xf3200000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhadd.u8: + mov edx,0xf3000000 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.s16: + mov edx,0xf2100200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.s32: + mov edx,0xf2200200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.s8: + mov edx,0xf2000200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.u16: + mov edx,0xf3100200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.u32: + mov edx,0xf3200200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vhsub.u8: + mov edx,0xf3000200 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vld1.16: + mov edx,0xf4200040 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vld1.32: + mov edx,0xf4200080 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vld1.64: + mov edx,0xf42000c0 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vld1.8: + mov edx,0xf4200000 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vld2.16: + mov edx,0xf4200040 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vld2.32: + mov edx,0xf4200080 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vld2.8: + mov edx,0xf4200000 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vld3.16: + mov edx,0xf4200040 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vld3.32: + mov edx,0xf4200080 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vld3.8: + mov edx,0xf4200000 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vld4.16: + mov edx,0xf4200040 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vld4.32: + mov edx,0xf4200080 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vld4.8: + mov edx,0xf4200000 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vldm.32 = ARM_instruction_fldmias +ARM_instruction_vldm.64 = ARM_instruction_fldmiad +ARM_instruction_vldmdb.32 = ARM_instruction_fldmdbs +ARM_instruction_vldmdb.64 = ARM_instruction_fldmdbd +ARM_instruction_vldmfd.32 = ARM_instruction_fldmfds +ARM_instruction_vldmfd.64 = ARM_instruction_fldmfdd +ARM_instruction_vldmea.32 = ARM_instruction_fldmeas +ARM_instruction_vldmea.64 = ARM_instruction_fldmead +ARM_instruction_vldmia.32 = ARM_instruction_fldmias +ARM_instruction_vldmia.64 = ARM_instruction_fldmiad +ARM_instruction_vldmea: +ARM_instruction_vldmdb: + mov edx,0xd100a00 + jmp SIMD_INT_rn_list +ARM_instruction_vldm: +ARM_instruction_vldmfd: +ARM_instruction_vldmia: + mov edx,0xc900a00 + jmp SIMD_INT_rn_list +ARM_instruction_vldr.32 = ARM_instruction_flds +ARM_instruction_vldr.64 = ARM_instruction_fldd +ARM_instruction_vldr: + mov edx,0x0d100a00 + jmp SIMD_INT_vd_rn_offset +ARM_instruction_vmax.f32: + mov edx,0xf2000f00 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vmax.s16: + mov edx,0xf2100600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmax.s32: + mov edx,0xf2200600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmax.s8: + mov edx,0xf2000600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmax.u16: + mov edx,0xf3100600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmax.u32: + mov edx,0xf3200600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmax.u8: + mov edx,0xf3000600 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.f32: + mov edx,0xf2200f00 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vmin.s16: + mov edx,0xf2100610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.s32: + mov edx,0xf2200610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.s8: + mov edx,0xf2000610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.u16: + mov edx,0xf3100610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.u32: + mov edx,0xf3200610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmin.u8: + mov edx,0xf3000610 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmla.f32: + mov edx,0xf2000d10 + mov ecx,0x0e000a00 + jmp SIMD_FLOAT_vd_vn_vmx_f32 +ARM_instruction_vmla.f64 = ARM_instruction_fmacd +ARM_instruction_vmla.i16: + mov edx,0xf2100900 + jmp SIMD_INT_vd_vn_vmx +ARM_instruction_vmla.i32: + mov edx,0xf2200900 + jmp SIMD_INT_vd_vn_vmx +ARM_instruction_vmla.i8: + mov edx,0xf2000900 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vmla.s16 = ARM_instruction_vmla.i16 +ARM_instruction_vmla.s32 = ARM_instruction_vmla.i32 +ARM_instruction_vmla.s8 = ARM_instruction_vmla.i8 +ARM_instruction_vmla.u16 = ARM_instruction_vmla.i16 +ARM_instruction_vmla.u32 = ARM_instruction_vmla.i32 +ARM_instruction_vmla.u8 = ARM_instruction_vmla.i8 +ARM_instruction_vmlal.s16: + mov edx,0xf2900800 + mov ecx,0xf2900240 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlal.s32: + mov edx,0xf2a00800 + mov ecx,0xf2a00240 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlal.s8: + mov edx,0xf2800800 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmlal.u16: + mov edx,0xf3900800 + mov ecx,0xf3900240 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlal.u32: + mov edx,0xf3a00800 + mov ecx,0xf3a00240 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlal.u8: + mov edx,0xf3800800 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmls.f32: + mov edx,0xf2200d10 + mov ecx,0x0e000a40 + jmp SIMD_FLOAT_vd_vn_vmx_f32 +ARM_instruction_vmls.f64 = ARM_instruction_fnmacd +ARM_instruction_vmls.i16: + mov edx,0xf3100900 + jmp SIMD_INT_vd_vn_vmx +ARM_instruction_vmls.i32: + mov edx,0xf3200900 + jmp SIMD_INT_vd_vn_vmx +ARM_instruction_vmls.i8: + mov edx,0xf3000900 + jmp SIMD_INT_vd_vn_vm +ARM_instruction_vmls.s16 = ARM_instruction_vmls.i16 +ARM_instruction_vmls.s32 = ARM_instruction_vmls.i32 +ARM_instruction_vmls.s8 = ARM_instruction_vmls.i8 +ARM_instruction_vmls.u16 = ARM_instruction_vmls.i16 +ARM_instruction_vmls.u32 = ARM_instruction_vmls.i32 +ARM_instruction_vmls.u8 = ARM_instruction_vmls.i8 +ARM_instruction_vmlsl.s16: + mov edx,0xf2900a00 + mov ecx,0xf2900640 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlsl.s32: + mov edx,0xf2a00a00 + mov ecx,0xf2a00640 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlsl.s8: + mov edx,0xf2800a00 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmlsl.u16: + mov edx,0xf3900a00 + mov ecx,0xf3900640 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlsl.u32: + mov edx,0xf3a00a00 + mov ecx,0xf3a00640 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmlsl.u8: + mov edx,0xf3800a00 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmov.16: + mov edx,0x0e000b30 + jmp SIMD_INT_ddx_rn +ARM_instruction_vmov.32: + mov edx,0x0e000b10 + jmp SIMD_INT_rdd_rdn +ARM_instruction_vmov.8: + mov edx,0x0e400b10 + jmp SIMD_INT_ddx_rn +ARM_instruction_vmov.f32: + mov edx,0x0eb00a00 ;FCONSTS + mov ecx,0xf2800f10 + jmp SIMD_FLOAT_sm_imm +ARM_instruction_vmov.f64: + mov edx,0x0eb00b00 ;FCONSTD + jmp SIMD_FLOAT_dm_imm +ARM_instruction_vmov.i16: + mov edx,0xf2800810 + jmp SIMD_INT_vd_imm_i16 +ARM_instruction_vmov.i32: + mov edx,0xf2800010 + jmp SIMD_INT_vd_imm_i32 +ARM_instruction_vmov.i64: + mov edx,0xf2800e30 + jmp SIMD_INT_vd_imm_i8 +ARM_instruction_vmov.i8: + mov edx,0xf2800e10 + jmp SIMD_INT_vd_imm_i8 +ARM_instruction_vmov.s16: + mov edx,0x0e100b30 + jmp SIMD_INT_rd_dnx +ARM_instruction_vmov.s8: + mov edx,0x0e500b10 + jmp SIMD_INT_rd_dnx +ARM_instruction_vmov.u16: + mov edx,0x0e900b30 + jmp SIMD_INT_rd_dnx +ARM_instruction_vmov.u8: + mov edx,0x0ed00b10 + jmp SIMD_INT_rd_dnx +ARM_instruction_vmov: + jmp SIMD_INT_MOV +ARM_instruction_vmovl.s16: + mov edx,0xf2900a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovl.s32: + mov edx,0xf2a00a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovl.s8: + mov edx,0xf2880a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovl.u16: + mov edx,0xf3900a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovl.u32: + mov edx,0xf3a00a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovl.u8: + mov edx,0xf3880a10 + jmp SIMD_INT_qd_dm +ARM_instruction_vmovn.i16: + mov edx,0xf3b60200 + jmp SIMD_INT_dd_qm +ARM_instruction_vmovn.i32: + mov edx,0xf3ba0200 + jmp SIMD_INT_dd_qm +ARM_instruction_vmovn.i8: + mov edx,0xf3b20200 + jmp SIMD_INT_dd_qm +ARM_instruction_vmrs = ARM_instruction_fmrx +ARM_instruction_vmsr = ARM_instruction_fmxr +ARM_instruction_vmul.f32: + mov edx,0xf3000d10 + mov ecx,0x0e200a00 + jmp SIMD_FLOAT_vd_vn_vmx_alt_f32 +ARM_instruction_vmul.f64 = ARM_instruction_fmuld +ARM_instruction_vmul.i16: + mov edx,0xf2100910 + mov ecx,0xf2900840 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vmul.i32: + mov edx,0xf2200910 + mov ecx,0xf2a00840 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vmul.i8: + mov edx,0xf2000910 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmul.p8: + mov edx,0xf3000910 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmul.s16: + mov edx,0xf2100910 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmul.s32: + mov edx,0xf2200910 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vmul.s8 = ARM_instruction_vmul.i8 +ARM_instruction_vmul.u16 = ARM_instruction_vmul.s16 +ARM_instruction_vmul.u32 = ARM_instruction_vmul.s32 +ARM_instruction_vmul.u8 = ARM_instruction_vmul.i8 +ARM_instruction_vmull.p8: + mov edx,0xf2800e00 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmull.s16: + mov edx,0xf2900c00 + mov ecx,0xf2900a40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmull.s32: + mov edx,0xf2a00c00 + mov ecx,0xf2a00a40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmull.s8: + mov edx,0xf2800c00 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmull.u16: + mov edx,0xf3900c00 + mov ecx,0xf3900a40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmull.u32: + mov edx,0xf3a00c00 + mov ecx,0xf3a00a40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vmull.u8: + mov edx,0xf3800c00 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vmvn.i16: + mov edx,0xf2800830 + jmp SIMD_INT_vd_imm_i16 +ARM_instruction_vmvn.i32: + mov edx,0xf2800030 + jmp SIMD_INT_vd_imm_i32 +ARM_instruction_vmvn: + mov edx,0xf3b00580 + jmp SIMD_INT_vd_vm +ARM_instruction_vneg.f32: + mov edx,0xf3b90780 + mov ecx,0x0eb10a40 + jmp SIMD_FLOAT_vd_vm_f32 +ARM_instruction_vneg.f64 = ARM_instruction_fnegd +ARM_instruction_vneg.s16: + mov edx,0xf3b50380 + jmp SIMD_INT_vd_vm +ARM_instruction_vneg.s32: + mov edx,0xf3b90380 + jmp SIMD_INT_vd_vm +ARM_instruction_vneg.s8: + mov edx,0xf3b10380 + jmp SIMD_INT_vd_vm +ARM_instruction_vnmla.f32 = ARM_instruction_fnmscs +ARM_instruction_vnmla.f64 = ARM_instruction_fnmscd +ARM_instruction_vnmls.f32 = ARM_instruction_fmscs +ARM_instruction_vnmls.f64 = ARM_instruction_fmscd +ARM_instruction_vnmul.f32 = ARM_instruction_fnmuls +ARM_instruction_vnmul.f64 = ARM_instruction_fnmuld +ARM_instruction_vorn.i16: + mov edx,0xf2800911 + jmp SIMD_INT_vd_imm +ARM_instruction_vorn.i32: + mov edx,0xf2800111 + jmp SIMD_INT_vd_imm +ARM_instruction_vorn: + mov edx,0xf2300110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vorr.i16: + mov edx,0xf2800910 + jmp SIMD_INT_vd_imm +ARM_instruction_vorr.i32: + mov edx,0xf2800110 + jmp SIMD_INT_vd_imm +ARM_instruction_vorr: + mov edx,0xf2200110 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vpadal.s16: + mov edx,0xf3b40600 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadal.s32: + mov edx,0xf3b80600 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadal.s8: + mov edx,0xf3b00600 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadal.u16: + mov edx,0xf3b40680 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadal.u32: + mov edx,0xf3b80680 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadal.u8: + mov edx,0xf3b00680 + jmp SIMD_INT_vd_vm +ARM_instruction_vpadd.f32: + mov edx,0xf3000d00 + jmp SIMD_FLOAT_dd_dn_dm_alt +ARM_instruction_vpadd.i16: + mov edx,0xf2100b10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpadd.i32: + mov edx,0xf2200b10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpadd.i8: + mov edx,0xf2000b10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpaddl.s16: + mov edx,0xf3b40200 + jmp SIMD_INT_vd_vm +ARM_instruction_vpaddl.s32: + mov edx,0xf3b80200 + jmp SIMD_INT_vd_vm +ARM_instruction_vpaddl.s8: + mov edx,0xf3b00200 + jmp SIMD_INT_vd_vm +ARM_instruction_vpaddl.u16: + mov edx,0xf3b40280 + jmp SIMD_INT_vd_vm +ARM_instruction_vpaddl.u32: + mov edx,0xf3b80280 + jmp SIMD_INT_vd_vm +ARM_instruction_vpaddl.u8: + mov edx,0xf3b00280 + jmp SIMD_INT_vd_vm +ARM_instruction_vpmax.f32: + mov edx,0xf3000f00 + jmp SIMD_FLOAT_dd_dn_dm_alt +ARM_instruction_vpmax.s16: + mov edx,0xf2100a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmax.s32: + mov edx,0xf2200a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmax.s8: + mov edx,0xf2000a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmax.u16: + mov edx,0xf3100a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmax.u32: + mov edx,0xf3200a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmax.u8: + mov edx,0xf3000a00 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.f32: + mov edx,0xf3200f00 + jmp SIMD_FLOAT_dd_dn_dm_alt +ARM_instruction_vpmin.s16: + mov edx,0xf2100a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.s32: + mov edx,0xf2200a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.s8: + mov edx,0xf2000a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.u16: + mov edx,0xf3100a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.u32: + mov edx,0xf3200a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpmin.u8: + mov edx,0xf3000a10 + jmp SIMD_INT_dd_dn_dm_alt +ARM_instruction_vpop: + mov edx,0x0c900a00 + jmp SIMD_INT_list +ARM_instruction_vpush: + mov edx,0x0d000a00 + jmp SIMD_INT_list +ARM_instruction_vpop.32: + mov edx,0x0c900a00 + jmp SIMD_INT_list.32 +ARM_instruction_vpush.32: + mov edx,0x0d000a00 + jmp SIMD_INT_list.32 +ARM_instruction_vpop.64: + mov edx,0x0c900b00 + jmp SIMD_INT_list.64 +ARM_instruction_vpush.64: + mov edx,0x0d000b00 + jmp SIMD_INT_list.64 +ARM_instruction_vqabs.s16: + mov edx,0xf3b40700 + jmp SIMD_INT_vd_vm +ARM_instruction_vqabs.s32: + mov edx,0xf3b80700 + jmp SIMD_INT_vd_vm +ARM_instruction_vqabs.s8: + mov edx,0xf3b00700 + jmp SIMD_INT_vd_vm +ARM_instruction_vqadd.s16: + mov edx,0xf2100010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.s32: + mov edx,0xf2200010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.s64: + mov edx,0xf2300010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.s8: + mov edx,0xf2000010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.u16: + mov edx,0xf3100010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.u32: + mov edx,0xf3200010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.u64: + mov edx,0xf3300010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqadd.u8: + mov edx,0xf3000010 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqdmlal.s16: + mov edx,0xf2900900 + mov ecx,0xf2900340 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqdmlal.s32: + mov edx,0xf2a00900 + mov ecx,0xf2a00340 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqdmlsl.s16: + mov edx,0xf2900b00 + mov ecx,0xf2900740 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqdmlsl.s32: + mov edx,0xf2a00b00 + mov ecx,0xf2a00740 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqdmulh.s16: + mov edx,0xf2100b00 + mov ecx,0xf2900c40 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vqdmulh.s32: + mov edx,0xf2200b00 + mov ecx,0xf2a00c40 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vqdmull.s16: + mov edx,0xf2900d00 + mov ecx,0xf2900b40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqdmull.s32: + mov edx,0xf2a00d00 + mov ecx,0xf2a00b40 + jmp SIMD_INT_vd_vn_vmx_long +ARM_instruction_vqmovn.s16: + mov edx,0xf3b20280 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovn.s32: + mov edx,0xf3b60280 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovn.s64: + mov edx,0xf3ba0280 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovn.u16: + mov edx,0xf3b202c0 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovn.u32: + mov edx,0xf3b602c0 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovn.u64: + mov edx,0xf3ba02c0 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovun.s16: + mov edx,0xf3b20240 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovun.s32: + mov edx,0xf3b60240 + jmp SIMD_INT_dd_qm +ARM_instruction_vqmovun.s64: + mov edx,0xf3ba0240 + jmp SIMD_INT_dd_qm +ARM_instruction_vqneg.s16: + mov edx,0xf3b40780 + jmp SIMD_INT_vd_vm +ARM_instruction_vqneg.s32: + mov edx,0xf3b80780 + jmp SIMD_INT_vd_vm +ARM_instruction_vqneg.s8: + mov edx,0xf3b00780 + jmp SIMD_INT_vd_vm +ARM_instruction_vqrdmulh.s16: + mov edx,0xf3100b00 + mov ecx,0xf2900d40 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vqrdmulh.s32: + mov edx,0xf3200b00 + mov ecx,0xf2a00d40 + jmp SIMD_INT_vd_vn_vmx_alt +ARM_instruction_vqrshl.s16: + mov edx,0xf2100510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.s32: + mov edx,0xf2200510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.s64: + mov edx,0xf2300510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.s8: + mov edx,0xf2000510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.u16: + mov edx,0xf3100510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.u32: + mov edx,0xf3200510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.u64: + mov edx,0xf3300510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshl.u8: + mov edx,0xf3000510 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqrshrn.s16: + mov edx,0xf2880950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrn.s32: + mov edx,0xf2900950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrn.s64: + mov edx,0xf2a00950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrn.u16: + mov edx,0xf3880950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrn.u32: + mov edx,0xf3900950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrn.u64: + mov edx,0xf3a00950 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrun.s16: + mov edx,0xf3880850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrun.s32: + mov edx,0xf3900850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqrshrun.s64: + mov edx,0xf3a00850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshl.s16: + mov edx,0xf2100410 + mov ecx,0xf2900710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.s32: + mov edx,0xf2200410 + mov ecx,0xf2a00710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.s64: + mov edx,0xf2300410 + mov ecx,0xf2800790 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.s8: + mov edx,0xf2000410 + mov ecx,0xf2880710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.u16: + mov edx,0xf3100410 + mov ecx,0xf3900710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.u32: + mov edx,0xf3200410 + mov ecx,0xf3a00710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.u64: + mov edx,0xf3300410 + mov ecx,0xf3800790 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshl.u8: + mov edx,0xf3000410 + mov ecx,0xf3880710 + jmp SIMD_INT_vd_vn_vm_imm_alt +ARM_instruction_vqshlu.s16: + mov edx,0xf3900610 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vqshlu.s32: + mov edx,0xf3a00610 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vqshlu.s64: + mov edx,0xf3800690 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vqshlu.s8: + mov edx,0xf3880610 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vqshrn.s16: + mov edx,0xf2880910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrn.s32: + mov edx,0xf2900910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrn.s64: + mov edx,0xf2a00910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrn.u16: + mov edx,0xf3880910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrn.u32: + mov edx,0xf3900910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrn.u64: + mov edx,0xf3a00910 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrun.s16: + mov edx,0xf3880810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrun.s32: + mov edx,0xf3900810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqshrun.s64: + mov edx,0xf3a00810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vqsub.s16: + mov edx,0xf2100210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.s32: + mov edx,0xf2200210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.s64: + mov edx,0xf2300210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.s8: + mov edx,0xf2000210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.u16: + mov edx,0xf3100210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.u32: + mov edx,0xf3200210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.u64: + mov edx,0xf3300210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vqsub.u8: + mov edx,0xf3000210 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vraddhn.i16: + mov edx,0xf3800400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vraddhn.i32: + mov edx,0xf3900400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vraddhn.i64: + mov edx,0xf3a00400 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vrecpe.f32: + mov edx,0xf3bb0500 + jmp SIMD_FLOAT_vd_vm +ARM_instruction_vrecpe.u32: + mov edx,0xf3bb0400 + jmp SIMD_INT_vd_vm +ARM_instruction_vrecps.f32: + mov edx,0xf2000f10 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vrev16.8: + mov edx,0xf3b00100 + jmp SIMD_INT_vd_vm +ARM_instruction_vrev32.16: + mov edx,0xf3b40080 + jmp SIMD_INT_vd_vm +ARM_instruction_vrev32.8: + mov edx,0xf3b00080 + jmp SIMD_INT_vd_vm +ARM_instruction_vrev64.16: + mov edx,0xf3b40000 + jmp SIMD_INT_vd_vm +ARM_instruction_vrev64.32: + mov edx,0xf3b80000 + jmp SIMD_INT_vd_vm +ARM_instruction_vrev64.8: + mov edx,0xf3b00000 + jmp SIMD_INT_vd_vm +ARM_instruction_vrhadd.s16: + mov edx,0xf2100100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrhadd.s32: + mov edx,0xf2200100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrhadd.s8: + mov edx,0xf2000100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrhadd.u16: + mov edx,0xf3100100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrhadd.u32: + mov edx,0xf3200100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrhadd.u8: + mov edx,0xf3000100 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.s16: + mov edx,0xf2100500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.s32: + mov edx,0xf2200500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.s64: + mov edx,0xf2300500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.s8: + mov edx,0xf2000500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.u16: + mov edx,0xf3100500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.u32: + mov edx,0xf3200500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.u64: + mov edx,0xf3300500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshl.u8: + mov edx,0xf3000500 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vrshr.s16: + mov edx,0xf2900210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.s32: + mov edx,0xf2a00210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.s64: + mov edx,0xf2800290 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.s8: + mov edx,0xf2880210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.u16: + mov edx,0xf3900210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.u32: + mov edx,0xf3a00210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.u64: + mov edx,0xf3800290 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshr.u8: + mov edx,0xf3880210 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrshrn.i16: + mov edx,0xf2880850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vrshrn.i32: + mov edx,0xf2900850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vrshrn.i64: + mov edx,0xf2a00850 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vrsqrte.f32: + mov edx,0xf3bb0580 + jmp SIMD_FLOAT_vd_vm +ARM_instruction_vrsqrte.u32: + mov edx,0xf3bb0480 + jmp SIMD_INT_vd_vm +ARM_instruction_vrsqrts.f32: + mov edx,0xf2200f10 + jmp SIMD_FLOAT_vd_vn_vm_alt +ARM_instruction_vrsra.s16: + mov edx,0xf2900310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.s32: + mov edx,0xf2a00310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.s64: + mov edx,0xf2800390 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.s8: + mov edx,0xf2880310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.u16: + mov edx,0xf3900310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.u32: + mov edx,0xf3a00310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.u64: + mov edx,0xf3800390 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsra.u8: + mov edx,0xf3880310 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vrsubhn.i16: + mov edx,0xf3800600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vrsubhn.i32: + mov edx,0xf3900600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vrsubhn.i64: + mov edx,0xf3a00600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vshl.i16: + mov edx,0xf2900510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vshl.i32: + mov edx,0xf2a00510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vshl.i64: + mov edx,0xf2800590 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vshl.i8: + mov edx,0xf2880510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vshl.s16: + mov edx,0xf2100400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.s32: + mov edx,0xf2200400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.s64: + mov edx,0xf2300400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.s8: + mov edx,0xf2000400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.u16: + mov edx,0xf3100400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.u32: + mov edx,0xf3200400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.u64: + mov edx,0xf3300400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshl.u8: + mov edx,0xf3000400 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vshll.i16: + mov edx,0xf3b60300 + jmp SIMD_INT_qd_dm_imm_I +ARM_instruction_vshll.i32: + mov edx,0xf3ba0300 + jmp SIMD_INT_qd_dm_imm_I +ARM_instruction_vshll.i8: + mov edx,0xf3b20300 + jmp SIMD_INT_qd_dm_imm_I +ARM_instruction_vshll.s16: + mov edx,0xf2900a10 + mov ecx,0xf3b60300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshll.s32: + mov edx,0xf2a00a10 + mov ecx,0xf3ba0300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshll.s8: + mov edx,0xf2880a10 + mov ecx,0xf3b20300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshll.u16: + mov edx,0xf3900a10 + mov ecx,0xf3b60300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshll.u32: + mov edx,0xf3a00a10 + mov ecx,0xf3ba0300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshll.u8: + mov edx,0xf3880a10 + mov ecx,0xf3b20300 + jmp SIMD_INT_qd_dm_imm +ARM_instruction_vshr.s16: + mov edx,0xf2900010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.s32: + mov edx,0xf2a00010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.s64: + mov edx,0xf2800090 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.s8: + mov edx,0xf2880010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.u16: + mov edx,0xf3900010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.u32: + mov edx,0xf3a00010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.u64: + mov edx,0xf3800090 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshr.u8: + mov edx,0xf3880010 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vshrn.i16: + mov edx,0xf2880810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vshrn.i32: + mov edx,0xf2900810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vshrn.i64: + mov edx,0xf2a00810 + jmp SIMD_INT_dd_qm_imm +ARM_instruction_vsli.16: + mov edx,0xf3900510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vsli.32: + mov edx,0xf3a00510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vsli.64: + mov edx,0xf3800590 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vsli.8: + mov edx,0xf3880510 + jmp SIMD_INT_vd_vm_imm_alt +ARM_instruction_vsqrt.f32 = ARM_instruction_fsqrts +ARM_instruction_vsqrt.f64 = ARM_instruction_fsqrtd +ARM_instruction_vsra.s16: + mov edx,0xf2900110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.s32: + mov edx,0xf2a00110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.s64: + mov edx,0xf2800190 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.s8: + mov edx,0xf2880110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.u16: + mov edx,0xf3900110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.u32: + mov edx,0xf3a00110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.u64: + mov edx,0xf3800190 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsra.u8: + mov edx,0xf3880110 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsri.16: + mov edx,0xf3900410 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsri.32: + mov edx,0xf3a00410 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsri.64: + mov edx,0xf3800490 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vsri.8: + mov edx,0xf3880410 + jmp SIMD_INT_vd_vm_imm_alt_neg +ARM_instruction_vst1.16: + mov edx,0xf4000040 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vst1.32: + mov edx,0xf4000080 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vst1.64: + mov edx,0xf40000c0 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vst1.8: + mov edx,0xf4000000 + jmp SIMD_INT_list_rn_rm_1 +ARM_instruction_vst2.16: + mov edx,0xf4000040 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vst2.32: + mov edx,0xf4000080 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vst2.8: + mov edx,0xf4000000 + jmp SIMD_INT_list_rn_rm_2 +ARM_instruction_vst3.16: + mov edx,0xf4000040 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vst3.32: + mov edx,0xf4000080 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vst3.8: + mov edx,0xf4000000 + jmp SIMD_INT_list_rn_rm_3 +ARM_instruction_vst4.16: + mov edx,0xf4000040 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vst4.32: + mov edx,0xf4000080 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vst4.8: + mov edx,0xf4000000 + jmp SIMD_INT_list_rn_rm_4 +ARM_instruction_vstm.32 = ARM_instruction_fstmias +ARM_instruction_vstm.64 = ARM_instruction_fstmiad +ARM_instruction_vstmdb.32 = ARM_instruction_fstmdbs +ARM_instruction_vstmdb.64 = ARM_instruction_fstmdbd +ARM_instruction_vstmfd.32 = ARM_instruction_fstmfds +ARM_instruction_vstmfd.64 = ARM_instruction_fstmfdd +ARM_instruction_vstmea.32 = ARM_instruction_fstmeas +ARM_instruction_vstmea.64 = ARM_instruction_fstmead +ARM_instruction_vstmia.32 = ARM_instruction_fstmias +ARM_instruction_vstmia.64 = ARM_instruction_fstmiad +ARM_instruction_vstmfd: +ARM_instruction_vstmdb: + mov edx,0xd000a00 + jmp SIMD_INT_rn_list +ARM_instruction_vstm: +ARM_instruction_vstmea: +ARM_instruction_vstmia: + mov edx,0xc800a00 + jmp SIMD_INT_rn_list +ARM_instruction_vstr.32 = ARM_instruction_fsts +ARM_instruction_vstr.64 = ARM_instruction_fstd +ARM_instruction_vstr: + mov edx,0x0d000a00 + jmp SIMD_INT_vd_rn_offset +ARM_instruction_vsub.f32: + mov edx,0xf2200d00 + mov ecx,0x0e300a40 + jmp SIMD_FLOAT_vd_vn_vm_f32 +ARM_instruction_vsub.f64 = ARM_instruction_fsubd +ARM_instruction_vsub.i16: + mov edx,0xf3100800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vsub.i32: + mov edx,0xf3200800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vsub.i64: + mov edx,0xf3300800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vsub.i8: + mov edx,0xf3000800 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vsubhn.i16: + mov edx,0xf2800600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vsubhn.i32: + mov edx,0xf2900600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vsubhn.i64: + mov edx,0xf2a00600 + jmp SIMD_INT_vd_vn_vm_narrow +ARM_instruction_vsubl.s16: + mov edx,0xf2900200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubl.s32: + mov edx,0xf2a00200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubl.s8: + mov edx,0xf2800200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubl.u16: + mov edx,0xf3900200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubl.u32: + mov edx,0xf3a00200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubl.u8: + mov edx,0xf3800200 + jmp SIMD_INT_vd_vn_vm_long +ARM_instruction_vsubw.s16: + mov edx,0xf2900300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vsubw.s32: + mov edx,0xf2a00300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vsubw.s8: + mov edx,0xf2800300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vsubw.u16: + mov edx,0xf3900300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vsubw.u32: + mov edx,0xf3a00300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vsubw.u8: + mov edx,0xf3800300 + jmp SIMD_INT_vd_vn_vm_wide +ARM_instruction_vswp: + mov edx,0xf3b20000 + jmp SIMD_INT_vd_vm +ARM_instruction_vtbl.8: + mov edx,0xf3b00800 + jmp SIMD_dn_list_dm +ARM_instruction_vtbx.8: + mov edx,0xf3b00840 + jmp SIMD_dn_list_dm +ARM_instruction_vtrn.16: + mov edx,0xf3b60080 + jmp SIMD_INT_vd_vm +ARM_instruction_vtrn.32: + mov edx,0xf3ba0080 + jmp SIMD_INT_vd_vm +ARM_instruction_vtrn.8: + mov edx,0xf3b20080 + jmp SIMD_INT_vd_vm +ARM_instruction_vtst.16: + mov edx,0xf2100810 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vtst.32: + mov edx,0xf2200810 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vtst.8: + mov edx,0xf2000810 + jmp SIMD_INT_vd_vn_vm_alt +ARM_instruction_vuzp.16: + mov edx,0xf3b60100 + jmp SIMD_INT_vd_vm +ARM_instruction_vuzp.32: + mov edx,0xf3ba0100 + jmp SIMD_INT_vd_vm +ARM_instruction_vuzp.8: + mov edx,0xf3b20100 + jmp SIMD_INT_vd_vm +ARM_instruction_vzip.16: + mov edx,0xf3b60180 + jmp SIMD_INT_vd_vm +ARM_instruction_vzip.32: + mov edx,0xf3ba0180 + jmp SIMD_INT_vd_vm +ARM_instruction_vzip.8: + mov edx,0xf3b20180 + jmp SIMD_INT_vd_vm + +;VFPv4 and SIMDv2 + +ARM_instruction_vfma.f32: + mov edx,0xf2000c10 + mov ecx,0x0ea00a00 + jmp SIMD_FLOAT_vd_vn_vm +ARM_instruction_vfms.f32: + mov edx,0xf2200c10 + mov ecx,0x0ea00a40 + jmp SIMD_FLOAT_vd_vn_vm +ARM_instruction_vfma.f64: + mov ecx,0x0ea00b00 + jmp SIMD_FLOAT_dd_dn_dm +ARM_instruction_vfms.f64: + mov ecx,0x0ea00b40 + jmp SIMD_FLOAT_dd_dn_dm +ARM_instruction_vfnma.f32: + mov ecx,0x0e900a40 + jmp SIMD_FLOAT_sd_sn_sm +ARM_instruction_vfnms.f32: + mov ecx,0x0e900a00 + jmp SIMD_FLOAT_sd_sn_sm +ARM_instruction_vfnma.f64: + mov ecx,0x0e900b40 + jmp SIMD_FLOAT_dd_dn_dm +ARM_instruction_vfnms.f64: + mov ecx,0x0e900b00 + jmp SIMD_FLOAT_dd_dn_dm + +;v7VE + +ARM_instruction_eret: + INST_ARM64 + dd 0xd69f03e0 + dd ARM64_debug3 + mov edx,0x0160006e + mov ecx,0xf3de8f00 + jmp ARM_eret +ARM_instruction_hvc: + INST_ARM64 + dd 0xd4000002 + dd ARM64_debug + mov edx,0x01400070 + mov ecx,0xf7e08000 + jmp ARM_immediate16_ve + +;v8 + +ARM_instruction_hlt: + INST_ARM64 + dd 0xd4400000 + dd ARM64_debug + mov edx,0x01000070 + jmp ARM_immediate16_v8 +ARM_instruction_lda: + mov [operand_size],4 + mov edx,0x01900c9f + mov ecx,0xe8d00faf + jmp ARM_rd_q_rn_p +ARM_instruction_ldab: + mov [operand_size],1 + mov edx,0x01d00c9f + mov ecx,0xe8d00f8f + jmp ARM_rd_q_rn_p +ARM_instruction_ldah: + mov [operand_size],2 + mov edx,0x01f00c9f + mov ecx,0xe8d00f9f + jmp ARM_rd_q_rn_p +ARM_instruction_ldaex: + mov [operand_size],4 + mov edx,0x01900e9f + mov ecx,0xe8d00fef + jmp ARM_rd_q_rn_p +ARM_instruction_ldaexb: + mov [operand_size],1 + mov edx,0x01d00e9f + mov ecx,0xe8d00fcf + jmp ARM_rd_q_rn_p +ARM_instruction_ldaexh: + mov [operand_size],2 + mov edx,0x01f00e9f + mov ecx,0xe8d00fdf + jmp ARM_rd_q_rn_p +ARM_instruction_ldaexd: + mov [operand_size],8 + mov edx,0x01b00e9f + mov ecx,0xe8d000ff + jmp ARM_rt_rt2_q_rn_p +ARM_instruction_sevl: + INST_ARM64 + dd 0xd50320bf + dd ARM64_debug3 + mov edx,0x0320f005 + mov ecx,0xf3af8005 + jmp ARM_nops +ARM_instruction_stl: + mov [operand_size],4 + mov edx,0x0180fc90 + mov ecx,0xe8c00faf + jmp ARM_rt_q_rn_p +ARM_instruction_stlb: + mov [operand_size],1 + mov edx,0x01c0fc90 + mov ecx,0xe8c00f8f + jmp ARM_rt_q_rn_p +ARM_instruction_stlh: + mov [operand_size],1 + mov edx,0x01e0fc90 + mov ecx,0xe8c00f9f + jmp ARM_rt_q_rn_p +ARM_instruction_stlex: + mov [operand_size],4 + mov edx,0x01800e90 + mov ecx,0xe8c00fe0 + jmp ARM_rd_rt_q_rn_p_STLEX +ARM_instruction_stlexb: + mov [operand_size],1 + mov edx,0x01c00e90 + mov ecx,0xe8c00fc0 + jmp ARM_rd_rt_q_rn_p_STLEX +ARM_instruction_stlexh: + mov [operand_size],2 + mov edx,0x01e00e90 + mov ecx,0xe8c00fd0 + jmp ARM_rd_rt_q_rn_p_STLEX +ARM_instruction_stlexd: + mov [operand_size],8 + mov edx,0x01a00e90 + mov ecx,0xe8c000f0 + jmp ARM_rd_rt_rt2_q_rn_p_STLEXD +ARM_instruction_dcps1: + INST_ARM64 + dd 0xd4a00001 + dd ARM64_debug2 + mov ecx,0xf78f8001 + jmp THUMB_v8 +ARM_instruction_dcps2: + INST_ARM64 + dd 0xd4a00002 + dd ARM64_debug2 + mov ecx,0xf78f8002 + jmp THUMB_v8 +ARM_instruction_dcps3: + INST_ARM64 + dd 0xd4a00003 + dd ARM64_debug2 + mov ecx,0xf78f8003 + jmp THUMB_v8 + +;v8 VFP/SIMD +ARM_instruction_vcvtm.s32.f32: + mov edx,0xfebf0ac0 + mov ecx,0xf3bb0300 + jmp SIMD_sd_sm +ARM_instruction_vcvtm.u32.f32: + mov edx,0xfebf0a40 + mov ecx,0xf3bb0380 + jmp SIMD_sd_sm +ARM_instruction_vcvtm.s32.f64: + mov edx,0xfebf0bc0 + jmp SIMD_sd_dm +ARM_instruction_vcvtm.u32.f64: + mov edx,0xfebf0b40 + jmp SIMD_sd_dm +ARM_instruction_vcvtp.s32.f32: + mov edx,0xfebe0ac0 + mov ecx,0xf3bb0200 + jmp SIMD_sd_sm +ARM_instruction_vcvtp.u32.f32: + mov edx,0xfebe0a40 + mov ecx,0xf3bb0280 + jmp SIMD_sd_sm +ARM_instruction_vcvtp.s32.f64: + mov edx,0xfebe0bc0 + jmp SIMD_sd_dm +ARM_instruction_vcvtp.u32.f64: + mov edx,0xfebe0b40 + jmp SIMD_sd_dm +ARM_instruction_vcvtn.s32.f32: + mov edx,0xfebd0ac0 + mov ecx,0xf3bb0100 + jmp SIMD_sd_sm +ARM_instruction_vcvtn.u32.f32: + mov edx,0xfebd0a40 + mov ecx,0xf3bb0180 + jmp SIMD_sd_sm +ARM_instruction_vcvtn.s32.f64: + mov edx,0xfebd0bc0 + jmp SIMD_sd_dm +ARM_instruction_vcvtn.u32.f64: + mov edx,0xfebd0b40 + jmp SIMD_sd_dm +ARM_instruction_vcvta.s32.f32: + mov edx,0xfebc0ac0 + mov ecx,0xf3bb0000 + jmp SIMD_sd_sm +ARM_instruction_vcvta.u32.f32: + mov edx,0xfebc0a40 + mov ecx,0xf3bb0080 + jmp SIMD_sd_sm +ARM_instruction_vcvta.s32.f64: + mov edx,0xfebc0bc0 + jmp SIMD_sd_dm +ARM_instruction_vcvta.u32.f64: + mov edx,0xfebc0b40 + jmp SIMD_sd_dm +ARM_instruction_vcvtb.f16.f64: + mov edx,0x0eb30b40 + jmp VFP_sd_dm_HP +ARM_instruction_vcvtb.f64.f16: + mov edx,0x0eb20b40 + jmp VFP_dd_sm_HP +ARM_instruction_vcvtt.f16.f64: + mov edx,0x0eb30bc0 + jmp VFP_sd_dm_HP +ARM_instruction_vcvtt.f64.f16: + mov edx,0x0eb20bc0 + jmp VFP_dd_sm_HP +ARM_instruction_vmaxnm.f32: + mov edx,0xfe800a00 + mov ecx,0xf3000f10 + jmp SIMD_FLOAT_vd_vn_vm_v8 +ARM_instruction_vmaxnm.f64: + mov ecx,0xfe800b00 + jmp SIMD_FLOAT_dd_dn_dm_v8 +ARM_instruction_vminnm.f32: + mov edx,0xfe800a40 + mov ecx,0xf3200f10 + jmp SIMD_FLOAT_vd_vn_vm_v8 +ARM_instruction_vminnm.f64: + mov ecx,0xfe800b40 + jmp SIMD_FLOAT_dd_dn_dm_v8 +ARM_instruction_vrintm.f32.f32: + mov edx,0xfebb0a40 + mov ecx,0xf3ba0680 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrintm.f64.f64: + mov edx,0xfebb0b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrintp.f32.f32: + mov edx,0xfeba0a40 + mov ecx,0xf3ba0780 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrintp.f64.f64: + mov edx,0xfeba0b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrintn.f32.f32: + mov edx,0xfeb90a40 + mov ecx,0xf3ba0400 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrintn.f64.f64: + mov edx,0xfeb90b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrinta.f32.f32: + mov edx,0xfeb80a40 + mov ecx,0xf3ba0500 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrinta.f64.f64: + mov edx,0xfeb80b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrintx.f32.f32: + mov edx,0x0eb70a40 + mov ecx,0xf3ba0480 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrintx.f64.f64: + mov edx,0x0eb70b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrintr.f32.f32: + mov edx,0x0eb60a40 + jmp SIMD_FLOAT_sd_sn_v8 +ARM_instruction_vrintr.f64.f64: + mov edx,0x0eb60b40 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vrintz.f32.f32: + mov edx,0x0eb60ac0 + mov ecx,0xf3ba0580 + jmp SIMD_FLOAT_vd_vn_v8 +ARM_instruction_vrintz.f64.f64: + mov edx,0x0eb60bc0 + jmp SIMD_FLOAT_dd_dn_v8 +ARM_instruction_vseleq.f32: + mov ecx,0xfe000a00 + jmp SIMD_FLOAT_sd_sn_sm_v8 +ARM_instruction_vseleq.f64: + mov ecx,0xfe000b00 + jmp SIMD_FLOAT_dd_dn_dm_v8 +ARM_instruction_vselvs.f32: + mov ecx,0xfe100a00 + jmp SIMD_FLOAT_sd_sn_sm_v8 +ARM_instruction_vselvs.f64: + mov ecx,0xfe100b00 + jmp SIMD_FLOAT_dd_dn_dm_v8 +ARM_instruction_vselge.f32: + mov ecx,0xfe200a00 + jmp SIMD_FLOAT_sd_sn_sm_v8 +ARM_instruction_vselge.f64: + mov ecx,0xfe200b00 + jmp SIMD_FLOAT_dd_dn_dm_v8 +ARM_instruction_vselgt.f32: + mov ecx,0xfe300a00 + jmp SIMD_FLOAT_sd_sn_sm_v8 +ARM_instruction_vselgt.f64: + mov ecx,0xfe300b00 + jmp SIMD_FLOAT_dd_dn_dm_v8 + +;v8 CRC +ARM_instruction_crc32b: + INST_ARM64 + dd 0x1ac04000 + dd ARM64_wz_wz_wz + mov edx,0xe1000040 + mov ecx,0xfac0f080 + jmp ARM_rd_rn_rm_crc +ARM_instruction_crc32h: + INST_ARM64 + dd 0x1ac04400 + dd ARM64_wz_wz_wz + mov edx,0xe1200040 + mov ecx,0xfac0f090 + jmp ARM_rd_rn_rm_crc +ARM_instruction_crc32w: + INST_ARM64 + dd 0x1ac04800 + dd ARM64_wz_wz_wz + mov edx,0xe1400040 + mov ecx,0xfac0f0a0 + jmp ARM_rd_rn_rm_crc +ARM_instruction_crc32cb: + INST_ARM64 + dd 0x1ac05000 + dd ARM64_wz_wz_wz + mov edx,0xe1000240 + mov ecx,0xfad0f080 + jmp ARM_rd_rn_rm_crc +ARM_instruction_crc32ch: + INST_ARM64 + dd 0x1ac05400 + dd ARM64_wz_wz_wz + mov edx,0xe1200240 + mov ecx,0xfad0f090 + jmp ARM_rd_rn_rm_crc +ARM_instruction_crc32cw: + INST_ARM64 + dd 0x1ac05800 + dd ARM64_wz_wz_wz + mov edx,0xe1400240 + mov ecx,0xfad0f0a0 + jmp ARM_rd_rn_rm_crc + +;v8 crypto +ARM_instruction_aesd.8: + mov edx,0xf3b00340 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_aese.8: + mov edx,0xf3b00300 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_aesimc.8: + mov edx,0xf3b003c0 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_aesmc.8: + mov edx,0xf3b00380 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_sha1h.32: + mov edx,0xf3b902c0 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_sha1su1.32: + mov edx,0xf3ba0380 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_sha256su0.32: + mov edx,0xf3ba03c0 + jmp SIMD_CRYPTO_qd_qm +ARM_instruction_sha1c.32: + mov edx,0xf2000c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha1p.32: + mov edx,0xf2100c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha1m.32: + mov edx,0xf2200c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha1su0.32: + mov edx,0xf2300c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha256h.32: + mov edx,0xf3000c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha256h2.32: + mov edx,0xf3100c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_sha256su1.32: + mov edx,0xf3200c40 + jmp SIMD_CRYPTO_qd_qn_qm +ARM_instruction_vmull.p64: + mov edx,0xf2a00e00 + jmp SIMD_INT_qd_dn_dm + +;v8 64-bit + +ARM_instruction_adrp: + INST_ARM64 + dd 0x90000000 + dd ARM64_adr + jmp ERROR_instruction_not_32bit +ARM_instruction_asrv: + INST_ARM64 + dd 0x1ac02800 + dd ARM64_register_rotate + jmp ERROR_instruction_not_32bit +ARM_instruction_at: + INST_ARM64 + dd 0xd5000000 + dd ARM64_sys_predefined_at + jmp ERROR_instruction_not_32bit +ARM_instruction_b.eq: + INST_ARM64 + dd 0x54000000 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.ne: + INST_ARM64 + dd 0x54000001 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.cs: + INST_ARM64 + dd 0x54000002 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.cc: + INST_ARM64 + dd 0x54000003 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.mi: + INST_ARM64 + dd 0x54000004 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.pl: + INST_ARM64 + dd 0x54000005 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.vs: + INST_ARM64 + dd 0x54000006 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.vc: + INST_ARM64 + dd 0x54000007 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.hi: + INST_ARM64 + dd 0x54000008 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.ls: + INST_ARM64 + dd 0x54000009 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.ge: + INST_ARM64 + dd 0x5400000a + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.lt: + INST_ARM64 + dd 0x5400000b + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.gt: + INST_ARM64 + dd 0x5400000c + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.le: + INST_ARM64 + dd 0x5400000d + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.al: + INST_ARM64 + dd 0x5400000e + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.hs: + INST_ARM64 + dd 0x54000002 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.lo: + INST_ARM64 + dd 0x54000003 + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_b.nv: + INST_ARM64 + dd 0x5400000f + dd ARM64_b_cond + jmp ERROR_instruction_not_32bit +ARM_instruction_bfm: + INST_ARM64 + dd 0x33000000 + dd ARM64_bfm + jmp ERROR_instruction_not_32bit +ARM_instruction_bfxil: + INST_ARM64 + dd 0x33000000 + dd ARM64_bfxil + jmp ERROR_instruction_not_32bit +ARM_instruction_blr: + INST_ARM64 + dd 0xd63f0000 + dd ARM64_br + jmp ERROR_instruction_not_32bit +ARM_instruction_br: + INST_ARM64 + dd 0xd61f0000 + dd ARM64_br + jmp ERROR_instruction_not_32bit +ARM_instruction_brk: + INST_ARM64 + dd 0xd4200000 + dd ARM64_debug + jmp ERROR_instruction_not_32bit +ARM_instruction_ccmn: + INST_ARM64 + dd 0x3a400000 + dd ARM64_conditional_compare + jmp ERROR_instruction_not_32bit +ARM_instruction_ccmp: + INST_ARM64 + dd 0x7a400000 + dd ARM64_conditional_compare + jmp ERROR_instruction_not_32bit +ARM_instruction_cinc: + INST_ARM64 + dd 0x1a800400 + dd ARM64_conditional_modify + jmp ERROR_instruction_not_32bit +ARM_instruction_cinv: + INST_ARM64 + dd 0x5a800000 + dd ARM64_conditional_modify + jmp ERROR_instruction_not_32bit +ARM_instruction_cls: + INST_ARM64 + dd 0x5ac01400 + dd ARM64_arithmetic4 + jmp ERROR_instruction_not_32bit +ARM_instruction_cneg: + INST_ARM64 + dd 0x5a800400 + dd ARM64_conditional_modify_zr + jmp ERROR_instruction_not_32bit +ARM_instruction_crc32x: + INST_ARM64 + dd 0x9ac04c00 + dd ARM64_wz_wz_xz + jmp ERROR_instruction_not_32bit +ARM_instruction_crc32cx: + INST_ARM64 + dd 0x9ac05c00 + dd ARM64_wz_wz_xz + jmp ERROR_instruction_not_32bit +ARM_instruction_csel: + INST_ARM64 + dd 0x1a800000 + dd ARM64_conditional_select + jmp ERROR_instruction_not_32bit +ARM_instruction_cset: + INST_ARM64 + dd 0x1a9f07e0 + dd ARM64_conditional_set + jmp ERROR_instruction_not_32bit +ARM_instruction_csetm: + INST_ARM64 + dd 0x5a9f03e0 + dd ARM64_conditional_set + jmp ERROR_instruction_not_32bit +ARM_instruction_csinc: + INST_ARM64 + dd 0x1a800400 + dd ARM64_conditional_select + jmp ERROR_instruction_not_32bit +ARM_instruction_csinv: + INST_ARM64 + dd 0x5a800000 + dd ARM64_conditional_select + jmp ERROR_instruction_not_32bit +ARM_instruction_csneg: + INST_ARM64 + dd 0x5a800400 + dd ARM64_conditional_select + jmp ERROR_instruction_not_32bit +ARM_instruction_dc: + INST_ARM64 + dd 0xd5000000 + dd ARM64_sys_predefined_dc + jmp ERROR_instruction_not_32bit +ARM_instruction_drps: + INST_ARM64 + dd 0xd6bf03e0 + dd ARM64_debug3 + jmp ERROR_instruction_not_32bit +ARM_instruction_eon: + INST_ARM64 + dd 0x40200000 + dd ARM64_arithmetic2 + jmp ERROR_instruction_not_32bit +ARM_instruction_extr: + INST_ARM64 + dd 0x13800000 + dd ARM64_arithmetic5 + jmp ERROR_instruction_not_32bit +ARM_instruction_hint: + INST_ARM64 + dd 0xd503201f + dd ARM64_hint + jmp ERROR_instruction_not_32bit +ARM_instruction_ic: + INST_ARM64 + dd 0xd5000000 + dd ARM64_sys_predefined_ic + jmp ERROR_instruction_not_32bit +ARM_instruction_ldar: + INST_ARM64 + dd 0x88dffc00 + dd ARM64_memory_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldarb: + INST_ARM64 + dd 0x08dffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldarh: + INST_ARM64 + dd 0x48dffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldaxp: + INST_ARM64 + dd 0x887f8000 + dd ARM64_memory_double_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldaxr: + INST_ARM64 + dd 0x885ffc00 + dd ARM64_memory_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldaxrb: + INST_ARM64 + dd 0x085ffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldaxrh: + INST_ARM64 + dd 0x485ffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldnp: + INST_ARM64 + dd 0x28400000 + dd ARM64_memory_double_imm7 + jmp ERROR_instruction_not_32bit +ARM_instruction_ldp: + INST_ARM64 + dd 0x28400000 + dd ARM64_memory_double_imm7_post_pre_offset + jmp ERROR_instruction_not_32bit +ARM_instruction_ldpsw: + INST_ARM64 + dd 0x68400000 + dd ARM64_memory_double_imm7_signed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldrsw: + INST_ARM64 + dd 0x38800000 + dd ARM64_memory_signed_word + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtr: + INST_ARM64 + dd 0x38400c00 + dd ARM64_memory_unprivileged + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtrb: + INST_ARM64 + dd 0x38400c00 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtrh: + INST_ARM64 + dd 0x38400c01 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtrsb: + INST_ARM64 + dd 0x38c00c00 + dd ARM64_memory_unprivileged_signed_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtrsh: + INST_ARM64 + dd 0x38c00c01 + dd ARM64_memory_unprivileged_signed_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldtrsw: + INST_ARM64 + dd 0x38800c00 + dd ARM64_memory_unprivileged_signed_word + jmp ERROR_instruction_not_32bit +ARM_instruction_ldur: + INST_ARM64 + dd 0x38400400 + dd ARM64_memory_unscaled + jmp ERROR_instruction_not_32bit +ARM_instruction_ldurb: + INST_ARM64 + dd 0x38400400 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldurh: + INST_ARM64 + dd 0x38400401 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldursb: + INST_ARM64 + dd 0x38800400 + dd ARM64_memory_unprivileged_signed_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldursh: + INST_ARM64 + dd 0x38800401 + dd ARM64_memory_unprivileged_signed_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_ldursw: + INST_ARM64 + dd 0x38800400 + dd ARM64_memory_unprivileged_signed_word + jmp ERROR_instruction_not_32bit +ARM_instruction_ldxp: + INST_ARM64 + dd 0x887f0000 + dd ARM64_memory_double_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldxr: + INST_ARM64 + dd 0x885f7c00 + dd ARM64_memory_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldxrb: + INST_ARM64 + dd 0x085f7c00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_ldxrh: + INST_ARM64 + dd 0x485f7c00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_lslv: + INST_ARM64 + dd 0x1ac02000 + dd ARM64_register_rotate + jmp ERROR_instruction_not_32bit +ARM_instruction_lsrv: + INST_ARM64 + dd 0x1ac02400 + dd ARM64_register_rotate + jmp ERROR_instruction_not_32bit +ARM_instruction_madd: + INST_ARM64 + dd 0x1b000000 + dd ARM64_dz_nz_mz_az + jmp ERROR_instruction_not_32bit +ARM_instruction_mneg: + INST_ARM64 + dd 0x1b00fc00 + dd ARM64_dz_nz_mz + jmp ERROR_instruction_not_32bit +ARM_instruction_movk: + INST_ARM64 + dd 0x72800000 + dd ARM64_mov_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_movn: + INST_ARM64 + dd 0x12800000 + dd ARM64_mov_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_movz: + INST_ARM64 + dd 0x52800000 + dd ARM64_mov_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_msub: + INST_ARM64 + dd 0x1b008000 + dd ARM64_dz_nz_mz_az + jmp ERROR_instruction_not_32bit +ARM_instruction_ngc: + INST_ARM64S + dd 0x5a0003e0 + dd ARM64_arithmetic9 + jmp ERROR_instruction_not_32bit +ARM_instruction_prfm: + INST_ARM64 + dd 0xf8800000 + dd ARM64_prefetch + jmp ERROR_instruction_not_32bit +ARM_instruction_ret: + INST_ARM64 + dd 0xd65f0000 + dd ARM64_ret + jmp ERROR_instruction_not_32bit +ARM_instruction_rev32: + INST_ARM64 + dd 0xdac00800 + dd ARM64_arithmetic13 + jmp ERROR_instruction_not_32bit +ARM_instruction_rev64: + INST_ARM64 + dd 0xdac00c00 + dd ARM64_arithmetic14 + jmp ERROR_instruction_not_32bit +ARM_instruction_rorv: + INST_ARM64 + dd 0x1ac02c00 + dd ARM64_register_rotate + jmp ERROR_instruction_not_32bit +ARM_instruction_sbfiz: + INST_ARM64 + dd 0x13000000 + dd ARM64_bfi + jmp ERROR_instruction_not_32bit +ARM_instruction_sbfm: + INST_ARM64 + dd 0x13000000 + dd ARM64_bfm + jmp ERROR_instruction_not_32bit +ARM_instruction_smaddl: + INST_ARM64 + dd 0x9b200000 + dd ARM64_dx_nw_mw_ax + jmp ERROR_instruction_not_32bit +ARM_instruction_smnegl: + INST_ARM64 + dd 0x9b20fc00 + dd ARM64_dx_nw_mw + jmp ERROR_instruction_not_32bit +ARM_instruction_smsubl: + INST_ARM64 + dd 0x9b208000 + dd ARM64_dx_nw_mw_ax + jmp ERROR_instruction_not_32bit +ARM_instruction_smulh: + INST_ARM64 + dd 0x9b407c00 + dd ARM64_xz_xz_xz + jmp ERROR_instruction_not_32bit +ARM_instruction_stlr: + INST_ARM64 + dd 0x889ffc00 + dd ARM64_memory_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlrb: + INST_ARM64 + dd 0x089ffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlrh: + INST_ARM64 + dd 0x489ffc00 + dd ARM64_memory_word_single_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlxp: + INST_ARM64 + dd 0x88208000 + dd ARM64_memory_triple_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlxr: + INST_ARM64 + dd 0x8800fc00 + dd ARM64_memory_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlxrb: + INST_ARM64 + dd 0x0800fc00 + dd ARM64_memory_word_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stlxrh: + INST_ARM64 + dd 0x4800fc00 + dd ARM64_memory_word_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stnp: + INST_ARM64 + dd 0x28000000 + dd ARM64_memory_double_imm7 + jmp ERROR_instruction_not_32bit +ARM_instruction_stp: + INST_ARM64 + dd 0x28000000 + dd ARM64_memory_double_imm7_post_pre_offset + jmp ERROR_instruction_not_32bit +ARM_instruction_sttr: + INST_ARM64 + dd 0x38000c00 + dd ARM64_memory_unprivileged + jmp ERROR_instruction_not_32bit +ARM_instruction_sttrb: + INST_ARM64 + dd 0x38000c00 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_sttrh: + INST_ARM64 + dd 0x38000c01 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_stur: + INST_ARM64 + dd 0x38000400 + dd ARM64_memory_unscaled + jmp ERROR_instruction_not_32bit +ARM_instruction_sturb: + INST_ARM64 + dd 0x38000400 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_sturh: + INST_ARM64 + dd 0x38000401 + dd ARM64_memory_unprivileged_byte_hword + jmp ERROR_instruction_not_32bit +ARM_instruction_stxp: + INST_ARM64 + dd 0x88200000 + dd ARM64_memory_triple_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stxr: + INST_ARM64 + dd 0x88007c00 + dd ARM64_memory_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stxrb: + INST_ARM64 + dd 0x08007c00 + dd ARM64_memory_word_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_stxrh: + INST_ARM64 + dd 0x48007c00 + dd ARM64_memory_word_double_release_fixed + jmp ERROR_instruction_not_32bit +ARM_instruction_sxtw: + INST_ARM64 + dd 0x93407c00 + dd ARM64_dx_nw + jmp ERROR_instruction_not_32bit +ARM_instruction_sys: + INST_ARM64 + dd 0xd5080000 + dd ARM64_sys + jmp ERROR_instruction_not_32bit +ARM_instruction_sysl: + INST_ARM64 + dd 0xd5280000 + dd ARM64_sysl + jmp ERROR_instruction_not_32bit +ARM_instruction_tbnz: + INST_ARM64 + dd 0x37000000 + dd ARM64_tb + jmp ERROR_instruction_not_32bit +ARM_instruction_tbz: + INST_ARM64 + dd 0x36000000 + dd ARM64_tb + jmp ERROR_instruction_not_32bit +ARM_instruction_tlbi: + INST_ARM64 + dd 0xd5000000 + dd ARM64_sys_predefined_tlbi + jmp ERROR_instruction_not_32bit +ARM_instruction_ubfiz: + INST_ARM64 + dd 0x53000000 + dd ARM64_bfi + jmp ERROR_instruction_not_32bit +ARM_instruction_ubfm: + INST_ARM64 + dd 0x53000000 + dd ARM64_bfm + jmp ERROR_instruction_not_32bit +ARM_instruction_umaddl: + INST_ARM64 + dd 0x9ba00000 + dd ARM64_dx_nw_mw_ax + jmp ERROR_instruction_not_32bit +ARM_instruction_umnegl: + INST_ARM64 + dd 0x9ba0fc00 + dd ARM64_dx_nw_mw + jmp ERROR_instruction_not_32bit +ARM_instruction_umsubl: + INST_ARM64 + dd 0x9ba08000 + dd ARM64_dx_nw_mw_ax + jmp ERROR_instruction_not_32bit +ARM_instruction_umulh: + INST_ARM64 + dd 0x9bc07c00 + dd ARM64_xz_xz_xz + jmp ERROR_instruction_not_32bit +ARM_instruction_abs: + INST_ARM64 + dd 0x0e20b800 + dd ARM64_vector_scalar_bhsd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_addhn: + INST_ARM64 + dd 0x0e204000 + dd ARM64_vector_narrow_low + jmp ERROR_instruction_not_32bit +ARM_instruction_addhn2: + INST_ARM64 + dd 0x4e204000 + dd ARM64_vector_narrow_high + jmp ERROR_instruction_not_32bit +ARM_instruction_addp: + INST_ARM64 + dd 0x0e20bc00 + dd ARM64_vector_narrow_3reg_scalar_2reg + jmp ERROR_instruction_not_32bit +ARM_instruction_addv: + INST_ARM64 + dd 0x0e31b800 + dd ARM64_vector_reduce_bhs + jmp ERROR_instruction_not_32bit +ARM_instruction_aesd: + INST_ARM64 + dd 0x4e285800 + dd ARM64_crypto_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_aese: + INST_ARM64 + dd 0x4e284800 + dd ARM64_crypto_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_aesimc: + INST_ARM64 + dd 0x4e287800 + dd ARM64_crypto_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_aesmc: + INST_ARM64 + dd 0x4e286800 + dd ARM64_crypto_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_bif: + INST_ARM64 + dd 0x2ee01c00 + dd ARM64_vector_scalar_b_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_bit: + INST_ARM64 + dd 0x2ea01c00 + dd ARM64_vector_scalar_b_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_bsl: + INST_ARM64 + dd 0x2e601c00 + dd ARM64_vector_scalar_b_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_cmeq: + INST_ARM64 + dd 0x2e208c00 + dd ARM64_vector_scalar_bhsd_three_reg_zero + jmp ERROR_instruction_not_32bit +ARM_instruction_cmge: + INST_ARM64 + dd 0x0e203c00 + dd ARM64_vector_scalar_bhsd_three_reg_zero + jmp ERROR_instruction_not_32bit +ARM_instruction_cmgt: + INST_ARM64 + dd 0x0e203400 + dd ARM64_vector_scalar_bhsd_three_reg_zero + jmp ERROR_instruction_not_32bit +ARM_instruction_cmhi: + INST_ARM64 + dd 0x2e203400 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_cmhs: + INST_ARM64 + dd 0x2e203c00 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_cmle: + INST_ARM64 + dd 0x2e209800 + dd ARM64_vector_scalar_bhsd_two_reg_zero + jmp ERROR_instruction_not_32bit +ARM_instruction_cmlt: + INST_ARM64 + dd 0x0e20a800 + dd ARM64_vector_scalar_bhsd_two_reg_zero + jmp ERROR_instruction_not_32bit +ARM_instruction_cmtst: + INST_ARM64 + dd 0x0e208c00 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_cnt: + INST_ARM64 + dd 0x0e205800 + dd ARM64_vector_b_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_dup: + INST_ARM64 + dd 0x00000000 + dd ARM64_dup + jmp ERROR_instruction_not_32bit +ARM_instruction_ext: + INST_ARM64 + dd 0x2e000000 + dd ARM64_vector_b_three_reg_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_fabd: + INST_ARM64V + dd 0x7ea0d400 ;scalar + dd 0x2ea0d400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fabs: + INST_ARM64V + dd 0x1e20c000 ;scalar + dd 0x0ea0f800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_facge: + INST_ARM64V + dd 0x7e20ec00 ;scalar + dd 0x2e20ec00 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_facgt: + INST_ARM64V + dd 0x7ea0ec00 ;scalar + dd 0x2ea0ec00 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fadd: + INST_ARM64V + dd 0x1e202800 ;scalar + dd 0x0e20d400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_faddp: + INST_ARM64V + dd 0x7e30d800 ;scalar + dd 0x2e20d400 ;vector + dd ARM64_vector_scalar_sd_pairs + jmp ERROR_instruction_not_32bit +ARM_instruction_fccmp: + INST_ARM64 + dd 0x1e200400 + dd ARM64_conditional_compare_float + jmp ERROR_instruction_not_32bit +ARM_instruction_fccmpe: + INST_ARM64 + dd 0x1e200410 + dd ARM64_conditional_compare_float + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmeq: + INST_ARM64V + dd 0x5e20e400 ;scalar + dd 0x0e20e400 ;vector + dd ARM64_vector_scalar_sd_compare_mask_eq + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmge: + INST_ARM64V + dd 0x7e20e400 ;scalar + dd 0x2e20e400 ;vector + dd ARM64_vector_scalar_sd_compare_mask_ge + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmgt: + INST_ARM64V + dd 0x7ea0e400 ;scalar + dd 0x2ea0e400 ;vector + dd ARM64_vector_scalar_sd_compare_mask_gt + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmle: + INST_ARM64V + dd 0x7ea0d800 ;scalar + dd 0x2ea0d800 ;vector + dd ARM64_vector_scalar_sd_compare_mask_le + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmlt: + INST_ARM64V + dd 0x5ea0e800 ;scalar + dd 0x0ea0e800 ;vector + dd ARM64_vector_scalar_sd_compare_mask_le + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmp: + INST_ARM64 + dd 0x1e202000 + dd ARM64_scalar_sd_compare + jmp ERROR_instruction_not_32bit +ARM_instruction_fcmpe: + INST_ARM64 + dd 0x1e202010 + dd ARM64_scalar_sd_compare + jmp ERROR_instruction_not_32bit +ARM_instruction_fcsel: + INST_ARM64 + dd 0x1e200c00 + dd ARM64_scalar_conditional_select + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvt: + INST_ARM64 + dd 0x1e224000 + dd ARM64_scalar_hsd_convert + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtas: + INST_ARM64V + dd 0x5e21c800 ;scalar + dd 0x0e21c800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_as + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtau: + INST_ARM64V + dd 0x7e21c800 ;scalar + dd 0x2e21c800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_au + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtl: + INST_ARM64 + dd 0x0e217800 + dd ARM64_vector_convert_long + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtl2: + INST_ARM64 + dd 0x4e217800 + dd ARM64_vector_convert_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtms: + INST_ARM64V + dd 0x5e21b800 ;scalar + dd 0x0e21b800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_ms + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtmu: + INST_ARM64V + dd 0x7e21b800 ;scalar + dd 0x2e21b800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_mu + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtn: + INST_ARM64 + dd 0x0e216800 + dd ARM64_vector_convert_narrow + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtn2: + INST_ARM64 + dd 0x4e216800 + dd ARM64_vector_convert_narrow2 + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtns: + INST_ARM64V + dd 0x5e21a800 ;scalar + dd 0x0e21a800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_ns + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtnu: + INST_ARM64V + dd 0x7e21a800 ;scalar + dd 0x2e21a800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_nu + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtps: + INST_ARM64V + dd 0x5ea1a800 ;scalar + dd 0x0ea1a800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_ps + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtpu: + INST_ARM64V + dd 0x7ea1a800 ;scalar + dd 0x2ea1a800 ;vector + dd ARM64_vector_scalar_sdwx_two_reg_pu + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtxn: + INST_ARM64V + dd 0x7e616800 ;scalar + dd 0x2e616800 ;vector + dd ARM64_vector_convert_odd_narrow + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtxn2: + INST_ARM64 + dd 0x6e616800 + dd ARM64_vector_convert_odd_narrow2 + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtzs: + INST_ARM64V + dd 0x5ea1b800 ;scalar + dd 0x0ea1b800 ;vector + dd ARM64_vector_scalar_sd_convert_zero_s + jmp ERROR_instruction_not_32bit +ARM_instruction_fcvtzu: + INST_ARM64V + dd 0x7ea1b800 ;scalar + dd 0x2ea1b800 ;vector + dd ARM64_vector_scalar_sd_convert_zero_u + jmp ERROR_instruction_not_32bit +ARM_instruction_fdiv: + INST_ARM64V + dd 0x1e201800 ;scalar + dd 0x2e20fc00 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fmadd: + INST_ARM64 + dd 0x1f000000 + dd ARM64_scalar_sd_four_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fmax: + INST_ARM64V + dd 0x1e204800 ;scalar + dd 0x0e20f400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fmaxnm: + INST_ARM64V + dd 0x1e206800 ;scalar + dd 0x0e20c400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fmaxnmp: + INST_ARM64V + dd 0x7e30c800 ;scalar + dd 0x2e20c400 ;vector + dd ARM64_vector_scalar_sd_pairs + jmp ERROR_instruction_not_32bit +ARM_instruction_fmaxnmv: + INST_ARM64 + dd 0x6e30c800 + dd ARM64_vector_4_to_1 + jmp ERROR_instruction_not_32bit +ARM_instruction_fmaxp: + INST_ARM64V + dd 0x7e30f800 ;scalar + dd 0x2e20f400 ;vector + dd ARM64_vector_scalar_sd_pairs + jmp ERROR_instruction_not_32bit +ARM_instruction_fmaxv: + INST_ARM64 + dd 0x6e30f800 + dd ARM64_vector_4_to_1 + jmp ERROR_instruction_not_32bit +ARM_instruction_fmin: + INST_ARM64V + dd 0x1e205800 ;scalar + dd 0x0ea0f400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fminnm: + INST_ARM64V + dd 0x1e207800 ;scalar + dd 0x0ea0c400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fminnmp: + INST_ARM64V + dd 0x7eb0c800 ;scalar + dd 0x2ea0c400 ;vector + dd ARM64_vector_scalar_sd_pairs + jmp ERROR_instruction_not_32bit +ARM_instruction_fminnmv: + INST_ARM64 + dd 0x6eb0c800 + dd ARM64_vector_4_to_1 + jmp ERROR_instruction_not_32bit +ARM_instruction_fminp: + INST_ARM64V + dd 0x7eb0f800 ;scalar + dd 0x2ea0f400 ;vector + dd ARM64_vector_scalar_sd_pairs + jmp ERROR_instruction_not_32bit +ARM_instruction_fminv: + INST_ARM64 + dd 0x6eb0f800 + dd ARM64_vector_4_to_1 + jmp ERROR_instruction_not_32bit +ARM_instruction_fmla: + INST_ARM64V + dd 0x5f801000 ;scalar + dd 0x0f801000 ;vector + dd ARM64_vector_scalar_sd_two_reg_element_add + jmp ERROR_instruction_not_32bit +ARM_instruction_fmov: + INST_ARM64 + dd 0x00000000 + dd ARM64_fmov + jmp ERROR_instruction_not_32bit +ARM_instruction_fmsub: + INST_ARM64 + dd 0x1f008000 + dd ARM64_scalar_sd_four_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fmul: + INST_ARM64V + dd 0x1e200800 ;scalar + dd 0x2e20dc00 ;vector + dd ARM64_vector_scalar_sd_three_reg_element + jmp ERROR_instruction_not_32bit +ARM_instruction_fmulx: + INST_ARM64V + dd 0x5e20dc00 ;scalar + dd 0x0e20dc00 ;vector + dd ARM64_vector_scalar_sd_three_reg_element_x + jmp ERROR_instruction_not_32bit +ARM_instruction_fneg: + INST_ARM64V + dd 0x1e214000 ;scalar + dd 0x2ea0f800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fnmadd: + INST_ARM64 + dd 0x1f200000 + dd ARM64_scalar_sd_four_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fnmsub: + INST_ARM64 + dd 0x1f208000 + dd ARM64_scalar_sd_four_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fnmul: + INST_ARM64 + dd 0x1e208800 + dd ARM64_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frecpe: + INST_ARM64V + dd 0x5ea1d800 ;scalar + dd 0x0ea1d800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frecps: + INST_ARM64V + dd 0x5e20fc00 ;scalar + dd 0x0e20fc00 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frecpx: + INST_ARM64 + dd 0x5ea1f800 + dd ARM64_scalar_sd_rwo_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frinta: + INST_ARM64V + dd 0x1e264000 ;scalar + dd 0x2e218800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frinti: + INST_ARM64V + dd 0x1e27c000 ;scalar + dd 0x2ea19800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frintm: + INST_ARM64V + dd 0x1e254000 ;scalar + dd 0x0e219800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frintn: + INST_ARM64V + dd 0x1e244000 ;scalar + dd 0x0e218800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frintp: + INST_ARM64V + dd 0x1e24c000 ;scalar + dd 0x0ea18800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frintx: + INST_ARM64V + dd 0x1e274000 ;scalar + dd 0x2e219800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frintz: + INST_ARM64V + dd 0x1e25c000 ;scalar + dd 0x0ea19800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frsqrte: + INST_ARM64V + dd 0x7ea1d800 ;scalar + dd 0x2ea1d800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_frsqrts: + INST_ARM64V + dd 0x5ea0fc00 ;scalar + dd 0x0ea0fc00 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fsqrt: + INST_ARM64V + dd 0x1e21c000 ;scalar + dd 0x2ea1f800 ;vector + dd ARM64_vector_scalar_sd_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_fsub: + INST_ARM64V + dd 0x1e203800 ;scalar + dd 0x0ea0d400 ;vector + dd ARM64_vector_scalar_sd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_ins: + INST_ARM64 + dd 0x00000000 + dd ARM64_ins +ARM_instruction_ld1: + INST_ARM64V + dd 0x0dc00000 ;single + dd 0x0cc02000 ;multiple + dd ARM64_ld1 + jmp ERROR_instruction_not_32bit +ARM_instruction_ld1r: + INST_ARM64 + dd 0x0dc0c000 + dd ARM64_ld1r +ARM_instruction_ld2: + INST_ARM64V + dd 0x0de00000 ;single + dd 0x0cc00000 ;multiple + dd ARM64_ld2 + jmp ERROR_instruction_not_32bit +ARM_instruction_ld2r: + INST_ARM64 + dd 0x0de0c000 + dd ARM64_ld2r +ARM_instruction_ld3: + INST_ARM64V + dd 0x0dc02000 ;single + dd 0x0cc00000 ;multiple + dd ARM64_ld3 + jmp ERROR_instruction_not_32bit +ARM_instruction_ld3r: + INST_ARM64 + dd 0x0dc0e000 + dd ARM64_ld3r +ARM_instruction_ld4: + INST_ARM64V + dd 0x0de02000 ;single + dd 0x0cc00000 ;multiple + dd ARM64_ld4 + jmp ERROR_instruction_not_32bit +ARM_instruction_ld4r: + INST_ARM64 + dd 0x0de0e000 + dd ARM64_ld4r +ARM_instruction_movi: + INST_ARM64 + dd 0x0f000400 + dd ARM64_movi +ARM_instruction_mvni: + INST_ARM64 + dd 0x2f000400 + dd ARM64_mvni +ARM_instruction_not: + INST_ARM64 + dd 0x2e205800 + dd ARM64_vector_b_two_reg +ARM_instruction_pmul: + INST_ARM64 + dd 0x2e209c00 + dd ARM64_vector_scalar_b_three_reg +ARM_instruction_pmull: + INST_ARM64 + dd 0x0e20e000 + dd ARM64_polynomial +ARM_instruction_pmull2: + INST_ARM64 + dd 0x4e20e000 + dd ARM64_polynomial2 +ARM_instruction_raddhn: + INST_ARM64 + dd 0x2e204000 + dd ARM64_vector_narrow_low + jmp ERROR_instruction_not_32bit +ARM_instruction_raddhn2: + INST_ARM64 + dd 0x6e204000 + dd ARM64_vector_narrow_high + jmp ERROR_instruction_not_32bit +ARM_instruction_rshrn: + INST_ARM64 + dd 0x0f008c00 + dd ARM64_vector_narrow_shift_low + jmp ERROR_instruction_not_32bit +ARM_instruction_rshrn2: + INST_ARM64 + dd 0x4f008c00 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_rsubhn: + INST_ARM64 + dd 0x2e206000 + dd ARM64_vector_narrow_low + jmp ERROR_instruction_not_32bit +ARM_instruction_rsubhn2: + INST_ARM64 + dd 0x6e206000 + dd ARM64_vector_narrow_high + jmp ERROR_instruction_not_32bit +ARM_instruction_saba: + INST_ARM64 + dd 0x0e207c00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sabal: + INST_ARM64 + dd 0x0e205000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sabal2: + INST_ARM64 + dd 0x4e205000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sabd: + INST_ARM64 + dd 0x0e207400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sabdl: + INST_ARM64 + dd 0x0e207000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sabdl2: + INST_ARM64 + dd 0x4e207000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sadalp: + INST_ARM64 + dd 0x0e206800 + dd ARM64_vector_bhs_two_reg_pair + jmp ERROR_instruction_not_32bit +ARM_instruction_saddl: + INST_ARM64 + dd 0x0e200000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_saddl2: + INST_ARM64 + dd 0x4e200000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_saddlp: + INST_ARM64 + dd 0x0e202800 + dd ARM64_vector_bhs_two_reg_pair + jmp ERROR_instruction_not_32bit +ARM_instruction_saddlv: + INST_ARM64 + dd 0x0e303800 + dd ARM64_scalar_vector_bhs_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_saddw: + INST_ARM64 + dd 0x0e201000 + dd ARM64_vector_bhs_three_reg_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_saddw2: + INST_ARM64 + dd 0x4e201000 + dd ARM64_vector_bhs_three_reg_wide2 + jmp ERROR_instruction_not_32bit +ARM_instruction_scvtf: + INST_ARM64V + dd 0x5e21d800 ;scalar + dd 0x0e21d800 ;vector + dd ARM64_scalar_vector_sd_convert_zero_s + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1c: + INST_ARM64 + dd 0x5e000000 + dd ARM64_sha_qsv + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1h: + INST_ARM64 + dd 0x5e280800 + dd ARM64_sha_s_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1m: + INST_ARM64 + dd 0x5e002000 + dd ARM64_sha_qsv + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1p: + INST_ARM64 + dd 0x5e001000 + dd ARM64_sha_qsv + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1su0: + INST_ARM64 + dd 0x5e003000 + dd ARM64_sha_vs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sha1su1: + INST_ARM64 + dd 0x5e281800 + dd ARM64_sha_vs_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sha256h: + INST_ARM64 + dd 0x5e004000 + dd ARM64_sha_qqv + jmp ERROR_instruction_not_32bit +ARM_instruction_sha256h2: + INST_ARM64 + dd 0x5e005000 + dd ARM64_sha_qqv + jmp ERROR_instruction_not_32bit +ARM_instruction_sha256su0: + INST_ARM64 + dd 0x5e282800 + dd ARM64_sha_vs_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sha256su1: + INST_ARM64 + dd 0x5e006000 + dd ARM64_sha_vs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_shadd: + INST_ARM64 + dd 0x0e200400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_shl: + INST_ARM64 + dd 0x0f005400 + dd ARM64_vector_scalar_bhsd_two_reg_left_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_shll: + INST_ARM64 + dd 0x2e213800 + dd ARM64_vector_scalar_bhs_long_size + jmp ERROR_instruction_not_32bit +ARM_instruction_shll2: + INST_ARM64 + dd 0x6e213800 + dd ARM64_vector_scalar_bhs_long2_size + jmp ERROR_instruction_not_32bit +ARM_instruction_shrn: + INST_ARM64 + dd 0x0f008400 + dd ARM64_vector_narrow_shift_low + jmp ERROR_instruction_not_32bit +ARM_instruction_shrn2: + INST_ARM64 + dd 0x4f008400 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_shsub: + INST_ARM64 + dd 0x0e202400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sli: + INST_ARM64 + dd 0x2f005400 + dd ARM64_vector_scalar_bhsd_two_reg_left_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_smax: + INST_ARM64 + dd 0x0e206400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_smaxp: + INST_ARM64 + dd 0x0e20a400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_smaxv: + INST_ARM64 + dd 0x0e30a800 + dd ARM64_vector_reduce_bhs + jmp ERROR_instruction_not_32bit +ARM_instruction_smin: + INST_ARM64 + dd 0x0e206c00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sminp: + INST_ARM64 + dd 0x0e20ac00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sminv: + INST_ARM64 + dd 0x0e31a800 + dd ARM64_vector_reduce_bhs + jmp ERROR_instruction_not_32bit +ARM_instruction_smlal2: + INST_ARM64V + dd 0x4e208000 ;vector + dd 0x4f002000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_smlsl: + INST_ARM64V + dd 0x0e20a000 ;vector + dd 0x0f006000 ;element + dd ARM64_arithmetic18_long + jmp ERROR_instruction_not_32bit +ARM_instruction_smlsl2: + INST_ARM64V + dd 0x4e20a000 ;vector + dd 0x4f006000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_smov: + INST_ARM64 + dd 0x0e002c00 + dd ARM64_smov + jmp ERROR_instruction_not_32bit +ARM_instruction_smull2: + INST_ARM64V + dd 0x4e20c000 ;vector + dd 0x4f00a000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqabs: + INST_ARM64 + dd 0x0e207800 + dd ARM64_vector_scalar_bhsd_two_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sqadd: + INST_ARM64 + dd 0x0e200c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmlal: + INST_ARM64V + dd 0x0e209000 ;vector + dd 0x0f003000 ;element + dd ARM64_arithmetic19_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmlal2: + INST_ARM64V + dd 0x4e209000 ;vector + dd 0x4f003000 ;element + dd ARM64_arithmetic19_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmlsl: + INST_ARM64V + dd 0x0e20b000 ;vector + dd 0x0f007000 ;element + dd ARM64_arithmetic19_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmlsl2: + INST_ARM64V + dd 0x4e20b000 ;vector + dd 0x4f007000 ;element + dd ARM64_arithmetic19_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmulh: + INST_ARM64V + dd 0x0e20b400 ;vector + dd 0x0f00c000 ;element + dd ARM64_arithmetic20 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmull: + INST_ARM64V + dd 0x0e20d000 ;vector + dd 0x0f00b000 ;element + dd ARM64_arithmetic19_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sqdmull2: + INST_ARM64V + dd 0x4e20d000 ;vector + dd 0x4f00b000 ;element + dd ARM64_arithmetic19_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqneg: + INST_ARM64 + dd 0x2e207800 + dd ARM64_vector_scalar_bhsd_two_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrdmulh: + INST_ARM64V + dd 0x2e20b400 ;vector + dd 0x0f00d000 ;element + dd ARM64_arithmetic20 + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrshl: + INST_ARM64 + dd 0x0e205c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrshrn: + INST_ARM64 + dd 0x0f009c00 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrshrn2: + INST_ARM64 + dd 0x4f009c00 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrshrun: + INST_ARM64 + dd 0x2f008c00 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqrshrun2: + INST_ARM64 + dd 0x6f008c00 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshl: + INST_ARM64V + dd 0x0e204c00 ;register + dd 0x0f007400 ;immediate + dd ARM64_vector_scalar_bhsd_shift_reg_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshlu: + INST_ARM64 + dd 0x2f006400 + dd ARM64_vector_scalar_bhsd_shift_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshrn: + INST_ARM64 + dd 0x0f009400 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshrn2: + INST_ARM64 + dd 0x4f009400 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshrun: + INST_ARM64 + dd 0x2f008400 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqshrun2: + INST_ARM64 + dd 0x6f008400 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqsub: + INST_ARM64 + dd 0x0e202c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sqxtn: + INST_ARM64 + dd 0x0e214800 + dd ARM64_vector_scalar_narrow_extract_low + jmp ERROR_instruction_not_32bit +ARM_instruction_sqxtn2: + INST_ARM64 + dd 0x4e214800 + dd ARM64_vector_narrow_extract_high + jmp ERROR_instruction_not_32bit +ARM_instruction_sqxtun: + INST_ARM64 + dd 0x2e212800 + dd ARM64_vector_scalar_narrow_extract_low + jmp ERROR_instruction_not_32bit +ARM_instruction_sqxtun2: + INST_ARM64 + dd 0x6e212800 + dd ARM64_vector_narrow_extract_high + jmp ERROR_instruction_not_32bit +ARM_instruction_srhadd: + INST_ARM64 + dd 0x0e201400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sri: + INST_ARM64 + dd 0x2f004400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_srshl: + INST_ARM64 + dd 0x0e205400 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_srshr: + INST_ARM64 + dd 0x0f002400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_srsra: + INST_ARM64 + dd 0x0f003400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_sshl: + INST_ARM64 + dd 0x0e204400 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_sshll: + INST_ARM64 + dd 0x0f00a400 + dd ARM64_vector_scalar_bhs_long_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_sshll2: + INST_ARM64 + dd 0x4f00a400 + dd ARM64_vector_scalar_bhs_long2_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_sshr: + INST_ARM64 + dd 0x0f000400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ssra: + INST_ARM64 + dd 0x0f001400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ssubl: + INST_ARM64 + dd 0x0e202000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_ssubl2: + INST_ARM64 + dd 0x4e202000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_ssubw: + INST_ARM64 + dd 0x0e203000 + dd ARM64_vector_bhs_three_reg_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_ssubw2: + INST_ARM64 + dd 0x4e203000 + dd ARM64_vector_bhs_three_reg_wide2 + jmp ERROR_instruction_not_32bit +ARM_instruction_st1: + INST_ARM64V + dd 0x0d800000 ;single + dd 0x0c802000 ;multiple + dd ARM64_ld1 + jmp ERROR_instruction_not_32bit +ARM_instruction_st2: + INST_ARM64V + dd 0x0da00000 ;single + dd 0x0c800000 ;multiple + dd ARM64_ld2 + jmp ERROR_instruction_not_32bit +ARM_instruction_st3: + INST_ARM64V + dd 0x0d802000 ;single + dd 0x0c800000 ;multiple + dd ARM64_ld3 + jmp ERROR_instruction_not_32bit +ARM_instruction_st4: + INST_ARM64V + dd 0x0da02000 ;single + dd 0x0c800000 ;multiple + dd ARM64_ld4 + jmp ERROR_instruction_not_32bit +ARM_instruction_subhn: + INST_ARM64 + dd 0x0e206000 + dd ARM64_vector_narrow_low + jmp ERROR_instruction_not_32bit +ARM_instruction_subhn2: + INST_ARM64 + dd 0x4e206000 + dd ARM64_vector_narrow_high + jmp ERROR_instruction_not_32bit +ARM_instruction_suqadd: + INST_ARM64 + dd 0x0e203800 + dd ARM64_vector_scalar_bhsd_two_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_sxtl: + INST_ARM64 + dd 0x0f00a400 + dd ARM64_vector_scalar_bhs_long + jmp ERROR_instruction_not_32bit +ARM_instruction_sxtl2: + INST_ARM64 + dd 0x4f00a400 + dd ARM64_vector_scalar_bhs_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_tbl: + INST_ARM64 + dd 0x0e000000 + dd ARM64_tb1 + jmp ERROR_instruction_not_32bit +ARM_instruction_tbx: + INST_ARM64 + dd 0x0e001000 + dd ARM64_tb1 + jmp ERROR_instruction_not_32bit +ARM_instruction_trn1: + INST_ARM64 + dd 0x0e002800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_trn2: + INST_ARM64 + dd 0x0e006800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uaba: + INST_ARM64 + dd 0x2e207c00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uabal: + INST_ARM64 + dd 0x2e205000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_uabal2: + INST_ARM64 + dd 0x6e205000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uabd: + INST_ARM64 + dd 0x2e207400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uabdl: + INST_ARM64 + dd 0x2e207000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_uabdl2: + INST_ARM64 + dd 0x6e207000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uadalp: + INST_ARM64 + dd 0x2e206800 + dd ARM64_vector_bhs_two_reg_pair + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddl: + INST_ARM64 + dd 0x2e200000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddl2: + INST_ARM64 + dd 0x6e200000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddlp: + INST_ARM64 + dd 0x2e202800 + dd ARM64_vector_bhs_two_reg_pair + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddlv: + INST_ARM64 + dd 0x2e303800 + dd ARM64_scalar_vector_bhs_two_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddw: + INST_ARM64 + dd 0x2e201000 + dd ARM64_vector_bhs_three_reg_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_uaddw2: + INST_ARM64 + dd 0x6e201000 + dd ARM64_vector_bhs_three_reg_wide2 + jmp ERROR_instruction_not_32bit +ARM_instruction_ucvtf: + INST_ARM64V + dd 0x7e21d800 ;scalar + dd 0x2e21d800 ;vector + dd ARM64_scalar_vector_sd_convert_zero_u + jmp ERROR_instruction_not_32bit +ARM_instruction_uhadd: + INST_ARM64 + dd 0x2e200400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uhsub: + INST_ARM64 + dd 0x2e202400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_umax: + INST_ARM64 + dd 0x2e206400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_umaxp: + INST_ARM64 + dd 0x2e20a400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_umaxv: + INST_ARM64 + dd 0x2e30a800 + dd ARM64_vector_reduce_bhs + jmp ERROR_instruction_not_32bit +ARM_instruction_umin: + INST_ARM64 + dd 0x2e206c00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uminp: + INST_ARM64 + dd 0x2e20ac00 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uminv: + INST_ARM64 + dd 0x2e31a800 + dd ARM64_vector_reduce_bhs + jmp ERROR_instruction_not_32bit +ARM_instruction_umlal2: + INST_ARM64V + dd 0x6e208000 ;vector + dd 0x6f002000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_umlsl: + INST_ARM64V + dd 0x2e20a000 ;vector + dd 0x2f006000 ;element + dd ARM64_arithmetic18_long + jmp ERROR_instruction_not_32bit +ARM_instruction_umlsl2: + INST_ARM64V + dd 0x6e20a000 ;vector + dd 0x6f006000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_umov: + INST_ARM64 + dd 0x0e003c00 + dd ARM64_umov + jmp ERROR_instruction_not_32bit +ARM_instruction_umull2: + INST_ARM64V + dd 0x6e20c000 ;vector + dd 0x6f00a000 ;element + dd ARM64_arithmetic18_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uqadd: + INST_ARM64 + dd 0x2e200c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_uqrshl: + INST_ARM64 + dd 0x2e205c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_uqrshrn: + INST_ARM64 + dd 0x2f009c00 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_uqrshrn2: + INST_ARM64 + dd 0x6f009c00 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_uqshl: + INST_ARM64V + dd 0x2e204c00 ;register + dd 0x2f007400 ;immediate + dd ARM64_vector_scalar_bhsd_shift_reg_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_uqshrn: + INST_ARM64 + dd 0x2f009400 + dd ARM64_vector_scalar_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_uqshrn2: + INST_ARM64 + dd 0x6f009400 + dd ARM64_vector_narrow_shift_high + jmp ERROR_instruction_not_32bit +ARM_instruction_uqsub: + INST_ARM64 + dd 0x2e202c00 + dd ARM64_vector_scalar_bhsd_three_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_uqxtn: + INST_ARM64 + dd 0x2e214800 + dd ARM64_vector_scalar_narrow_extract_low + jmp ERROR_instruction_not_32bit +ARM_instruction_uqxtn2: + INST_ARM64 + dd 0x6e214800 + dd ARM64_vector_narrow_extract_high + jmp ERROR_instruction_not_32bit +ARM_instruction_urecpe: + INST_ARM64 + dd 0x0ea1c800 + dd ARM64_arithmetic21 + jmp ERROR_instruction_not_32bit +ARM_instruction_urhadd: + INST_ARM64 + dd 0x2e201400 + dd ARM64_vector_bhs_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_urshl: + INST_ARM64 + dd 0x2e205400 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_urshr: + INST_ARM64 + dd 0x2f002400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ursqrte: + INST_ARM64 + dd 0x2ea1c800 + dd ARM64_arithmetic21 + jmp ERROR_instruction_not_32bit +ARM_instruction_ursra: + INST_ARM64 + dd 0x2f003400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ushl: + INST_ARM64 + dd 0x2e204400 + dd ARM64_vector_scalar_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_ushll: + INST_ARM64 + dd 0x2f00a400 + dd ARM64_vector_scalar_bhs_long_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ushll2: + INST_ARM64 + dd 0x6f00a400 + dd ARM64_vector_scalar_bhs_long2_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_ushr: + INST_ARM64 + dd 0x2f000400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_usqadd: + INST_ARM64 + dd 0x2e203800 + dd ARM64_vector_scalar_bhsd_two_reg_q + jmp ERROR_instruction_not_32bit +ARM_instruction_usra: + INST_ARM64 + dd 0x2f001400 + dd ARM64_vector_scalar_bhsd_two_reg_right_imm + jmp ERROR_instruction_not_32bit +ARM_instruction_usubl: + INST_ARM64 + dd 0x2e202000 + dd ARM64_vector_bhs_three_reg_long + jmp ERROR_instruction_not_32bit +ARM_instruction_usubl2: + INST_ARM64 + dd 0x6e202000 + dd ARM64_vector_bhs_three_reg_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_usubw: + INST_ARM64 + dd 0x2e203000 + dd ARM64_vector_bhs_three_reg_wide + jmp ERROR_instruction_not_32bit +ARM_instruction_usubw2: + INST_ARM64 + dd 0x6e203000 + dd ARM64_vector_bhs_three_reg_wide2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uxtl: + INST_ARM64 + dd 0x2f00a400 + dd ARM64_vector_scalar_bhs_long + jmp ERROR_instruction_not_32bit +ARM_instruction_uxtl2: + INST_ARM64 + dd 0x6f00a400 + dd ARM64_vector_scalar_bhs_long2 + jmp ERROR_instruction_not_32bit +ARM_instruction_uzp1: + INST_ARM64 + dd 0x0e001800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_uzp2: + INST_ARM64 + dd 0x0e005800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_xtn: + INST_ARM64 + dd 0x0e212800 + dd ARM64_vector_narrow_extract_low + jmp ERROR_instruction_not_32bit +ARM_instruction_xtn2: + INST_ARM64 + dd 0x4e212800 + dd ARM64_vector_narrow_extract_high + jmp ERROR_instruction_not_32bit +ARM_instruction_zip1: + INST_ARM64 + dd 0x0e003800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit +ARM_instruction_zip2: + INST_ARM64 + dd 0x0e007800 + dd ARM64_vector_bhsd_three_reg + jmp ERROR_instruction_not_32bit + +;special + +ARM_instruction_crc32: + jmp CRC_32 + +ARM_set_virtual: + call allocate_structure_data + mov al,[IT_anchor_distance] + mov ecx,[potential_IT_anchor] + mov edx,[explicit_IT_state] + mov ebp,[current_IT_block] + mov word[ebx],ARM_set_virtual-instruction_handler + mov [ebx+2],al + mov [ebx+4],ecx + mov [ebx+8],edx + mov [ebx+12],ebp + mov ax,[anchor_instruction] + mov [ebx+16],ax + xor eax,eax + mov [IT_anchor_distance],al + mov [potential_IT_anchor],eax + mov [explicit_IT_state],eax + mov [current_IT_block],eax + mov [anchor_instruction],ax + jmp instruction_assembled + +ARM_square_parser: + mov al,'[' + stosb + .next: + lodsb + test al,al + jz .close + cmp al,']' + jz .done + cmp al,',' + jz .store + cmp al,'#' + jz .store + cmp al,01ah + jnz .expression + lodsb + movzx ecx,al + push edi + mov edi,symbols + call get_symbol + pop edi + jnc .symbol + sub esi,1 + .expression: + sub esi,1 + mov al,'(' + stosb + push edi + call convert_expression + pop eax + cmp byte[eax],'!' + jnz .converted_okay + inc esi + .converted_okay: + mov al,')' + .store: + stosb + jmp .next + .symbol: + stosw + jmp .next + .close: + dec esi + .done: + stosb + jmp argument_parsed + +ARM_curly_parser: + mov al,0x91 + stosb + .next: + lodsb + test al,al + jz .close + cmp al,'}' + jz .done + cmp al,',' + jz .store + cmp al,'[' + jz .store + cmp al,']' + jz .store + cmp al,'-' + jz .store + cmp al,'#' + jz .store + cmp al,01ah + jnz .expression + lodsb + movzx ecx,al + push edi + mov edi,symbols + call get_symbol + pop edi + jnc .symbol + sub esi,1 + .expression: + sub esi,1 + mov al,'(' + stosb + push edi + call convert_expression + pop eax + cmp byte[eax],'!' + jnz .converted_okay + inc esi + .converted_okay: + mov al,')' + .store: + stosb + jmp .next + .symbol: + stosw + jmp .next + .close: + dec esi + stosb + jmp argument_parsed + .done: + mov al,0x92 + stosb + jmp argument_parsed + +ARM_calculate_expression: + xor eax,eax + mov [edi+8],eax + mov [edi+12],eax + push [error] [error_info] [error_line] + mov [error_line],0 + mov [value_size],0 + cmp byte[esi],'.' ;float? + jnz .size_known + mov [value_size],4 + .size_known: + call calculate_expression + mov ecx,[error_line] + test ecx,ecx + jz .no_error + mov [ARM_error_line],ecx + pop ecx + test ecx,ecx + jz .new_error + mov [error_line],ecx + pop [error_info] [error] + stc + ret + .new_error: + pop ecx ecx + stc + ret + .no_error: + pop [error_line] [error_info] [error] + clc + ret + +ARM_defer_error: + mov ebp,UNENCODEABLE_INSTRUCTION_ARM + cmp [error_line],0 + jne @f + mov [error],ecx + mov ecx,[current_line] + mov [error_line],ecx + @@: mov ecx,[current_line] + mov [ARM_error_line],ecx + ret + +ARM_store_instruction_with_error: + call ARM_defer_error + jmp ARM_store_instruction.store +ARM_store_instruction: + cmp ebp,0xf shl 28 + jb .unconditional_okay + mov ah,[instruction_condition] + and ah,0xf0 + cmp ah,0xe0 + jb ERROR_instruction_not_conditional + .unconditional_okay: + cmp [explicit_IT_state],0 + jz .explicit_okay + mov cl,byte[explicit_IT_state] ;get currently specified condition + mov ch,[instruction_condition] + and cx,0xf0f0 + cmp ch,cl + mov ecx,ERROR_condition_does_not_match_IT_specifier + jnz ARM_store_instruction_with_error + .explicit_okay: + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + test eax,3 + mov ecx,ERROR_instruction_not_aligned + jnz ARM_store_instruction_with_error + .store: + shr [explicit_IT_state],8 + cmp [error_line],0 + jz .store_instruction + mov ecx,[current_line] + cmp [ARM_error_line],ecx + jnz .store_instruction + cmp [current_pass],1 + jbe .store_instruction + cmp [error],ERROR_immediate_cannot_be_encoded + jz .soft_error + cmp [error],ERROR_immediate_offset_out_of_range + jz .soft_error + cmp [error],ERROR_value_out_of_range + jne .store_instruction + .soft_error: + or ebp,-1 ;set to this value so that we can use if/else/end if to detect unencodable instructions + .store_instruction: + mov [edi],ebp + add edi,4 + jmp instruction_assembled + +ARM64_store_instruction: + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + test eax,3 + mov ecx,ERROR_instruction_not_aligned + jnz ARM_store_instruction_with_error + .store: + cmp [error_line],0 + jz .store_instruction + mov ecx,[current_line] + cmp [ARM_error_line],ecx + jnz .store_instruction + cmp [current_pass],1 + jbe .store_instruction + cmp [error],ERROR_immediate_cannot_be_encoded + jz .soft_error + cmp [error],ERROR_immediate_offset_out_of_range + jz .soft_error + cmp [error],ERROR_value_out_of_range + jne .store_instruction + .soft_error: + or ebp,-1 ;set to this value so that we can use if/else/end if to detect unencodable instructions + .store_instruction: + mov [edi],ebp + add edi,4 + jmp instruction_assembled + +;we must supply this function for expressi.inc to assemble +;called by exprcalc.inc during store +get_size_operator: + xor ah,ah + cmp al,11h + jne .no_size_operator + mov [size_declared],1 + lods word[esi] + xchg al,ah + mov [operand_flags],1 + cmp ah,[operand_size] + je .size_operator_ok + cmp [operand_size],0 + jne operand_sizes_do_not_match + mov [operand_size],ah + .size_operator_ok: + ret + .no_size_operator: + mov [size_declared],0 + cmp al,'[' + jne .size_operator_ok + mov [operand_flags],0 + ret + +;we must provide this function for assemble.inc + +segment_prefix = ERROR_illegal_instruction + +;use a custom instruction searcher to convert '~~' to conditionals + +conditional_strings: + db 'eq',0,0x00 + db 'ne',0,0x10 + db 'cs',0,0x20 + db 'cc',0,0x30 + db 'mi',0,0x40 + db 'pl',0,0x50 + db 'vs',0,0x60 + db 'vc',0,0x70 + db 'hi',0,0x80 + db 'ls',0,0x90 + db 'ge',0,0xa0 + db 'lt',0,0xb0 + db 'gt',0,0xc0 + db 'le',0,0xd0 + db 'al',0,0xe0 + db 'hs',0,0x20 + db 'lo',0,0x30 + db 0 + +ARM_get_instruction: + ;esi=pointer to string + ;ecx=length of string + push esi ecx + call ARM_find_instruction + jnc .found + lea edi,[converted+ecx-2] + .try_condition: + cmp edi,converted + jbe .not_found + mov ax,[edi] + mov esi,conditional_strings + .next_condition: + cmp ax,[esi] + jz .condition_matched + add esi,4 + cmp byte[esi],0 + jnz .next_condition + .next_position: + dec edi + jmp .try_condition + .condition_matched: + push dword[edi] + mov word[edi],CONDITION_SEARCH_CHARACTER*0x101 + movzx eax,byte[esi+3] + push eax edi + mov esi,converted + call ARM_find_instruction + pop edi edx + pop dword[edi] + jc .next_position + or al,dl + .found: + pop ecx esi + add esi,ecx + clc + ret + .not_found: + pop ecx esi + stc + ret + +ARM_find_instruction: + push esi + mov ebp,ecx + mov byte[characters+CONDITION_SEARCH_CHARACTER],CONDITION_SEARCH_CHARACTER + call lower_case + mov byte[characters+CONDITION_SEARCH_CHARACTER],0 + mov ecx,ebp + cmp cl,16 + ja .no_instruction + sub cl,1 + jc .no_instruction + mov ebx,[instructions+ecx*8] + add ebx,instructions + mov edx,[instructions+ecx*8+4] + .scan_instructions: + or edx,edx + jz .no_instruction + mov eax,edx + shr eax,1 + lea edi,[ebp+3] + imul eax,edi + lea edi,[ebx+eax] + mov esi,converted + mov ecx,ebp + repe cmps byte [esi],[edi] + ja .instructions_up + jb .instructions_down + pop esi + add esi,ebp + mov al,[edi] + mov bx,[edi+1] + clc + ret + .no_instruction: + pop esi + mov ecx,ebp + stc + ret + .instructions_down: + shr edx,1 + jmp .scan_instructions + .instructions_up: + lea ebx,[edi+ecx+3] + shr edx,1 + adc edx,-1 + jmp .scan_instructions + +;custom handler to store address of line start + +virtual + INST_ARM64 + assert $-1=$$ + load ARM64_ENCODING byte from $-1 +end virtual +virtual + INST_ARM64S + assert $-1=$$ + load ARM64S_ENCODING byte from $-1 ;for instruction that allow setting the flags +end virtual +virtual + INST_ARM64V + assert $-1=$$ + load ARM64V_ENCODING byte from $-1 ;for instruction that allow setting the flags +end virtual + +ARM_instruction_handler: + movzx ebx,word[esi] + mov al,[esi+2] + add esi,3 + mov [force_wide_flag],esi + POP vdx + add ebx,edx + cmp ebx,ARM_code_generator_start ;directives and other non-instructions + jb .execute + cmp byte[ebx],ARM64_ENCODING + jz .check_64bit + cmp byte[ebx],ARM64S_ENCODING + jz .check_64bit + cmp byte[ebx],ARM64V_ENCODING + jz .check_64bit + test [code_type],CPU_ACTIVITY_ARM64 + jnz ERROR_instruction_not_64bit + .execute: + jmp vbx + .check_64bit: + test [code_type],CPU_ACTIVITY_ARM64 + jnz .64bit + add ebx,9 + cmp byte[ebx-9],ARM64V_ENCODING + jnz .execute_ARM + add ebx,4 + .execute_ARM: + jmp vbx + .64bit: + cmp byte[ebx],ARM64S_ENCODING + jz .64bit_s + test al,FLAG_CONDITION_SET + jnz ERROR_cannot_set_flags + cmp byte[ebx],ARM64V_ENCODING + jz .64bit_v + .64bit_s: + mov ecx,[ebx+1] ;get instruction template + mov edx,ecx + or edx,1 shl 29 ;set S + test al,FLAG_CONDITION_SET + cmovnz ecx,edx + cmp al,0xe0 + jb ERROR_instruction_not_conditional + mov ebx,[ebx+5] + jmp vbx + .64bit_v: + mov ecx,[ebx+1] ;get scalar instruction template + mov edx,[ebx+5] ;get vector instruction template + cmp al,0xe0 + jb ERROR_instruction_not_conditional + mov ebx,[ebx+9] + jmp vbx + +ARM_opcode_swap_table: + db (0eh xor 00h) ;0 - and --> bic, invert + db 0 ;1 - eor + db (04h xor 02h)+0x80 ;2 - sub --> add, negate + db 0 ;3 - rsb + db (02h xor 04h)+0x80 ;4 - add --> sub, negate + db (06h xor 05h)+0x80 ;5 - adc --> sbc, negate + db (05h xor 06h)+0x80 ;6 - sbc --> adc, negate + db 0 ;7 - rsc + db 0 ;8 - tst + db 0 ;9 - teq + db (0bh xor 0ah)+0x80 ;a - cmp --> cmn, negate + db (0ah xor 0bh)+0x80 ;b - cmn --> cmp, negate + db 0 ;c - orr + db (0fh xor 0dh) ;d - mov --> mvn, invert + db (00h xor 0eh) ;e - bic --> and, invert + db (0dh xor 0fh) ;f - mvn --> mov, invert + +ARM_encode_immediate_with_opcode_swap: + call ARM_encode_immediate + jnc .done + mov eax,[arm_instruction] + shr eax,21 + and eax,0xf + mov al,[eax+ARM_opcode_swap_table] + test al,al + jz .fail + mov ecx,[immediate_value] + not ecx + test al,0x80 + jz .try + inc ecx + and eax,0xf + .try: + mov [immediate_value],ecx + shl eax,21 + xor [arm_instruction],eax + xor ebp,eax + call ARM_encode_immediate + jnc .done + .fail: + stc + .done: + ret + +ARM_encode_immediate: + mov eax,[immediate_value] + xor ecx,ecx + .try: + cmp eax,0ffh + jbe .immediate_ok + add ch,1 + rol eax,2 + cmp ch,010h + jb .try + stc + ret + .immediate_ok: + or eax,ecx + mov [immediate_value],eax + clc + ret + +THUMB_opcode_swap_table: + db (01h xor 00h) ;0 - and --> bic, invert + db (00h xor 01h) ;1 - bic --> and, invert + db (03h xor 02h) ;2 - mov --> mvn, invert, also orr --> orn, invert + db (02h xor 03h) ;3 - mvn --> mov, invert, also orn --> orr, invert + db 0 ;4 - eor, teq + db 0 ;5 - + db 0 ;6 - + db 0 ;7 - + db (0dh xor 08h)+0x80 ;8 - add --> sub, negate, also cmn --> cmp, negate + db 0 ;9 - + db (0bh xor 0ah)+0x80 ;a - adc --> sbc, negate + db (0ah xor 0bh)+0x80 ;b - sbc --> adc, negate + db 0 ;c - + db (08h xor 0dh)+0x80 ;d - sub --> add, negate, also cmp --> cmn, negate + db 0 ;e - rsb + db 0 ;f - + +THUMB_encode_immediate_with_opcode_swap: + call THUMB_encode_immediate + jnc .done + mov eax,[thumb32_instruction] + shr eax,21 + and eax,0xf + mov al,[eax+THUMB_opcode_swap_table] + test al,al + jz .fail + mov ecx,[immediate_value] + not ecx + test al,0x80 + jz .try + inc ecx + and eax,0xf + .try: + mov [immediate_value],ecx + shl eax,21 + xor [thumb32_instruction],eax + xor ebp,eax + call THUMB_encode_immediate + jnc .done + .fail: + stc + .done: + ret + +THUMB_encode_immediate: + mov eax,[immediate_value] + xor edx,edx + bsr ecx,eax + jz .immediate_ok + sub ecx,8 + jb .immediate_ok + mov edx,2 + shl edx,cl + dec edx + test eax,edx + jnz .check_special_combos + sub ecx,31 + neg ecx + mov edx,ecx + shl edx,7 + rol eax,cl + and eax,0x7f + jmp .immediate_ok + .check_special_combos: + mov ecx,eax + shr ecx,16 + cmp ax,cx + jnz .fail + mov edx,1 shl 8 + cmp ah,0 ;0X0X + jz .immediate_ok + mov edx,2 shl 8 + xchg ah,al + cmp ah,0 ;X0X0 + jz .immediate_ok + mov edx,3 shl 8 + movzx eax,al + cmp ch,cl ;XXXX + jz .immediate_ok + .fail: + stc + ret + .immediate_ok: + or eax,edx + mov [immediate_value],eax + clc + ret + +THUMB_check_12bit_immediate: + mov eax,[immediate_value] + mov ecx,eax + neg ecx + cmovns eax,ecx + test eax,not 0xfff + jnz .fail + ;check for fit into a modified immediate value + bsr ecx,eax + jz .fail + bsf edx,eax + sub ecx,edx + cmp ecx,8 + jb .fail + clc + ret + .fail: + stc + ret + +PREDEFINED_LABEL_PROCESSOR = 4 ;%p +PREDEFINED_LABEL_COPROCESSOR = 5 ;%c + +ARM_predefined_label: + or eax,eax + jz current_offset_label + cmp eax,1 + je counter_label + cmp eax,2 + je timestamp_label + cmp eax,3 + je org_origin_label + cmp eax,PREDEFINED_LABEL_PROCESSOR + je .processor_id + cmp eax,PREDEFINED_LABEL_COPROCESSOR + je .coprocessor_id + mov edx,invalid_value + jmp error_undefined + .processor_id: + mov eax,[cpu_capability_flags] + mov edx,[cpu_capability_flags2] + and eax,CPU_CAPABILITY_DEFAULT and (1 shl 32 - 1) + and edx,CPU_CAPABILITY_DEFAULT shr 32 + jmp make_qword_label_value + .coprocessor_id: + mov eax,[copro_capability_flags] + and eax,COPRO_CAPABILITY_DEFAULT + jmp make_dword_label_value + +ARM_get_predefined_id: + cmp ecx,2 + ja find_label + inc esi + cmp cl,1 + je get_counter_id + lods byte [esi] + mov ebx,characters + xlat [ebx] + cmp al,'t' + je get_timestamp_id + cmp al,'p' + je .processor_id + cmp al,'c' + je .coprocessor_id + sub esi,2 + jmp find_label + .processor_id: + mov eax,PREDEFINED_LABEL_PROCESSOR + ret + .coprocessor_id: + mov eax,PREDEFINED_LABEL_COPROCESSOR + ret + +ARM_assemble_line: + test [code_type],CPU_ACTIVITY_UNKNOWN + jz assemble_line + jmp ARM_generic_mode_checks.default + +ARM_generic_mode_checks: + test [code_type],CPU_ACTIVITY_ARM64 + jnz .arm + test [code_type],CPU_ACTIVITY_ARM + jz .other + .arm: + test al,FLAG_FORCE_NARROW + jnz ERROR_narrow_instructions_are_not_encodable_in_arm_mode + ret + .other: + test [code_type],CPU_ACTIVITY_UNKNOWN + jnz .default + mov [thumb16_error],ERROR_instruction_not_16bit + mov [thumb32_error],ERROR_instruction_not_16bit + ret + .default: + mov [code_type],CPU_ACTIVITY_ARM + mov [cpu_capability_flags],CPU_CAPABILITY_DEFAULT and (1 shl 32 - 1) + mov [cpu_capability_flags2],CPU_CAPABILITY_DEFAULT shr 32 + mov [copro_capability_flags],COPRO_CAPABILITY_DEFAULT + mov [it_control],IT_MODE_AUTO + mov [potential_IT_anchor],0 + mov [explicit_IT_state],0 + mov [current_IT_block],0 + jmp .arm + +ARM_check_shift_range: + mov eax,[immediate_value] + cmp eax,0 + jnz .shift_not_zero + ;force to LSL 0 + mov [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + and ebp,not (3 shl 5) + .shift_not_zero: + movzx ecx,[instruction_shift_op] + shl ecx,5 + or ebp,ecx + mov edx,0x1f00 ;lsl is 0 to 31 + cmp ecx,ARM_SHIFT_OPCODE_LSL shl 5 + je .check_range + mov edx,0x2001 ;lsr & asr are 1 to 32 + cmp ecx,ARM_SHIFT_OPCODE_LSR shl 5 + je .check_range + cmp ecx,ARM_SHIFT_OPCODE_ASR shl 5 + je .check_range + mov edx,0x1f01 ;ror is 1 to 31 + .check_range: + cmp eax,32 + ja .shift_out_of_range + cmp al,dl + jb .shift_out_of_range + cmp al,dh + ja .shift_out_of_range + and eax,0x1f + shl eax,7 + or ebp,eax + ret + .shift_out_of_range: + cmp edx,0x1f00 + mov ecx,ERROR_shift_value_out_of_range.0_31 + jz .defer_error + cmp edx,0x2001 + mov ecx,ERROR_shift_value_out_of_range.1_32 + jz .defer_error + cmp edx,0x1f01 + mov ecx,ERROR_shift_value_out_of_range.1_31 + jz .defer_error + ud2 + .defer_error: + call ARM_defer_error + ret + + align 4 +THUMB_UAL_s_table: + ;bit=1 instruction needs 's' modifier outside of IT block + ;bit=0 instruction never uses 's' modifier + ;everything after 0x4400 never uses 's' modifier + dd 0xffffffff ;0000-07ff lsl r,r,i5 + dd 0xffffffff ;0800-0fff lsr r,r,i5 + dd 0xffffffff ;1000-17ff asr r,r,i5 + dd 0xffffffff ;1800-1fff add r,r,r/sub r,r,r/add r,r,i3/sub r,r,i3 + dd 0xffffffff ;2000-27ff mov r,i8 + dd 0x00000000 ;2800-2fff cmp r,i8 + dd 0xffffffff ;3000-37ff add r,i8 + dd 0xffffffff ;3800-3fff sub r,i8 + dw 0xf2ff ;4000-43ff {and/eor/lsl/lsr/asr/adc/sbc/ror/tst/neg/cmp/cmn/orr/mul/bic/mvn} r,r + +THUMB_do_non_UAL_S_override: + ;in pre-UAL code a 'OP reg,...' and 'OPs reg,...' are the same and use the 'OPs' form + ;we can fake this by forcing the S version if the encoding is in range + cmp [thumb16_error],0 + jnz .16bit_okay + movzx eax,[thumb16_instruction] + shr eax,6 + test [code_type],CPU_ACTIVITY_THUMB_NON_UAL + jz .flag_set_override_done + cmp eax,0x4400 shr 6 + jae .flag_set_override_done + bt [THUMB_UAL_s_table],eax + jnc .flag_set_override_done + or [instruction_condition],FLAG_CONDITION_SET + ;every thumb32 equivalent instruction except MUL has the 's' in bit 20 + cmp eax,0x4340 shr 6 ;MUL? + jnz .do_thumb32_s_override + ;cannot be encoded in thumb32 + mov [thumb32_error],ERROR_instruction_not_16bit + jmp .flag_set_override_done + .do_thumb32_s_override: + or [thumb32_instruction],1 shl 20 + .flag_set_override_done: + ;now check the S flag + cmp eax,0x4400 shr 6 + jae .flag_must_be_unset + bt [THUMB_UAL_s_table],eax + jnc .flag_must_be_unset + test [instruction_condition],FLAG_CONDITION_SET + jnz .only_outside + ;only inside IT + or [thumb_flags_16],THUMB_FLAG_ONLY_INSIDE_IT + jmp .16bit_okay + .only_outside: + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + jmp .16bit_okay + .flag_must_be_unset: + test [instruction_condition],FLAG_CONDITION_SET + jz .16bit_okay + .16bit_unavailable: + mov [thumb16_error],ERROR_instruction_not_16bit + .16bit_okay: + ret + +THUMB_try_place_narrow_with_IT: + cmp [thumb16_error],ERROR_instruction_not_16bit + jz .unencodable + call THUMB_try_place_narrow_without_IT + jnc .done + test [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + jnz .fail + call THUMB_start_IT_block + .done: + ret + .unencodable: + mov ecx,ERROR_instruction_not_16bit + .fail: + stc + ret + +THUMB_try_place_wide_with_IT: + cmp [thumb32_error],ERROR_instruction_not_16bit + jz .unencodable + call THUMB_try_place_wide_without_IT + jnc .done + test [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + jnz .fail + call THUMB_start_IT_block + .done: + ret + .unencodable: + mov ecx,ERROR_instruction_not_16bit + .fail: + stc + ret + +THUMB_try_place_wide_without_IT: + cmp [thumb32_error],ERROR_instruction_not_16bit + jz .unencodable + mov ecx,thumb_flags_32 + jmp THUMB_try_place_without_IT + .unencodable: + mov ecx,ERROR_instruction_not_16bit + stc + ret + +THUMB_try_place_narrow_without_IT: + cmp [thumb16_error],ERROR_instruction_not_16bit + jz .unencodable + mov ecx,thumb_flags_16 + jmp THUMB_try_place_without_IT + .unencodable: + mov ecx,ERROR_instruction_not_16bit + stc + ret + +THUMB_try_place_without_IT: + ;ecx=flag check address + mov al,[instruction_condition] + and al,0xf0 + test byte[ecx],THUMB_FLAG_ONLY_INSIDE_IT + jnz .force_inside + test byte[ecx],THUMB_FLAG_NOT_INSIDE_IT + jnz .force_outside + ;decide based upon the condition + cmp al,0xf0 ;unconditional? + jae .success + cmp al,0xe0 + jb .force_inside + ;try inside with AL condition. We try to extend open IT blocks if possible + test byte[ecx],THUMB_FLAG_NOT_INSIDE_IT + jnz .success ;this can happen when an explicit IT block is used + call THUMB_extend_IT_block + clc ;always give success even if the extension failed + ret + .force_inside: + test byte[ecx],THUMB_FLAG_NOT_INSIDE_IT + jnz .fail ;this can happen when an explicit IT block is used + cmp [explicit_IT_state],0 + jnz .success + call THUMB_extend_IT_block + ret + .force_outside: + test [explicit_IT_state],2 + jnz .success + cmp [explicit_IT_state],0 + jnz .fail + cmp al,0xe0 ;AL condition? + jae .success + test byte[ecx],THUMB_FLAG_IS_BCC + jz .fail + .success: + mov [current_IT_block],0 ;since we are not extending the IT block we have to kill it + clc + ret + .fail: + mov ecx,ERROR_instruction_not_16bit + stc + ret + +THUMB_query_condition_pc: + mov ecx,edi + test [code_type],CPU_ACTIVITY_ARM + jnz .done + mov ah,[instruction_condition] + and ah,0xf0 + cmp ah,0xe0 + jae .done + push eax ecx + call THUMB_query_condition_match + pop ecx eax + setc dl + movzx edx,dl + lea ecx,[ecx+edx*2] ;adjust for IT block + .done: + ret + +THUMB_query_condition_match: + ;check to see if the current instruction would match or extend an existing IT block + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz .not_match + cmp [explicit_IT_state],0 + jnz .explicit + mov eax,[current_IT_block] + test eax,eax + jz .not_match + mov ch,[instruction_condition] + cmp ch,0xf0 + jae .not_match + mov cl,[eax] + mov edx,ecx + and ecx,0xe0e0 + cmp ch,cl + jnz .not_match + .okay: + clc + ret + .explicit: + mov cl,byte[explicit_IT_state] ;get currently specified condition + mov ch,[instruction_condition] + and cx,0xf0f0 + cmp ch,cl + jz .okay + .not_match: + stc + ret + +BKPT_force_condition_match: + ;used by BKPT + mov cl,[instruction_condition] + mov eax,[explicit_IT_state] + test eax,eax + jnz .explicit + mov eax,[current_IT_block] + test eax,eax + jz .done + mov al,[eax] + .explicit: + and al,0xf0 + and cl,0x0f + or al,cl + mov [instruction_condition],al + .done: + ret + +THUMB_check_condition: + mov al,[instruction_condition] + and al,0xf0 + cmp [explicit_IT_state],0 + jnz .explicit + .not_explicit: + cmp al,0xe0 ;AL condition? + jz .okay + test [thumb_flags_32],THUMB_FLAG_IS_BCC + jnz .okay + cmp al,0xf0 + jz .not_conditional + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + mov ecx,ERROR_requires_cpu_capability_arm_7m + jz .fail + .inside: + or [thumb_flags_16],THUMB_FLAG_ONLY_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_INSIDE_IT + .okay: + clc + ret + .not_conditional: + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + jmp .okay + .explicit: + mov edx,[explicit_IT_state] + test edx,2 + jnz .not_explicit + cmp al,0xf0 ;AL condition? + jz ERROR_instruction_not_conditional + test [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + jz .check_explicit_match + mov ecx,ERROR_instruction_must_be_last_in_IT_block + test edx,0xffffff00 ;must be no more conditions + jnz .fail + .check_explicit_match: + and dl,0xf0 + cmp al,dl + jz .inside + mov ecx,ERROR_condition_does_not_match_IT_specifier + .fail: + stc + ret + +THUMB_start_IT_block: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz .capability + mov al,[instruction_condition] + and eax,0xf0 + cmp al,0xf0 + jae .cannot_start + cmp al,0xe0 + jnz .make_new_IT_here + call THUMB_convert_anchor + jnc .okay + .make_new_IT_here: + mov [potential_IT_anchor],0 + or eax,0xbf08 + mov [current_IT_block],edi + mov [edi],ax + add edi,2 + .okay: + clc + ret + .cannot_start: + mov ecx,ERROR_instruction_not_conditional + stc + ret + .capability: + mov ecx,ERROR_requires_cpu_capability_arm_7m + stc + ret + +THUMB_convert_anchor: + test [it_control],IT_MODE_AUTO + jz .cannot_convert + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz .cannot_convert + mov al,[instruction_condition] + and eax,0xf0 + cmp al,0xf0 + jae .cannot_convert + cmp al,0xe0 + jnz .cannot_convert + mov cl,[IT_anchor_distance] + cmp cl,3 + ja .cannot_convert + mov eax,[potential_IT_anchor] + test eax,eax + jz .cannot_convert + mov dx,[anchor_instruction] + shl edx,16 + or edx,0xbfe0 + mov ch,0x10 + shr ch,cl + movzx ecx,ch + or edx,ecx + mov [current_IT_block],eax + mov [eax],edx + mov [potential_IT_anchor],0 + clc + ret + .cannot_convert: + stc + ret + +THUMB_extend_IT_block: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz .cannot_extend + mov eax,[current_IT_block] + test eax,eax + jz .cannot_extend + cmp [explicit_IT_state],0 + jnz .okay + mov ch,[instruction_condition] + cmp ch,0xf0 + jae .cannot_extend + mov cl,[eax] + mov edx,ecx + and ecx,0xe0e0 + cmp ch,cl + jnz .cannot_extend + bsf ecx,edx + test ecx,ecx + jz .cannot_extend + shr dh,4 + and dh,0x1 + shl dh,cl + btr edx,ecx + or dl,dh + dec ecx + bts edx,ecx + mov [eax],dl + .okay: + clc + ret + .cannot_extend: + mov [current_IT_block],0 + stc + ret + +ARM_post_process_simd_with_error: + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction_with_error + mov [thumb32_error],ecx + jmp THUMB_post_process + +ARM_post_process_simd_convert_table: + db 0x00 ;f0 ---> invalid + db 0x00 ;f1 ---> invalid + db 0xef ;f2 ---> ef + db 0xff ;f3 ---> ff + db 0xf9 ;f4 ---> f9 + db 0x00 ;f5 ---> invalid + db 0x00 ;f6 ---> invalid + db 0x00 ;f7 ---> invalid + db 0x00 ;f8 ---> invalid + db 0x00 ;f9 ---> invalid + db 0x00 ;fa ---> invalid + db 0x00 ;fb ---> invalid + db 0x00 ;fc ---> invalid + db 0x00 ;fd ---> invalid + db 0xfe ;fe ---> fe + db 0x00 ;ff ---> invalid + +ARM_post_process_simd: + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction + mov [thumb32_error],0 + mov eax,ebp + shr eax,24 + sub eax,0xf0 + jb .fatal_error + movzx eax,byte[eax+ARM_post_process_simd_convert_table] + test eax,eax + jz .fatal_error + shl eax,24 + and ebp,not 0xff000000 + or eax,ebp + mov [thumb32_instruction],eax + jmp THUMB_post_process + .fatal_error: + jmp ERROR_thumb_recode_error + +ARM_post_process_copro_with_error: + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction_with_error + jmp ARM_post_process_copro.thumb + +ARM_post_process_copro: + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + xor ecx,ecx + .thumb: + mov [thumb32_instruction],ebp + mov [thumb32_error],ecx + cmp ebp,0xf shl 28 ;is it a '2' version? + jae THUMB_post_process + and ebp,not (0xf shl 28) + or ebp,0xe shl 28 + mov [thumb32_instruction],ebp + jmp THUMB_post_process + +THUMB_post_process: + cmp [thumb16_error],0 + jz .forced_wide_done + cmp [thumb32_error],0 + jnz .forced_wide_done + mov ax,[passes_limit] + sub ax,[current_pass] + cmp ax,6 + ja .forced_wide_done + mov eax,[force_wide_flag] + mov cl,[eax-1] + and cl,FLAG_FORCE_AUTO_WIDE + shr cl,FLAG_BIT_FORCE_AUTO_WIDE - FLAG_BIT_FORCE_WIDE + or cl,FLAG_FORCE_AUTO_WIDE + or [eax-1],cl + .forced_wide_done: + call THUMB_do_non_UAL_S_override + call THUMB_check_condition + jc .fail + test [instruction_condition],FLAG_FORCE_NARROW + jz .narrow_not_forced + call THUMB_try_place_narrow_with_IT + jnc .store_narrow + jmp .fail + .narrow_not_forced: + test [instruction_condition],FLAG_FORCE_WIDE + jz .wide_not_forced + call THUMB_try_place_wide_with_IT + jnc .store_wide + jmp .fail + .wide_not_forced: + cmp [thumb16_error],0 + setz al + cmp [thumb32_error],0 + setz ah + xor al,ah + jnz .no_free_choice + test ah,ah + jnz .free_choice_without_error_copy + mov ecx,[thumb32_error] + cmp ecx,ERROR_instruction_not_16bit + jz .free_choice_without_error_copy + mov [thumb16_error],ecx + .free_choice_without_error_copy: + call THUMB_try_place_narrow_without_IT + jnc .store_narrow + call THUMB_convert_anchor + jc .not_converted + call THUMB_try_place_narrow_without_IT + jnc .store_narrow + .not_converted: + call THUMB_try_place_wide_without_IT + jnc .store_wide + call THUMB_try_place_narrow_with_IT + jnc .store_narrow + call THUMB_try_place_wide_with_IT + jnc .store_wide + cmp ecx,ERROR_instruction_not_16bit + jnz .fail + mov eax,[thumb32_error] + test eax,eax + cmovnz ecx,eax + jmp .fail + .no_free_choice: + test ah,ah + jz .not_prefer_wide + call THUMB_try_place_wide_with_IT + jnc .store_wide + jmp .fail + .not_prefer_wide: + call THUMB_try_place_narrow_with_IT + jnc .store_narrow + jmp .fail + .store_narrow: + mov ecx,[thumb16_error] + movzx ebp,[thumb16_instruction] + test ecx,ecx + jnz THUMB_store_instruction_16_with_error + jmp THUMB_store_instruction_16 + .store_wide: + mov ecx,[thumb32_error] + mov ebp,[thumb32_instruction] + test ecx,ecx + jnz THUMB_store_instruction_32_with_error + jmp THUMB_store_instruction_32 + .fail: +; jmp THUMB_store_instruction_16_with_error + +THUMB_store_instruction_16_with_error: + call ARM_defer_error + jmp THUMB_store_instruction_16.store +THUMB_store_instruction_16: + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + test eax,1 + mov ecx,ERROR_instruction_not_aligned + jnz THUMB_store_instruction_16_with_error + .store: + mov [edi],bp + mov ebp,2 + jmp THUMB_finalise_instruction + +THUMB_store_instruction_32_with_error: + call ARM_defer_error + jmp THUMB_store_instruction_32.store +THUMB_store_instruction_32: + mov eax,[addressing_space] + mov eax,[eax+0x00] + sub eax,edi + neg eax + test eax,1 + mov ecx,ERROR_instruction_not_aligned + jnz THUMB_store_instruction_32_with_error + .store: + ror ebp,16 ;swap the hword endian + mov [edi],ebp + mov ebp,4 + jmp THUMB_finalise_instruction + +THUMB_finalise_instruction: + mov al,[IT_anchor_distance] + add al,1 + sbb al,0 + mov [IT_anchor_distance],al + add edi,ebp + mov ecx,[explicit_IT_state] + btr [explicit_IT_state],1 + jc .explicit_beginning + shr [explicit_IT_state],8 + .explicit_beginning: + test ecx,ecx + jnz instruction_assembled + mov eax,[current_IT_block] + test eax,eax + jz .check_potential_IT_anchor + test [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + jnz .kill_implicit_IT_block + test byte[eax],1 ;end of condition? + jz instruction_assembled + .kill_implicit_IT_block: + mov [current_IT_block],0 + jmp instruction_assembled + .check_potential_IT_anchor: + cmp [instruction_condition],0xe0 + jb .kill_potential_anchor + cmp [instruction_condition],0xf0 + jae .kill_potential_anchor + cmp ebp,4 + jnz .check_potential_anchor_extension + cmp [thumb16_error],0 + jnz .check_potential_anchor_extension + test [instruction_condition],FLAG_CONDITION_SET + FLAG_FORCE_WIDE + jnz .check_potential_anchor_extension + lea eax,[edi-4] ;make a new anchor + mov cx,[thumb16_instruction] + mov [IT_anchor_distance],1 + mov [potential_IT_anchor],eax + mov [anchor_instruction],cx + jmp instruction_assembled + .check_potential_anchor_extension: + cmp [potential_IT_anchor],0 + jz instruction_assembled + cmp ebp,2 + jnz .check_potential_anchor_extension_32 + test [instruction_condition],FLAG_CONDITION_SET + jnz .kill_potential_anchor + .check_potential_anchor_extension_32: + test [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + THUMB_FLAG_ONLY_LAST_IT + THUMB_FLAG_IS_BCC + jnz .kill_potential_anchor + cmp [IT_anchor_distance],4 + jbe instruction_assembled ;anchor extention is okay + .kill_potential_anchor: + mov [potential_IT_anchor],0 + jmp instruction_assembled + +ARM_define_label: + cmp [explicit_IT_state],0 + jnz ERROR_label_inside_IT_block + mov [current_IT_block],0 + mov [potential_IT_anchor],0 + jmp define_label + +ARM_end_virtual: + call find_structure_data + jc .ret + sub ebx,0x18 + mov al,[ebx+2] + mov ecx,[ebx+4] + mov edx,[ebx+8] + mov ebp,[ebx+12] + mov [IT_anchor_distance],al + mov [potential_IT_anchor],ecx + mov [explicit_IT_state],edx + mov [current_IT_block],ebp + mov ax,[ebx+16] + mov [anchor_instruction],ax + call remove_structure_data + add ebx,0x18 + .ret: + ret + +ARM_fit_operator: + POP vdx + je calculate_not + cmp al,0D1h ;FIT? + je .calculate_fit + jmp vdx + .calculate_fit: + cmp word [edi+8],0 + jne invalid_expression + cmp byte [edi+12],0 + je .fit_ok + cmp [error_line],0 + jne .fit_ok + mov eax,[current_line] + mov [error_line],eax + mov [error],invalid_use_of_symbol + .fit_ok: + xor ebx,ebx + test [code_type],CPU_ACTIVITY_ARM64 + jnz .fit_mask_test64 + mov eax,[edi] + mov edx,[edi+4] + test edx,edx + jz .fit_test + cdq + cmp edx,[edi+4] + jnz .fit_done + .fit_test: + push [immediate_value] + mov ebp,ARM_encode_immediate + mov edx,THUMB_encode_immediate + test [code_type],CPU_ACTIVITY_ARM + cmovz ebp,edx + mov [immediate_value],eax + call vbp + setnc bl ;bit-0 = can fit normal + mov eax,1 shl CPU32_CAPABILITY_T2 + mov ecx,1 shl CPU32_CAPABILITY_7M + test [code_type],CPU_ACTIVITY_ARM + cmovz eax,ecx + test [cpu_capability_flags],eax + jz .movw_done + cmp [immediate_value],1 shl 16 + setb cl + shl cl,3 + or bl,cl ;bit-3 = can fit movw + .movw_done: + mov eax,[edi] + not eax + mov [immediate_value],eax + call vbp + setnc cl + shl cl,1 + or bl,cl ;bit-1 = can fit inverted + mov eax,[edi] + neg eax + mov [immediate_value],eax + call vbp + setnc cl + shl cl,2 + or bl,cl ;bit-2 = can fit negated + pop [immediate_value] + .fit_done: + mov [edi],ebx ;set low dword + mov dword[edi+4],0 ;set high dword + mov byte[edi+13],0 ;set sign + add edi,14h + jmp calculation_loop + .fit_mask_test64: + push [immediate_value] + push [immediate_value_high] + mov eax,[edi] + mov edx,[edi+4] + mov [immediate_value],eax + mov [immediate_value_high],edx + push ebx + call ARM64_encode_bitmask + pop ebx + setnc bl ;bit-0 = can fit in 64 bit mask + mov eax,[edi] + mov edx,[edi+4] + test edx,edx + jz .fit_mask_test32 + cdq + cmp edx,[edi+4] + jnz .fit_mask_done + .fit_mask_test32: + mov [immediate_value],eax + mov [immediate_value_high],eax + push ebx + call ARM64_encode_bitmask + pop ebx + setnc cl + shl cl,1 + or bl,cl ;bit-1 = can fit in 32 bit mask + .fit_mask_done: + pop [immediate_value_high] + pop [immediate_value] + jmp .fit_done + +ARM_processor_directives: + ;called during parsing + cmp bx,ARM_processor_directive-instruction_handler + jz .enable_cpu_selection_symbols + cmp bx,ARM_coprocessor_directive-instruction_handler + jnz .done + .enable_cpu_selection_symbols: + mov [decorator_symbols_allowed],1 + .done: + ret + +ARM_parse_processor_separators: + ;called during parsing + cmp al,'-' + je separator + cmp al,'+' + je separator + jmp not_a_separator + +ARM_check_operator: + ;called during parsing + cmp al,8Fh ;processor? + je .get_symbol + cmp al,8Eh ;coprocessor? + jne argument_parsed + .get_symbol: + mov [decorator_symbols_allowed],1 + inc esi + movzx ecx,byte [esi] + inc esi + push edi + call get_symbol + pop edi + mov [decorator_symbols_allowed],0 + lea esi,[esi-2] + jc argument_parsed + add esi,2 + stosw + jmp argument_parsed + +ARM_check_processor: + ;called during assembly + je .used + cmp al,8Fh + je .processor + cmp al,8Eh + je .coprocessor + ret + .used: + add esp,4 + __is_64 * 4 + jmp check_for_used + .processor: + add esp,4 + __is_64 * 4 + inc esi + lodsw + xchg ah,al + cmp ax,cpu_sel + jb ERROR_expecting_CPU_selection_symbol + cmp ax,cpu_sel + cpu_sel.size + jae ERROR_expecting_CPU_selection_symbol + sub ax,cpu_sel + mov ecx,[cpu_capability_flags] + mov ebx,[cpu_capability_flags2] + jmp .symbol_okay + .coprocessor: + add esp,4 + __is_64 * 4 + inc esi + lodsw + xchg ah,al + cmp ax,copro_sel + jb ERROR_expecting_COPRO_selection_symbol + cmp ax,copro_sel + copro_sel.size + jae ERROR_expecting_COPRO_selection_symbol + sub ax,copro_sel + mov ecx,[copro_capability_flags] + xor ebx,ebx + .symbol_okay: + cmp ax,32 + cmovae ecx,ebx + bt ecx,eax + jc return_true + jmp return_false + +;V1 + +ARM_rd_rn_shifter: + ;used by ADC, ADD, AND, BIC, EOR, ORR, RSB, RSC, SBC, SUB + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ; 0=reg,imm alternate for reg,reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ; 1=reg,byte,rot alternate for reg,reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ; 2=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ; 3=reg,reg,rrx alternate for reg,reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ; 4=reg,reg,shift imm alternate for reg,reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg>,\ ; 5=reg,reg,shift reg alternate for reg,reg,reg,shift reg + <TMPL_base_reg,TMPL_base_reg,TMPL_imm>,\ ; 6=reg,reg,imm + <TMPL_base_reg,TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ; 7=reg,reg,byte,rot + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg>,\ ; 8=reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ; 9=reg,reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;10=reg,reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg> ;11=reg,reg,reg,shift reg + movzx eax,al + mov ecx,eax + shl ecx,24 + or eax,ecx + cmp al,6 + jae .encode_instruction + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + or edx,ecx + mov [operand_registers],edx + .encode_shifter: + ;used by ADC, ADD, AND, BIC, EOR, ORR, RSB (NEG), RSC, SBC, SUB + ;used by MOV (LSL, LSR, ASR, ROR, RRX), MVN, CMN, CMP, TEQ, TST + add al,6 + .encode_instruction: + ;used by ADR, MOV reg,exp + cmp [operand_register0],0xf + jnz .pc_check_done + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + .pc_check_done: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_rd_rn_shifter + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + .encode: + ;used by CMNP, CMPP, TEQP, TSTP + cmp al,6 + jz .reg_reg_imm + cmp al,7 + jz .reg_reg_byte_rot + cmp al,8 + jz .reg_reg_reg + cmp al,9 + jz .reg_reg_reg_rrx + cmp al,10 + jz .reg_reg_reg_shift_imm + cmp al,11 + jz .reg_reg_reg_shift_reg + ud2 + .reg_reg_byte_rot: + cmp [immediate_value],0xff + ja .byte_out_of_range + test [immediate_value2],not (0xf shl 1) + jnz .rotation_out_of_range + mov eax,[immediate_value2] + shl eax,8-1 + or [immediate_value],eax + jmp .reg_reg_imm_make + .reg_reg_imm: + call ARM_encode_immediate_with_opcode_swap + jc .immediate_out_of_range + .reg_reg_imm_make: + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + or ebp,eax + bts ebp,25 + jmp ARM_store_instruction + .reg_reg_reg_shift_imm: + call ARM_check_shift_range + .reg_reg_reg: + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + or ebp,eax + jmp ARM_store_instruction + .reg_reg_reg_shift_reg: + movzx eax,[operand_register0] + cmp al,0xf + jz ERROR_r15_not_valid.all + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + cmp al,0xf + jz ERROR_r15_not_valid.all + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + cmp al,0xf + jz ERROR_r15_not_valid.all + or ebp,eax + movzx eax,[instruction_shift_op] + shl eax,5 + or ebp,eax + movzx eax,[operand_register3] + cmp al,0xf + jz ERROR_r15_not_valid.all + shl eax,8 + or ebp,eax + bts ebp,4 + jmp ARM_store_instruction + .reg_reg_reg_rrx: + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + or ebp,eax + or ebp,ARM_SHIFT_OPCODE_ROR shl 5 + jmp ARM_store_instruction + .immediate_out_of_range: + mov ecx,ERROR_immediate_cannot_be_encoded + jmp ARM_store_instruction_with_error + .byte_out_of_range: + mov ecx,ERROR_byte_value_out_of_range + jmp ARM_store_instruction_with_error + .rotation_out_of_range: + mov ecx,ERROR_rotation_value_out_of_range + jmp ARM_store_instruction_with_error + +ARM_rd_shifter: + ;used by MVN + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;1=reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ;2=reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ;3=reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;4=reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg> ;5=reg,reg,shift reg + .encode: + cmp al,0 + jnz .do + mov ecx,[immediate_value] + cmp ecx,0xffff + ja .do + test ebp,1 shl 22 ;1=mvn + jnz .do + test [instruction_condition],FLAG_CONDITION_SET + jnz .do + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB + push eax ecx + call ARM_encode_immediate + pop [immediate_value] eax + jnc .do + and ebp,0xf shl 28 + or ebp,0x03000000 ;switch to movw + jmp ARM_rd_imm16.do ;do movw + .THUMB: + push eax [immediate_value] + call THUMB_encode_immediate + pop [immediate_value] eax + jnc .do + mov [thumb32_instruction],0xf2400000 ;switch to movw + jmp ARM_rd_imm16.do ;do movw + .do: + ;used by CPY + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + mov dh,0 + or edx,ecx + mov [operand_registers],edx + jmp ARM_rd_rn_shifter.encode_shifter + +ARM_rd_shifter_exp: + ;used by MOV + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;1=reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ;2=reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ;3=reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;4=reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg>,\ ;5=reg,reg,shift reg + <TMPL_base_reg,TMPL_expression> ;6=reg,exp converted to add reg,reg,imm + cmp al,6 + jb ARM_rd_shifter.encode + xor ebp,(ARM_INSTRUCTION_OPCODE_MOV xor ARM_INSTRUCTION_OPCODE_ADD) shl 21 + xor [arm_instruction],(ARM_INSTRUCTION_OPCODE_MOV xor ARM_INSTRUCTION_OPCODE_ADD) shl 21 + xor [thumb32_instruction],(0x2 shl 21 + 0xf shl 16) xor (0x8 shl 21) + jmp ARM_rd_rn_shifter.encode_instruction + +ARM_rd_rn_shift: + ;used by LSL, LSR, ASR, ROR + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm alternate for reg,reg,imm + <TMPL_base_reg,TMPL_base_reg>,\ ;1=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_imm>,\ ;2=reg,reg,imm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;3=reg,reg,reg + mov ecx,ebp + shr ecx,5 + and ecx,3 + mov [instruction_shift_op],cl + ;make the thumb32 opcode + test al,1 + jz .reg_reg_imm + ;for reg,reg,reg + shl ecx,21 + or ecx,0xfa00f000 + mov [thumb32_instruction],ecx + jmp .thumb32_done + .reg_reg_imm: + shl ecx,4 + or ecx,0xea4f0000 + mov [thumb32_instruction],ecx + .thumb32_done: + cmp al,2 + jae .registers_shifted + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + or edx,ecx + mov [operand_registers],edx + add al,2 + .registers_shifted: + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + mov dh,0 + or edx,ecx + mov [operand_registers],edx + add al,2 + jmp ARM_rd_rn_shifter.encode_shifter + +ARM_rd_shift: + ;used by RRX + call decode_template + TEMPLATE \ + <TMPL_base_reg>,\ ;0=reg alternate for reg,reg + <TMPL_base_reg,TMPL_base_reg> ;1=reg,reg + mov [instruction_shift_op],ARM_SHIFT_OPCODE_ROR + cmp al,1 + jae .registers_shifted + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + or edx,ecx + mov [operand_registers],edx + .registers_shifted: + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + mov dh,0 + or edx,ecx + mov [operand_registers],edx + mov al,3 + jmp ARM_rd_rn_shifter.encode_shifter + +ARM_rn_shifter: + ;used by CMN, CMP, TEQ, TST + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;1=reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ;2=reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ;3=reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;4=reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg> ;5=reg,reg,shift reg + mov edx,[operand_registers] + shl edx,8 + mov [operand_registers],edx + jmp ARM_rd_rn_shifter.encode_shifter + +ARM_rn_shifter_26bit: + ;used by CMNP, CMPP, TEQP, TSTP + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;1=reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ;2=reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ;3=reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;4=reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg> ;5=reg,reg,shift reg + test [code_type],CPU_ACTIVITY_ARM + jz ERROR_instruction_not_16bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_26BIT + jz ERROR_requires_cpu_capability_arm_26bit + mov edx,[operand_registers] + shl edx,8 + mov [operand_registers],edx + add al,6 + jmp ARM_rd_rn_shifter.encode + +ARM_rd_address2: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_rd_address + ;used by LDR, LDRB, STR, STRB, selectively: PLD, LDRT, LDRBT, STRT, STRBT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ; 1=rd,[rn],+-rm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm>,\ ; 2=rd,[rn],+-rm,shift imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg,TMPL_rrx_op>,\ ; 3=rd,[rn],+-rm,rrx + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 4=rd,[rn],imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 5=rd,[rn,imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 6=rd,[rn,imm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ; 7=rd,[rn,+-rm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 8=rd,[rn,+-rm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right>,\ ; 9=rd,[rn,+-rm,shift imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;10=rd,[rn,+-rm,shift imm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_rrx_op,TMPL_bracket_right>,\ ;11=rd,[rn,+-rm,rrx] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_rrx_op,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;12=rd,[rn,+-rm,rrx]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;13=rd,[imm] PC relative + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;14=rd,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;15=rd,[exp]! implicit reg from structure + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + ;check that rd!=15 unless LDR, STR + cmp [operand_size],4 + jnz .check_rd + ;check for LDRT + mov edx,[arm_instruction] + and edx,0xf shl 21 + cmp edx,1 shl 21 + jnz .process + .check_rd: + mov cl,[operand_register0] + cmp cl,15 + jz ERROR_r15_not_valid.first + .process: + cmp al,0 + jz .rd_q_rn_p + cmp al,1 + jz .rd_q_rn_p_PMrm + cmp al,2 + jz .rd_q_rn_p_PMrm_shift_imm + cmp al,3 + jz .rd_q_rn_p_PMrm_rrx + cmp al,4 + jz .rd_q_rn_p_imm + cmp al,5 + jz .rd_q_rn_imm_p + cmp al,6 + jz .rd_q_rn_imm_p! + cmp al,7 + jz .rd_q_rn_PMrm_p + cmp al,8 + jz .rd_q_rn_PMrm_p! + cmp al,9 + jz .rd_q_rn_PMrm_shift_imm_p + cmp al,10 + jz .rd_q_rn_PMrm_shift_imm_p! + cmp al,11 + jz .rd_q_rn_PMrm_rrx_p + cmp al,12 + jz .rd_q_rn_PMrm_rrx_p! + cmp al,13 + jz .rd_q_imm_p + cmp al,14 + jz .rd_q_exp_p + cmp al,15 + jz .rd_q_exp_p! + ud2 + .rd_q_rn_p_imm: + cmp [immediate_value],0 + jz .rd_q_rn_p + .rd_q_rn_p_imm.do: + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.post + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + jmp .rd_rn_imm + .rd_q_rn_imm_p!: + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.post + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + mov eax,[immediate_value] + test eax,eax + jz .rd_q_rn_imm_p + xor ebp,1 shl 21 + 1 shl 24 + jmp .rd_rn_imm + .rd_q_rn_p: + .rd_q_rn_imm_p: + xor ebp,1 shl 24 + .rd_rn_imm: + or ebp,1 shl 23 + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + cmp eax,0xfff + jg .immediate_offset_out_of_range + cmp eax,-0xfff + jl .immediate_offset_out_of_range + test eax,eax + jns .store_offset + neg eax + btr ebp,23 + .store_offset: + or ebp,eax + jmp ARM_store_instruction + .rd_q_rn_PMrm_p!: + mov [instruction_shift_op],0 + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + jmp .rd_q_rn_PMrm_shift_imm_p! + .rd_q_rn_p_PMrm: + mov [instruction_shift_op],0 + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + jmp .rd_q_rn_p_PMrm_shift_imm + .rd_q_rn_PMrm_p: + mov [instruction_shift_op],0 + jmp .rd_q_rn_PMrm_shift_imm_p + .rd_q_rn_PMrm_shift_imm_p!: + call ARM_check_shift_range + xor ebp,1 shl 21 + 1 shl 24 + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.post + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + jmp .check_rn_rm + .rd_q_rn_p_PMrm_shift_imm: + call ARM_check_shift_range + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.post + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + .check_rn_rm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jnz .rd_rn_PMrm_shift_imm + mov ax,word[operand_register1] + and ax,0x7f7f + cmp al,ah + jz ERROR_base_and_offset_must_differ_with_writeback + jmp .rd_rn_PMrm_shift_imm + .rd_q_rn_PMrm_shift_imm_p: + call ARM_check_shift_range + xor ebp,1 shl 24 + .rd_rn_PMrm_shift_imm: + or ebp,1 shl 23 + 1 shl 25 + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + test al,al + jns .store_reg + and eax,0xf + btr ebp,23 + .store_reg: + cmp eax,0xf + jz ERROR_r15_not_valid.third + or ebp,eax + jmp ARM_store_instruction + .rd_q_rn_PMrm_rrx_p!: + xor ebp,1 shl 21 + 1 shl 24 + 3 shl 5 + jmp .rd_q_rn_p_PMrm_rrx.do + .rd_q_rn_p_PMrm_rrx: + or ebp,3 shl 5 + .rd_q_rn_p_PMrm_rrx.do: + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.second + mov ax,word[operand_register0] + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jnz .rd_rn_PMrm_shift_imm + mov ax,word[operand_register1] + and ax,0x7f7f + cmp al,ah + jz ERROR_base_and_offset_must_differ_with_writeback + jmp .rd_rn_PMrm_shift_imm + .rd_q_rn_PMrm_rrx_p: + xor ebp,1 shl 24 + 3 shl 5 + jmp .rd_rn_PMrm_shift_imm + .rd_q_imm_p: + mov [operand_register1],0xf + mov eax,[addressing_space] + mov eax,[eax+0x00] + add eax,[immediate_value] + sub eax,edi + sub eax,8 + mov [immediate_value],eax + jmp .rd_q_rn_imm_p + .rd_q_exp_p: + jmp .rd_q_rn_imm_p + .rd_q_exp_p!: + jmp .rd_q_rn_imm_p! + .immediate_offset_out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0xfff + jmp ARM_store_instruction_with_error + +ARM_rd_address2_post: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_rd_address + ;used by LDRT, LDRBT, STRT, STRBT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ;1=rd,[rn],+-rm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm>,\ ;2=rd,[rn],+-rm,shift imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg,TMPL_rrx_op>,\ ;3=rd,[rn],+-rm,rrx + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm> ;4=rd,[rn],imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + cmp [operand_register0],15 + jz ERROR_r15_not_valid.first + cmp al,0 + jz ARM_rd_address2.rd_q_rn_p_imm.do + cmp al,1 + jz ARM_rd_address2.rd_q_rn_p_PMrm + cmp al,2 + jz ARM_rd_address2.rd_q_rn_p_PMrm_shift_imm + cmp al,3 + jz ARM_rd_address2.rd_q_rn_p_PMrm_rrx + cmp al,4 + jz ARM_rd_address2.rd_q_rn_p_imm.do + ud2 + +ARM_rn_address4: + ;used by LDM, STM + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_reg_list>,\ ;0=rn,{..} + <TMPL_base_reg,TMPL_reg_list,TMPL_modifier_translate>,\ ;1=rn,{..}^ + <TMPL_base_reg!,TMPL_reg_list>,\ ;2=rn!,{..} + <TMPL_base_reg!,TMPL_reg_list,TMPL_modifier_translate> ;3=rn!,{..}^ + mov [operand_size],4 + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_rn_address4 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + test al,1 + jnz .do_multiple ;cannot change to ldr when using translate + .do: + mov ecx,[reg_list_bitmap] + dec ecx + and ecx,[reg_list_bitmap] + jz .do_single ;single registers use a different encoding + .do_multiple: + cmp al,0 + jz .rn_list + cmp al,1 + jz .rn_list_t + cmp al,2 + jz .rn!_list + cmp al,3 + jz .rn!_list_t + ud2 + .rn_list: + mov ecx,0 + jmp .make + .rn_list_t: + mov ecx,1 shl 22 + jmp .make + .rn!_list: + mov ecx,1 shl 21 + jmp .make + .rn!_list_t: + test [reg_list_bitmap],1 shl 15 ;if PC is not present then we can't use writeback + jz ERROR_register_writeback_not_allowed + mov ecx,1 shl 22 + 1 shl 21 + .make: + or ebp,ecx + or ebp,[reg_list_bitmap] + movzx ecx,[operand_register0] + bt ebp,21 + jnc .dest_okay + bt ebp,20 + jc .ldm_check + ;stm check + bt ebp,22 ;translate? + jnc .writeback_okay + bt ebp,21 ;writeback? + jc ERROR_register_writeback_not_allowed + .writeback_okay: + bsf edx,ebp + cmp edx,ecx + jz .dest_okay + .ldm_check: + bt ebp,ecx + jc ERROR_destination_register_not_allowed_in_list + .dest_okay: + cmp ecx,15 ;PC? + jz ERROR_r15_not_valid.first + shl ecx,16 + or ebp,ecx + jmp ARM_store_instruction + .do_single: + and eax,2 + shl eax,21-1 + or ebp,eax + bsf ecx,[reg_list_bitmap] + mov ch,[operand_register0] + mov [operand_registers],ecx + mov [operand_size],4 + mov ecx,ebp + and ecx,1 shl 24 + 1 shl 21 + ;IA,DA ; 0=rd,[rn] + ;IA!,DA! ; 4=rd,[rn],imm + ;IB,DB ; 5=rd,[rn,imm] + ;IB!,DB! ; 6=rd,[rn,imm]! + mov eax,0 ; 0=rd,[rn] + mov edx,4 ; 4=rd,[rn],imm + cmp ecx,0 shl 24 + 1 shl 21 + cmovz eax,edx + mov edx,5 ; 5=rd,[rn,imm] + cmp ecx,1 shl 24 + 0 shl 21 + cmovz eax,edx + mov edx,6 ; 6=rd,[rn,imm]! + cmp ecx,1 shl 24 + 1 shl 21 + cmovz eax,edx + mov ecx,eax + and ecx,4 + mov edx,ecx + neg edx + test ebp,1 shl 23 + cmovz ecx,edx + mov [immediate_value],ecx + movzx ecx,[instruction_condition] + and ecx,0xf0 + shl ecx,24 + and ebp,0x00100000 + lea ebp,[ebp+ecx+0x04000000] + jmp ARM_rd_address2.process + +ARM_address4: + ;used by PUSH, POP + call decode_template + TEMPLATE \ + <TMPL_reg_list> ;0={..} + mov [operand_size],4 + mov [operand_register0],13 ;sp + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_address4 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + mov al,2 ;2=rn!,{..} + jmp ARM_rn_address4.do + +ARM_target: + ;used by B, BL + call decode_template + TEMPLATE \ + <TMPL_address> ;0=imm PC relative + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_B_target + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + mov eax,[addressing_space] + mov eax,[eax+0x00] + add eax,[immediate_value] + sub eax,edi + sub eax,8 + test eax,3 + jnz .not_aligned + cmp eax,1 shl 25 + jge .jump_out_of_range + cmp eax,-(1 shl 25) + jl .jump_out_of_range + shr eax,2 + and eax,0x00ffffff + or ebp,eax + or ebp,1 shl 27 + 1 shl 25 + jmp ARM_store_instruction + .jump_out_of_range: + mov ecx,ERROR_relative_jump_out_of_range + jmp ARM_store_instruction_with_error + .not_aligned: + mov ecx,ERROR_relative_jump_not_aligned + jmp ARM_store_instruction_with_error + +ARM_immediate24: + ;used by SWI + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_immediate8 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + mov eax,[immediate_value] + cmp eax,0x00ffffff + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0xffffff + jmp ARM_store_instruction_with_error + +ARM_rd_target: + ;used by ADR + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_address> ;0=reg,imm + mov [operand_register1],0xf ;rn=pc + mov ecx,[addressing_space] + mov ecx,[ecx+0x00] + add ecx,[immediate_value] + sub ecx,edi + sub ecx,8 + test [code_type],CPU_ACTIVITY_ARM + jnz .offset_done + call THUMB_query_condition_pc ;adjust for THUMB + mov eax,[addressing_space] + sub ecx,[eax+0x00] + add ecx,4 + and ecx,not 3 + neg ecx + add ecx,[immediate_value] + cmp [value_undefined],0 + jz .offset_done + xor ecx,ecx + .offset_done: + mov [immediate_value],ecx + mov al,6 ;6=reg,reg,imm + jmp ARM_rd_rn_shifter.encode_instruction + +ARM_rd_rm: + ;used by NEG + call decode_template + TEMPLATE \ + <TMPL_base_reg>,\ ;0=reg + <TMPL_base_reg,TMPL_base_reg> ;1=reg,reg + cmp al,0 + jnz .registers_shifted + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + or edx,ecx + mov [operand_registers],edx + .registers_shifted: + mov al,0 ;reg,reg,imm + jmp ARM_rd_rn_shifter.encode_shifter + +;V2 + +ARM_copro_op1_crd_crn_crm_op2: + ;used by CDP, CDP2 + call decode_template + TEMPLATE \ + <TMPL_cpro_sel,TMPL_copro_opcode1,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_cpro_reg>,\ ;0=copro,op1,crd,crn,crm + <TMPL_cpro_sel,TMPL_copro_opcode1,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_copro_opcode2> ;1=copro,op1,crd,crn,crm,op2 + test [code_type],CPU_ACTIVITY_ARM + jz .check_v7m + cmp ebp,0xf shl 28 ;CDP2? + jae .check_v5 + jmp .check_v2 + .check_v7m: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .version_check_okay + .check_v2: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V2 + jz ERROR_requires_cpu_capability_arm_v2 + jmp .version_check_okay + .check_v5: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + .version_check_okay: + movzx eax,[operand_register0] ;cpnum + shl eax,8 + or ebp,eax + movzx eax,[copro_opcode1] ;op1 + shl eax,20 + or ebp,eax + movzx eax,[operand_register1] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;crm + or ebp,eax + movzx eax,[copro_opcode2] ;op2 + shl eax,5 + or ebp,eax + jmp ARM_post_process_copro + +ARM_copro_crd_address5: + ;used by LDC, LDCL, LDC2, LDC2L, STC, STCL, STC2, STC2L + call decode_template + TEMPLATE \ + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=copro,crd,[rn] + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=copro,crd,[rn],imm + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ;2=copro,crd,[rn],{imm} + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;3=copro,crd,[rn,imm] + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;4=copro,crd,[rn,imm]! + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;5=copro,crd,[imm] PC relative + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;6=copro,crd,[exp] implicit reg from structure + <TMPL_cpro_sel,TMPL_cpro_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;7=copro,crd,[exp]! implicit reg from structure + test [code_type],CPU_ACTIVITY_ARM + jz .check_v7m + cmp ebp,0xf shl 28 ;LDC2/STC2? + jae .check_v5 + jmp .check_v2 + .check_v7m: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .version_check_okay + .check_v2: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V2 + jz ERROR_requires_cpu_capability_arm_v2 + jmp .version_check_okay + .check_v5: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + .version_check_okay: + cmp al,0 + jz .copro_crd_q_rn_p + cmp al,1 + jz .copro_crd_q_rn_p_imm + cmp al,2 + jz .copro_crd_q_rn_p_option + cmp al,3 + jz .copro_crd_q_rn_imm_p + cmp al,4 + jz .copro_crd_q_rn_imm_p! + cmp al,5 + jz .copro_crd_q_imm_p + cmp al,6 + jz .copro_crd_q_exp_p + cmp al,7 + jz .copro_crd_q_exp_p! + ud2 + .copro_crd_q_rn_p_option: + cmp [immediate_value],0xff + ja .option_out_of_range + shl [immediate_value],2 + jmp .encode + .copro_crd_q_imm_p: + mov [operand_register2],0xf + call THUMB_query_condition_pc + mov eax,[addressing_space] + sub ecx,[eax+0x00] + and ecx,not 3 ;round down + neg ecx + add ecx,[immediate_value] + test [code_type],CPU_ACTIVITY_ARM + setnz al + movzx eax,al + shl eax,2 + add eax,4 ;offset=4 for THUMB and 8 for ARM + sub ecx,eax + mov [immediate_value],ecx + .copro_crd_q_rn_p: + .copro_crd_q_exp_p: + .copro_crd_q_rn_imm_p: + or ebp,1 shl 24 ;P bit + jmp .encode + .copro_crd_q_exp_p!: + .copro_crd_q_rn_imm_p!: + cmp [operand_register2],0xf + jz ERROR_r15_not_valid.third + or ebp,1 shl 24 ;P bit + .copro_crd_q_rn_p_imm: + cmp [immediate_value],0 + jz .copro_crd_q_rn_p + or ebp,1 shl 21 ;W bit + cmp [operand_register2],0xf + jz ERROR_r15_not_valid.third + .encode: + movzx eax,[operand_register0] ;cpnum + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + test eax,3 + jnz .out_of_range + sar eax,2 + mov ecx,1 shl 23 ;U bit + or ecx,ebp + mov edx,eax + neg edx + test eax,eax + cmovns ebp,ecx + cmovs eax,edx + cmp eax,0xff + ja .out_of_range + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0x3fc + jmp ARM_post_process_copro_with_error + .option_out_of_range: + mov ecx,ERROR_option_out_of_range + jmp ARM_post_process_copro_with_error + +ARM_copro_op1_rd_crn_crm_op2: + ;used by MCR, MCR2, MRC, MRC2 + call decode_template + TEMPLATE \ + <TMPL_cpro_sel,TMPL_copro_opcode1,TMPL_base_reg,TMPL_cpro_reg,TMPL_cpro_reg>,\ ;0=copro,op1,rd,crn,crm + <TMPL_cpro_sel,TMPL_copro_opcode1,TMPL_base_reg,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_copro_opcode2> ;1=copro,op1,rd,crn,crm,op2 + test [code_type],CPU_ACTIVITY_ARM + jz .check_v7m + cmp ebp,0xf shl 28 ;MCR2 or MRC2? + jae .check_v5 + jmp .check_v2 + .check_v7m: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .version_check_okay + .check_v2: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V2 + jz ERROR_requires_cpu_capability_arm_v2 + jmp .version_check_okay + .check_v5: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + .version_check_okay: + movzx eax,[operand_register0] ;cpnum + shl eax,8 + or ebp,eax + movzx eax,[copro_opcode1] ;op1 + cmp eax,7 + ja .out_of_range + shl eax,21 + or ebp,eax + movzx eax,[operand_register1] ;rd + test ebp,1 shl 20 ;MCR? + jnz .rd_check_okay + cmp eax,15 + jz ERROR_r15_not_valid.third + .rd_check_okay: + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;crm + or ebp,eax + movzx eax,[copro_opcode2] ;op2 + shl eax,5 + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_opcode3_out_of_range + jmp ARM_post_process_copro_with_error + +ARM_rd_rm_rs_rn: + ;used by MLA, MLS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rd,rm,rs,rn + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm_rs_rn.7m + test ebp,1 shl 22 ;MLS? + jz .do + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + jmp .encode + .do: + ;used by MUL + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V2 + jz ERROR_requires_cpu_capability_arm_v2 + .encode: + ;used by SMLAD, SMLADX, SMLSD, SMLSDX, SMMLA, SMMLAR, SMMLS, SMMLSR, USADA8 + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,8 + or ebp,eax + movzx eax,[operand_register3] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.fourth + shl eax,12 + or ebp,eax + ;version 6 and above relax the rd!=rm restriction + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jnz ARM_store_instruction + mov al,[operand_register0] ;rd + mov ah,[operand_register1] ;rm + cmp al,ah + jz ERROR_source_rm_and_dest_must_differ + jmp ARM_store_instruction + .THUMB_rd_rm_rs_rn.7m: + test [instruction_condition],FLAG_CONDITION_SET + jnz THUMB_post_process + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + jmp .THUMB_rd_rm_rs_rn.encode + .THUMB_rd_rm_rs_rn: + ;used by SMLAD, SMLADX, SMLSD, SMLSDX, SMMLA, SMMLAR, SMMLS, SMMLSR, USADA8 + mov [thumb32_error],ERROR_requires_cpu_capability_arm_t2 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz THUMB_post_process + .THUMB_rd_rm_rs_rn.encode: + mov cl,0xff + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rm + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rs + or ebp,eax + movzx eax,[operand_register3] ;rn + shl eax,12 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_rs: + ;used by MUL + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=rd,rm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=rd,rm,rs + mov [operand_register3],0 ;rn=0 + cmp al,0 + jnz .do + mov al,[operand_register0] + mov [operand_register2],al + .do: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_MUL_rd_rm_rs + jmp ARM_rd_rm_rs_rn.do + +;v2a + +ARM_rd_rm_q_rn_p: + ;used by SWP, SWPB + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right> ;0=rd,rm,[rn] + test [code_type],CPU_ACTIVITY_ARM + jz ERROR_instruction_not_16bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_A + jz ERROR_requires_cpu_capability_arm_v2a + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,16 + or ebp,eax + mov al,[operand_register0] ;rd + mov ah,[operand_register1] ;rm + mov cl,[operand_register2] ;rn + cmp cl,al + jz ERROR_memory_address_cannot_be_source_or_dest + cmp cl,ah + jz ERROR_memory_address_cannot_be_source_or_dest + jmp ARM_store_instruction + +;v3 + +ARM_rd_psr: + ;used by MRS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_sysm_reg>,\ ;0=rd,sysm + <TMPL_base_reg,TMPL_psr>,\ ;1=rd,psr + <TMPL_base_reg,TMPL_banked_reg> ;2=rd,banked_reg + cmp al,2 + jz .banked + cmp al,0 + jz .THUMB_sysm + movzx ecx,[operand_register1] ;PSR + mov edx,32 + cmp ecx,15 + cmovz ecx,edx + mov edx,33 + cmp ecx,31 + cmovz ecx,edx + cmp ecx,32 + jb ERROR_must_use_full_psr + and ecx,1 ;ecx = R bit + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_psr + .encode: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V3 + jz ERROR_requires_cpu_capability_arm_v3 + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + shl ecx,22 + or ebp,ecx + jmp ARM_store_instruction + .ARM_sysm: + movzx ecx,[operand_register1] + test ecx,ecx ;APSR? + jnz ERROR_instruction_not_32bit + jmp .encode + .THUMB_sysm: + test [code_type],CPU_ACTIVITY_ARM + jnz .ARM_sysm + xor ecx,ecx + movzx edx,[operand_register1] + or [thumb32_instruction],edx + cmp edx,20 ;control is 6M + jz .THUMB_check_6M + cmp edx,17 ;17+ are 7M + jae .THUMB_check_7M + .THUMB_check_6M: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jz ERROR_requires_cpu_capability_arm_6m + jmp .THUMB_rd_psr.encode + .THUMB_check_7M: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .THUMB_rd_psr.encode + .THUMB_rd_psr: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + .THUMB_rd_psr.encode: + mov ebp,[thumb32_instruction] + mov [thumb32_error],ERROR_r13_r15_not_valid + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz THUMB_post_process + cmp eax,0xd + jz THUMB_post_process + shl eax,8 + or ebp,eax + shl ecx,20 + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .banked: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_VE + jz ERROR_requires_cpu_capability_arm_ve + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.second + movzx ebp,[operand_register1] + mov ecx,ebp + mov edx,ebp + and ebp,0x0f ;get m1 field + and ecx,0x10 ;get m field + and edx,0x20 ;get R field + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_banked + shl ebp,16 + shl ecx,8-4 + shl edx,22-5 + or ebp,ecx + or ebp,edx + or ebp,eax + or ebp,0x0100f200 + movzx eax,[instruction_condition] + and eax,0xf0 + shl eax,28-4 + or ebp,eax + jmp ARM_store_instruction + .THUMB_banked: + cmp eax,0xd + jz ERROR_r13_not_valid.second + shl ebp,8 + shl ecx,4-4 + shl edx,20-5 + shl eax,16 + or ebp,ecx + or ebp,edx + or ebp,eax + or ebp,0xf3e08020 + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_psr_value: + ;used by MSR + call decode_template + TEMPLATE \ + <TMPL_sysm_reg,TMPL_base_reg>,\ ;0=sysm,rn + <TMPL_psr,TMPL_base_reg>,\ ;1=psr,rn + <TMPL_psr,TMPL_imm>,\ ;2=psr,imm + <TMPL_banked_reg,TMPL_base_reg> ;3=banked_reg,rn + cmp al,3 + jz .banked + sub al,1 + jc .THUMB_sysm + movzx edx,[operand_register0] ;psr + mov ecx,0x09 ;CPSR_fc + cmp edx,32 ;CPSR? + cmovz edx,ecx + mov ecx,0x19 ;SPSR_fc + cmp edx,33 ;SPSR? + cmovz edx,ecx + mov ecx,0x0c ;APSR_nzcvqg + cmp edx,34 ;APSR? + cmovz edx,ecx + mov ecx,0x10 ;extract R bit + and ecx,edx + and edx,0xf + cmp al,1 + jz .psr_imm + .psr_rm: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_psr_rm + .encode: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V3 + jz ERROR_requires_cpu_capability_arm_v3 + shl edx,16 + or ebp,edx + shl ecx,22-4 + or ebp,ecx + movzx eax,[operand_register1] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + jmp ARM_store_instruction + .psr_imm: + test [code_type],CPU_ACTIVITY_ARM + jz ERROR_instruction_not_16bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V3 + jz ERROR_requires_cpu_capability_arm_v3 + shl edx,16 + or ebp,edx + shl ecx,22-4 + or ebp,ecx + or ebp,1 shl 25 + call ARM_encode_immediate + jc ERROR_immediate_cannot_be_encoded + or ebp,[immediate_value] + jmp ARM_store_instruction + .ARM_sysm: + xor ecx,ecx + movzx edx,[operand_register0] + test edx,edx ;APSR? + jnz ERROR_instruction_not_32bit + mov edx,0x0c ;APSR_nzcvqg + jmp .encode + .THUMB_sysm: + test [code_type],CPU_ACTIVITY_ARM + jnz .ARM_sysm + movzx ecx,[operand_register0] + or [thumb32_instruction],ecx + cmp ecx,20 ;control is 6M + jz .THUMB_check_6M + cmp ecx,17 ;17+ are 7M + jae .THUMB_check_7M + .THUMB_check_6M: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jz ERROR_requires_cpu_capability_arm_6m + xor ecx,ecx + mov edx,8 + jmp .THUMB_rd_psr.encode + .THUMB_check_7M: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + xor ecx,ecx + mov edx,8 + jmp .THUMB_rd_psr.encode + .THUMB_psr_rm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + .THUMB_rd_psr.encode: + mov ebp,[thumb32_instruction] + shl edx,8 + or ebp,edx + shl ecx,20-4 + or ebp,ecx + mov [thumb32_error],ERROR_r13_r15_not_valid + movzx eax,[operand_register1] ;rn + cmp eax,0xf + jz THUMB_post_process + cmp eax,0xd + jz THUMB_post_process + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .banked: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_VE + jz ERROR_requires_cpu_capability_arm_ve + movzx eax,[operand_register1] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.second + cmp eax,0xd + jz ERROR_r13_not_valid.second + movzx ebp,[operand_register0] + mov ecx,ebp + mov edx,ebp + and ebp,0x0f ;get m1 field + and ecx,0x10 ;get m field + and edx,0x20 ;get R field + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_banked + shl ebp,16 + shl ecx,8-4 + shl edx,22-5 + or ebp,ecx + or ebp,edx + or ebp,eax + or ebp,0x0120f200 + movzx eax,[instruction_condition] + and eax,0xf0 + shl eax,28-4 + or ebp,eax + jmp ARM_store_instruction + .THUMB_banked: + shl ebp,8 + shl ecx,4-4 + shl edx,20-5 + shl eax,16 + or ebp,ecx + or ebp,edx + or ebp,eax + or ebp,0xf3808020 + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rdlo_rdhi_rm_rs: + ;used by UMLAL, UMULL, SMLAL, SMULL, UMAAL + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rdlo,rdhi,rm,rs + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rdlo_rdhi_rn_rm.7m + mov edx,[arm_instruction] + and edx,0xf shl 21 + 0xf shl 4 + cmp edx,2 shl 21 + 9 shl 4 ;UMAAL? + jnz .check_M + ;check v6 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + jmp .encode + .check_M: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_M + jz ERROR_requires_cpu_capability_arm_m + .encode: + movzx eax,[operand_register0] ;rdlo + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rdhi + shl eax,16 + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.third + or ebp,eax + movzx eax,[operand_register3] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.fourth + shl eax,8 + or ebp,eax + mov ax,word[operand_registers+0] ;rdlo & rdhi + cmp al,ah + jz ERROR_destination_registers_must_differ + ;version 6 and above relax the rd!=rm restriction + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jnz ARM_store_instruction + mov cl,[operand_register2] ;rm + cmp cl,al + jz ERROR_source_rm_and_dest_must_differ + cmp cl,ah + jz ERROR_source_rm_and_dest_must_differ + jmp ARM_store_instruction + .THUMB_rdlo_rdhi_rn_rm.7m: + test [thumb32_instruction],0x60 ;UMAAL is T2 + jnz .THUMB_rdlo_rdhi_rn_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .THUMB_rdlo_rdhi_rn_rm.encode + .THUMB_rdlo_rdhi_rn_rm: + ;used by SMLALD, SMLALDX, SMLSLD, SMLSLDX, SMLALBB, SMLALBT, SMLALTB, SMLALTT + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + .THUMB_rdlo_rdhi_rn_rm.encode: + mov cl,0xff + call THUMB2_check_bad_regs + jc THUMB_post_process + mov [thumb32_error],ERROR_destination_registers_must_differ + mov ax,word[operand_registers+0] ;rdlo & rdhi + cmp al,ah + jz THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rdlo + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rdhi + shl eax,8 + or ebp,eax + movzx eax,[operand_register2] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;rm + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +;v4 + +ARM_rd_address3D: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_rd_address + ;used by STRD, LDRD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ; 1=rd,[rn],+-rm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 2=rd,[rn],imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 3=rd,[rn,imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 4=rd,[rn,imm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ; 5=rd,[rn,+-rm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 6=rd,[rn,+-rm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ; 7=rd,[imm] PC relative + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 8=rd,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 9=rd,[exp]! implicit reg from structure + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;10=rd,rd2,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ;11=rd,rd2,[rn],+-rm + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;12=rd,rd2,[rn],imm + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;13=rd,rd2,[rn,imm] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;14=rd,rd2,[rn,imm]! + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ;15=rd,rd2,[rn,+-rm] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;16=rd,rd2,[rn,+-rm]! + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;17=rd,rd2,[imm] PC relative + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;18=rd,rd2,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;19=rd,rd2,[exp]! implicit reg from structure + cmp al,10 + jb .dest_registers_defined + mov ecx,[operand_registers] + mov dl,cl + shr ecx,8 + dec cl + mov [operand_registers],ecx + cmp dl,cl + jnz ERROR_source_registers_must_be_consecutive + sub al,10 + .dest_registers_defined: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_P + jz ERROR_requires_cpu_capability_arm_p + mov cl,[operand_register0] + test cl,1 ;even register? + jnz ERROR_destination_register_must_be_even + cmp cl,14 + jz ERROR_r14_not_valid.first + jmp ARM_rd_address3.version_check_okay + +ARM_rd_address3: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_rd_address + ;used by LDRH, LDRSH, LDRSB, STRH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ;1=rd,[rn],+-rm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;2=rd,[rn],imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;3=rd,[rn,imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;4=rd,[rn,imm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ;5=rd,[rn,+-rm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;6=rd,[rn,+-rm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;7=rd,[imm] PC relative + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;8=rd,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;9=rd,[exp]! implicit reg from structure + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4 + jz ERROR_requires_cpu_capability_arm_v4 + .version_check_okay: + mov cl,[operand_register0] + cmp cl,15 + jz ERROR_r15_not_valid.first + cmp al,0 + jz .rd_q_rn_p + cmp al,1 + jz .rd_q_rn_p_PMrm + cmp al,2 + jz .rd_q_rn_p_imm + cmp al,3 + jz .rd_q_rn_imm_p + cmp al,4 + jz .rd_q_rn_imm_p! + cmp al,5 + jz .rd_q_rn_PMrm_p + cmp al,6 + jz .rd_q_rn_PMrm_p! + cmp al,7 + jz .rd_q_imm_p + cmp al,8 + jz .rd_q_exp_p + cmp al,9 + jz .rd_q_exp_p! + ud2 + .rd_q_imm_p: + mov [operand_register1],0xf ;rn=r15 + mov eax,[addressing_space] + mov eax,[eax+0x00] + add eax,[immediate_value] + sub eax,edi + sub eax,8 + mov [immediate_value],eax + .rd_q_exp_p: + .rd_q_rn_p: + .rd_q_rn_imm_p: + or ebp,0x2 shl 21 + test ebp,1 shl 21 ;W=1 if T specified + jnz .encode_imm + or ebp,0x8 shl 21 ;P + jmp .encode_imm + .rd_q_rn_p_imm: + cmp [immediate_value],0 + jz .rd_q_rn_p + or ebp,0x2 shl 21 + jmp .check_rn + .rd_q_exp_p!: + .rd_q_rn_imm_p!: + cmp [immediate_value],0 + jz .rd_q_rn_p + or ebp,0xb shl 21 + .check_rn: + mov ax,word[operand_register0] ;ah=rn, al=rd + cmp ah,0xf + jz ERROR_r15_not_valid.second + cmp [operand_size],8 ;LDRD or STRD? + setz cl + not cl + and al,cl + and ah,cl + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + .encode_imm: + or ebp,1 shl 23 + mov eax,[immediate_value] + test eax,eax + jns .positive_imm + and ebp,not (1 shl 23) + neg eax + .positive_imm: + cmp eax,0xff + ja .out_of_range + mov ecx,eax + and ecx,0xf shl 4 + and eax,0xf + shl ecx,4 + or eax,ecx + or ebp,eax + or ebp,1 shl 22 + .encode_rd_rn: + movzx eax,[operand_register0] ;rd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + jmp ARM_store_instruction + .rd_q_rn_PMrm_p: + or ebp,0x8 shl 21 + jmp .encode_reg + .rd_q_rn_PMrm_p!: + or ebp,0x9 shl 21 + .rd_q_rn_p_PMrm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jnz .base_offset_okay + mov ax,word[operand_register1] + and ax,0x7f7f + cmp al,ah + jz ERROR_base_and_offset_must_differ_with_writeback + .base_offset_okay: + mov al,[operand_register1] ;rn + cmp al,0xf + jz ERROR_r15_not_valid.second + cmp al,[operand_register0] ;rd + jz ERROR_base_and_dest_must_differ_with_writeback + cmp [operand_size],8 ;LDRD or STRD? + jnz .encode_reg + mov ah,[operand_register0] ;rd + and ax,0xfefe + cmp al,ah + jz ERROR_base_and_dest_must_differ_with_writeback + .encode_reg: + cmp [operand_size],8 ;LDRD or STRD? + jnz .encode_reg.do + test ebp,1 shl 20 ;STRD=0 + jz .encode_reg.do + mov ah,[operand_register0] ;rd + mov al,[operand_register2] ;rm + and ax,0x7e7e + cmp al,ah + jz ERROR_offset_and_dest_must_differ_with_LDRD + .encode_reg.do: + or ebp,1 shl 23 + movzx eax,[operand_register2] ;rm + test al,al + jns .store_reg + and eax,0xf + btr ebp,23 + .store_reg: + cmp eax,0xf + jz ERROR_r15_not_valid.third + or ebp,eax + jmp .encode_rd_rn + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0xff + jmp ARM_store_instruction_with_error + +;v4T + +THUMB2_check_bad_regs: + ;cl has the bitmap for registers to check + ;cl[3..0] check for reg[3..0] <> pc + ;cl[7..4] check for reg[3..0] <> sp + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz .sp_check_okay + and cl,0xf ;v8 instructions allow usage of SP in THUMB instructions + .sp_check_okay: + mov edx,[operand_registers] + test cl,0x01 shl 0 + jz .reg0_pc_okay + cmp dl,0xf + jz .bad_reg + .reg0_pc_okay: + test cl,0x10 shl 0 + jz .reg0_sp_okay + cmp dl,0xd + jz .bad_reg + .reg0_sp_okay: + shr cl,1 + test cl,0x01 + jz .reg1_pc_okay + cmp dh,0xf + jz .bad_reg + .reg1_pc_okay: + test cl,0x10 + jz .reg1_sp_okay + cmp dh,0xd + jz .bad_reg + .reg1_sp_okay: + shr cl,1 + shr edx,16 + test cl,0x01 + jz .reg2_pc_okay + cmp dl,0xf + jz .bad_reg + .reg2_pc_okay: + test cl,0x10 + jz .reg2_sp_okay + cmp dl,0xd + jz .bad_reg + .reg2_sp_okay: + shr cl,1 + test cl,0x01 + jz .reg3_pc_okay + cmp dh,0xf + jz .bad_reg + .reg3_pc_okay: + test cl,0x10 + jz .reg3_sp_okay + cmp dh,0xd + jz .bad_reg + .reg3_sp_okay: + clc + ret + .bad_reg: + and cl,0x11 + cmp cl,0x10 + mov [thumb32_error],ERROR_r15_not_valid + jb .fail + mov [thumb32_error],ERROR_r13_not_valid + jz .fail + mov [thumb32_error],ERROR_r13_r15_not_valid + .fail: + stc + ret + +THUMB_rd_rn_shifter: + mov edx,[arm_instruction] + and edx,0xf shl 21 + shr edx,21 + mov ah,dl + mov [can_swap_rm_rn],0 + cmp ah,ARM_INSTRUCTION_OPCODE_AND + jz THUMB_AND_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_EOR + jz THUMB_EOR_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_SUB + jz THUMB_SUB_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_RSB + jz THUMB_RSB_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_ADD + jz THUMB_ADD_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_ADC + jz THUMB_ADC_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_SBC + jz THUMB_SBC_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_RSC + jz THUMB_RSC_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_TST + jz THUMB_TST_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_TEQ + jz THUMB_TEQ_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_CMP + jz THUMB_CMP_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_CMN + jz THUMB_CMN_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_ORR + jz THUMB_ORR_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_MOV + jz THUMB_MOV_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_BIC + jz THUMB_BIC_rd_rn_shifter + cmp ah,ARM_INSTRUCTION_OPCODE_MVN + jz THUMB_MVN_rd_rn_shifter + ud2 + +THUMB_AND_rd_rn_shifter: + mov [can_swap_rm_rn],-1 + mov dx,THUMB_INSTRUCTION_OPCODE_AND + jmp THUMB_GEN_rd_rn_shifter + +THUMB_EOR_rd_rn_shifter: + mov [can_swap_rm_rn],-1 + mov dx,THUMB_INSTRUCTION_OPCODE_EOR + jmp THUMB_GEN_rd_rn_shifter + +THUMB_ADC_rd_rn_shifter: + mov [can_swap_rm_rn],-1 + mov dx,THUMB_INSTRUCTION_OPCODE_ADC + jmp THUMB_GEN_rd_rn_shifter + +THUMB_SBC_rd_rn_shifter: + mov dx,THUMB_INSTRUCTION_OPCODE_SBC + jmp THUMB_GEN_rd_rn_shifter + +THUMB_TST_rd_rn_shifter: + mov edx,[operand_registers] + mov dl,dh + mov [operand_registers],edx + mov dx,THUMB_INSTRUCTION_OPCODE_TST + jmp THUMB_GEN_rd_rn_shifter + +THUMB_CMN_rd_rn_shifter: + mov edx,[operand_registers] + movzx ecx,dh + shl ecx,16 + or [thumb32_instruction],ecx + mov cx,0x0800 + cmp dh,13 ;SP is okay here + cmove edx,ecx + mov dl,dh + mov word[operand_registers+0],dx + mov dx,THUMB_INSTRUCTION_OPCODE_CMN + jmp THUMB_GEN_rd_rn_shifter + +THUMB_ORR_rd_rn_shifter: + mov [can_swap_rm_rn],-1 + mov dx,THUMB_INSTRUCTION_OPCODE_ORR + jmp THUMB_GEN_rd_rn_shifter + +THUMB_BIC_rd_rn_shifter: + mov dx,THUMB_INSTRUCTION_OPCODE_BIC + jmp THUMB_GEN_rd_rn_shifter + +THUMB_MVN_rd_rn_shifter: + mov edx,[operand_registers] + mov dh,dl + mov [operand_registers],edx + mov dx,THUMB_INSTRUCTION_OPCODE_MVN + jmp THUMB_GEN_rd_rn_shifter + +THUMB_GEN_rd_rn_shifter: + cmp al,6 + jz .reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz .reg_reg_reg + cmp al,9 + jz .reg_reg_reg_rrx + cmp al,10 + jz .reg_reg_reg_shift_imm + cmp al,11 + jz .reg_reg_reg_shift_reg + ud2 + .reg_reg_reg: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_reg.32 + mov [thumb16_error],ERROR_dest_and_source_must_be_the_same + mov eax,[operand_registers] + test eax,0x080808 + jnz .register_swap_done + mov ecx,[force_wide_flag] + test byte[ecx-1],FLAG_FORCE_WIDE + jnz .register_swap_done + cmp [can_swap_rm_rn],-1 + jnz .register_swap_done + mov ecx,eax + shr ecx,16 + cmp cl,al + jnz .register_swap_done + xchg cl,ah + shl ecx,16 + and eax,not (0xff shl 16) + or eax,ecx + .register_swap_done: + cmp ah,al ;rd=rn? + jnz .reg_reg_reg.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + shr eax,8 + test ax,0x0808 + jnz .reg_reg_reg.32 + shl ah,3 + or al,ah + mov ah,0x40 + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_reg.32: + mov cl,0x77 + .reg_reg_reg.32.valid_regs_set: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + call THUMB2_check_bad_regs + jc THUMB_post_process + mov edx,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register1] + shl eax,16 + or edx,eax + movzx eax,[operand_register2] + or edx,eax + test [instruction_condition],FLAG_CONDITION_SET + setnz cl + movzx ecx,cl + shl ecx,20 + or edx,ecx + or edx,1 shl 27 + 1 shl 25 + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + .reg_reg_imm: + mov cl,0x33 + .reg_reg_imm.valid_regs_set: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + push ecx + call THUMB_encode_immediate_with_opcode_swap + pop ecx + mov [thumb32_error],ERROR_immediate_cannot_be_encoded + jc THUMB_post_process + .reg_reg_imm.encode: + call THUMB2_check_bad_regs + jc THUMB_post_process + mov edx,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register1] + shl eax,16 + or edx,eax + test [instruction_condition],FLAG_CONDITION_SET + setnz cl + movzx ecx,cl + shl ecx,20 + or edx,ecx + mov eax,[immediate_value] + mov ecx,eax + and ecx,7 shl 8 + shl ecx,12-8 + or edx,ecx + mov ecx,eax + and eax,0xff + and ecx,1 shl 11 + shl ecx,26-11 + or edx,eax + or edx,ecx + or edx,1 shl 28 + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + .reg_reg_reg_rrx: + mov cl,0x77 + .reg_reg_reg_rrx.valid_regs_set: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov [instruction_shift_op],ARM_SHIFT_OPCODE_ROR + jmp .reg_reg_reg_shift_imm.do + .reg_reg_reg_shift_imm: + mov cl,0x77 + .reg_reg_reg_shift_imm.valid_regs_set: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + push ecx + call ARM_check_shift_range + pop ecx + .reg_reg_reg_shift_imm.do: + call THUMB2_check_bad_regs + jc THUMB_post_process + mov edx,[thumb32_instruction] + movzx ecx,[instruction_shift_op] + mov eax,[immediate_value] + shl ecx,4 + or edx,ecx + mov ecx,eax + and eax,0x3 + and ecx,0x7 shl 2 + shl eax,6 + shl ecx,12-2 + or edx,eax + or edx,ecx + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register1] + shl eax,16 + or edx,eax + movzx eax,[operand_register2] + or edx,eax + test [instruction_condition],FLAG_CONDITION_SET + setnz cl + movzx ecx,cl + shl ecx,20 + or edx,ecx + or edx,1 shl 27 + 1 shl 25 + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + .reg_reg_reg_shift_reg: + jmp THUMB_post_process + +THUMB_CMP_rd_rn_shifter: + cmp al,6 + jz .reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz .reg_reg + cmp al,9 + jz .reg_transfer + cmp al,10 + jz .reg_transfer + cmp al,11 + jz THUMB_post_process + ud2 + .reg_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_imm.32 + mov eax,[operand_registers] + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov edx,[immediate_value] + cmp edx,0xff + ja .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp ah,7 + ja .reg_reg_imm.32 + mov al,dl + or ah,0x28 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_imm.32: + mov al,6 + .reg_transfer: + mov edx,[operand_registers] + mov dl,dh + mov word[operand_registers+0],dx + mov cl,0x02 + cmp al,6 + jz THUMB_GEN_rd_rn_shifter.reg_reg_imm.valid_regs_set + cmp al,8 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg.32.valid_regs_set + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx.valid_regs_set + cmp al,10 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm.valid_regs_set + ud2 + .reg_reg: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_transfer + mov edx,[operand_registers] + shr edx,8 + test dx,0x0808 + jnz .hreg1_hreg2 + mov dx,THUMB_INSTRUCTION_OPCODE_CMP + mov eax,[operand_registers] + shr eax,8 + shl ah,3 + or al,ah + mov ah,0x40 + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + mov al,6 + jmp .reg_transfer + .hreg1_hreg2: + mov al,dl + and al,0x8 + and dl,0x7 + shl al,4 + or al,dl + shl dh,3 + or al,dh + mov ah,0x45 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + mov al,6 + jmp .reg_transfer + +THUMB_RSB_rd_rn_shifter: + ;NEG + cmp al,6 + jz .reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg.32 + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp al,11 + jz THUMB_post_process + ud2 + .reg_reg_imm: + cmp [immediate_value],0 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov eax,[operand_registers] + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ax,0x0808 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_imm + shl ah,3 + or al,ah + mov ah,0x40 + mov dx,THUMB_INSTRUCTION_OPCODE_NEG + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_imm + +THUMB_TEQ_rd_rn_shifter: + cmp al,6 + jz THUMB_GEN_rd_rn_shifter.reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg.32 + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp al,11 + jz THUMB_post_process + ud2 + +THUMB_RSC_rd_rn_shifter: + jmp THUMB_post_process + +THUMB_SUB_rd_rn_shifter: + cmp al,6 + jz .reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz .reg_reg_reg + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz THUMB_ADD_rd_rn_shifter.reg_reg_reg.32 + cmp al,11 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_reg + ud2 + .reg_reg_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_imm.32 + mov edx,eax + mov eax,[operand_registers] + cmp ah,al ;rd=rn? + jnz .reg_reg_imm3 + cmp al,13 ;SP? + jz .sp_imm7 + shr edx,24 + jz .reg.imm8 + cmp [immediate_value],7 ;for small immediates honour two reg encoding + jbe .reg_reg_imm3 + .reg.imm8: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov ch,0x38 + mov edx,[immediate_value] + test edx,edx ;negative? + jns .reg_imm8_check_range + neg edx + mov ch,0x30 ;change to add reg,imm8 + .reg_imm8_check_range: + cmp edx,0xff + ja .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp al,7 + ja .reg_reg_imm.32 + mov al,dl + or ah,ch + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .reg_reg_imm3: + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_7 + mov edx,[immediate_value] + mov ch,0x1e + test edx,edx ;negative? + jns .reg_reg_imm3_check_range + neg edx + mov ch,0x1c ;change to add reg,reg,imm3 + .reg_reg_imm3_check_range: + cmp edx,7 + ja .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ax,0x0808 + jnz .reg_reg_imm.32 + shl ah,3 + or al,ah + mov ah,ch + shl edx,6 + or eax,edx + movzx eax,ax + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .sp_imm7: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x1fc + mov ecx,0xb080 + mov eax,[immediate_value] + test eax,eax ;negative? + jns .sp_imm7_check_range + neg eax + mov cl,0 ;change to add sp,imm7 + .sp_imm7_check_range: + cmp eax,0x7f*4 + ja .reg_reg_imm.32 + test eax,3 + jnz .reg_reg_imm.32 + shr eax,2 + or eax,ecx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_imm.32: + cmp word[operand_registers+0],0x0e0f ;sub pc,lr,imm? + jnz .reg_reg_imm.not_pc_lr + test [instruction_condition],FLAG_CONDITION_SET + jnz .subs_pc_lr + .reg_reg_imm.not_pc_lr: + mov ebp,[thumb32_instruction] + mov [thumb32_instruction],0xf2a00000 ;SUBW + call THUMB_check_12bit_immediate + jnc THUMB_rd_rn_imm12.encode + cmp [operand_register1],15 ;PC? + jz THUMB_rd_rn_imm12.encode + mov [thumb32_instruction],ebp + cmp [operand_register1],13 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov cl,0x03 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_imm.valid_regs_set + .subs_pc_lr: + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb32_error],ERROR_requires_cpu_capability_arm_t2 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz THUMB_post_process + mov [thumb32_error],ERROR_immediate_value_out_of_range.0_0xff + mov eax,[immediate_value] + cmp eax,0xff + ja THUMB_post_process + or eax,0xf3de8f00 + mov [thumb32_instruction],eax + mov [thumb32_error],0 + jmp THUMB_post_process + .reg_reg_reg: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_ADD_rd_rn_shifter.reg_reg_reg.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + mov eax,[operand_registers] + test eax,0x080808 + jnz THUMB_ADD_rd_rn_shifter.reg_reg_reg.32 + mov edx,eax + shr edx,16 + shl ah,3 + or al,ah + mov ah,0 + mov dh,0 + shl edx,6 + or eax,edx + or ah,0x1a + movzx eax,ax + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_ADD_rd_rn_shifter.reg_reg_reg.32 + +THUMB_ADD_rd_rn_shifter: + cmp al,6 + jz .reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz .reg_reg_reg + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz .reg_reg_reg.32 + cmp al,11 + jz THUMB_post_process + ud2 + .reg_reg_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_imm.32 + mov edx,eax + mov eax,[operand_registers] + cmp ax,13*0x100+13 ;SP,SP,imm? + jz .sp_imm7 + cmp ah,13 ;SP? + jz .rd_sp_imm8 + cmp ah,15 ;PC? + jz .rd_pc_imm8 + cmp ah,al ;rd=rn? + jnz .reg_reg_imm3 + shr edx,24 + jz .reg.imm8 + cmp [immediate_value],7 ;for small immediates honour two reg encoding + jbe .reg_reg_imm3 + .reg.imm8: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov ch,0x30 + mov edx,[immediate_value] + test edx,edx ;negative? + jns .reg_imm8_check_range + neg edx + mov ch,0x38 ;change to sub reg,imm8 + .reg_imm8_check_range: + cmp edx,0xff + ja .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp ah,7 + ja .reg_reg_imm.32 + mov al,dl + or ah,ch + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .reg_reg_imm3: + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_7 + mov edx,[immediate_value] + mov ch,0x1c + test edx,edx ;negative? + jns .reg_reg_imm3_check_range + neg edx + mov ch,0x1e ;change to sub reg,reg,imm3 + .reg_reg_imm3_check_range: + cmp edx,7 + ja .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ax,0x0808 + jnz .reg_reg_imm.32 + shl ah,3 + or al,ah + mov ah,ch + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .sp_imm7: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x1fc + mov ecx,0xb000 + mov eax,[immediate_value] + test eax,eax ;negative? + jns .sp_imm7_check_range + neg eax + mov cl,0x80 ;change to sub sp,imm7 + .sp_imm7_check_range: + cmp eax,0x7f*4 + ja .reg_reg_imm.32 + test eax,3 + jnz .reg_reg_imm.32 + shr eax,2 + or eax,ecx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .rd_sp_imm8: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x3fc + mov edx,[immediate_value] + cmp edx,0xff*4 + ja .reg_reg_imm.32 + test edx,3 + jnz .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp al,7 + ja .reg_reg_imm.32 + mov ah,al + shr edx,2 + mov al,dl + or ah,0xa8 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_imm.32 + .rd_pc_imm8: + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x3fc + mov edx,[immediate_value] + cmp edx,0xff*4 + ja .reg_reg_imm.32 + test edx,3 + jnz .reg_reg_imm.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp al,7 + ja .reg_reg_imm.32 + mov ah,al + shr edx,2 + mov al,dl + or ah,0xa0 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_imm.32: + mov ebp,[thumb32_instruction] + mov [thumb32_instruction],0xf2000000 ;ADDW + call THUMB_check_12bit_immediate + jnc THUMB_rd_rn_imm12.encode + cmp [operand_register1],15 ;PC? + jz THUMB_rd_rn_imm12.encode + mov [thumb32_instruction],ebp + cmp [operand_register1],13 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov cl,0x03 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_imm.valid_regs_set + .reg_reg_reg: + mov eax,[operand_registers] + mov edx,eax + shr edx,16 + cmp dl,al ;rd=rm? + jz .check_hregs + cmp ah,al ;rd=rn? + jne .reg1_reg2_reg3 + .check_hregs: + test eax,0x080808 + jnz .hreg1_hreg1_hreg2 + ;special case for 'add lreg,lreg' + ;if: + ;1. UAL + ;2. no S and not conditional + ;3. V6M + ;then use 'add hreg,hreg' version + test [code_type],CPU_ACTIVITY_THUMB_UAL + jz .reg1_reg2_reg3 ;encode the lreg version 'adds lreg,lreg,lreg' + test [instruction_condition],FLAG_CONDITION_SET + jnz .reg1_reg2_reg3 ;encode the lreg version 'adds lreg,lreg,lreg' + cmp [instruction_condition],0xe shl 4 + jb .reg1_reg2_reg3 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_6m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jnz .hreg1_hreg1_hreg2.do ;encode the hreg version in UAL without S + .reg1_reg2_reg3: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_reg.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test eax,0x080808 + jnz .reg_reg_reg.32 + shl ah,3 + or al,ah + mov ah,0 + mov dh,0 + shl edx,6 + or eax,edx + or ah,0x18 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp .reg_reg_reg.32 + .hreg1_hreg1_hreg2: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_reg.32 + .hreg1_hreg1_hreg2.do: + cmp ah,al ;rd=rn? + jz .swap_okay + xchg dl,ah + .swap_okay: + and ax,0x0807 + shl ah,4 + or al,ah + shl dl,3 + or al,dl + mov ah,0x44 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_reg.32: + cmp [operand_register1],13 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp [operand_register0],13 + jnz .shift_checked + mov [thumb32_error],ERROR_shift_type_must_be_LSL + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz THUMB_post_process + mov [thumb32_error],ERROR_shift_value_out_of_range.0_3 + cmp [immediate_value],3 + ja THUMB_post_process + .shift_checked: + mov cl,0x47 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm.valid_regs_set + +THUMB_MOV_rd_rn_shifter: + cmp al,6 + jz .reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz .reg_reg + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz .reg_reg_shift_imm + cmp al,11 + jz .reg_reg_shift_reg + ud2 + .reg_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov ah,[operand_register0] + mov edx,[immediate_value] + cmp edx,0xff + ja THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp ah,7 + ja THUMB_GEN_rd_rn_shifter.reg_reg_imm + mov al,dl + or ah,0x20 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_imm + .reg_reg: + ;special case for 'mov lreg,lreg' + ;if: + ;1. UAL + ;2. no S + ;3. V6T + ;then use 'cpy reg,reg' + mov al,[operand_register0] + mov ah,[operand_register2] + mov word[operand_registers+0],ax + test ax,0x0808 ;any high registers used? + jnz .hreg1_hreg2 + test [code_type],CPU_ACTIVITY_THUMB_UAL + jz .lreg1_lreg2 ;encode the lreg version 'adds reg,reg,0' + test [instruction_condition],FLAG_CONDITION_SET + jnz .lreg1_lreg2 ;encode the lreg version 'adds reg,reg,0' + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v6t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6T + jnz .hreg1_hreg2 + .lreg1_lreg2: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg + shl ah,3 + or al,ah + mov ah,0x1c + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_reg.32 + .hreg1_hreg2: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg + .hreg1_hreg2.do: + mov dl,ah + mov ah,al + and ax,0x0807 + shl ah,4 + or al,ah + shl dl,3 + or al,dl + mov ah,0x46 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + cmp [operand_register0],0xf + jnz .T2 + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + .T2: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov cl,0x55 + call THUMB2_check_bad_regs + jnc .T2.do + test [instruction_condition],FLAG_CONDITION_SET + jnz THUMB_post_process + mov cl,0x11 ;mov rx,{sp|pc} is allowed + call THUMB2_check_bad_regs + jnc .T2.do + mov cl,0x45 ;mov sp,rx is allowed + call THUMB2_check_bad_regs + jc THUMB_post_process + .T2.do: + mov edx,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register2] + or edx,eax + test [instruction_condition],FLAG_CONDITION_SET + setnz cl + movzx ecx,cl + shl ecx,20 + or edx,ecx + or edx,1 shl 27 + 1 shl 25 + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + .reg_reg_shift_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_ROR + jnz .not_ror + cmp [immediate_value],0 + jnz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + mov [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + .not_ror: + call ARM_check_shift_range + movzx eax,[instruction_shift_op] + mov ecx,0 shl 11 + mov edx,1 shl 11 + cmp al,ARM_SHIFT_OPCODE_LSR + cmovz ecx,edx + mov edx,2 shl 11 + cmp al,ARM_SHIFT_OPCODE_ASR + cmovz ecx,edx + mov al,[operand_register0] + mov ah,[operand_register2] + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp al,7 + ja THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp ah,7 + ja THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + shl ah,3 + or al,ah + mov ah,ch + mov edx,[immediate_value] + and edx,0x1f + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + .reg_reg_shift_reg: + mov eax,[operand_registers] + mov ecx,eax + shr eax,8 + mov al,cl + mov [operand_registers],eax + movzx eax,[instruction_shift_op] + mov dx,THUMB_INSTRUCTION_OPCODE_LSL + mov cx,THUMB_INSTRUCTION_OPCODE_LSR + cmp al,ARM_SHIFT_OPCODE_LSR + cmovz dx,cx + mov cx,THUMB_INSTRUCTION_OPCODE_ASR + cmp al,ARM_SHIFT_OPCODE_ASR + cmovz dx,cx + mov cx,THUMB_INSTRUCTION_OPCODE_ROR + cmp al,ARM_SHIFT_OPCODE_ROR + cmovz dx,cx + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .reg_reg_shift_reg.32 + mov [thumb16_error],ERROR_dest_and_source_must_be_the_same + mov eax,[operand_registers] + cmp ah,al ;rd=rn? + jnz .reg_reg_shift_reg.32 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + shr eax,8 + cmp al,7 + ja .reg_reg_shift_reg.32 + cmp ah,7 + ja .reg_reg_shift_reg.32 + shl ah,3 + or al,ah + mov ah,0x40 + shl edx,6 + or eax,edx + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .reg_reg_shift_reg.32: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov edx,0xfa00f000 + movzx eax,[instruction_shift_op] + shl eax,21 + or edx,eax + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register1] + shl eax,16 + or edx,eax + movzx eax,[operand_register2] + or edx,eax + test [instruction_condition],FLAG_CONDITION_SET + setnz cl + movzx ecx,cl + shl ecx,20 + or edx,ecx + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMB_rd_rn_shifter_ORN: + ;used by ORN + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ; 0=reg,imm alternate for reg,reg,imm + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ; 1=reg,byte,rot alternate for reg,reg,byte,rot + <TMPL_base_reg,TMPL_base_reg>,\ ; 2=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ; 3=reg,reg,rrx alternate for reg,reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ; 4=reg,reg,shift imm alternate for reg,reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg>,\ ; 5=reg,reg,shift reg alternate for reg,reg,reg,shift reg + <TMPL_base_reg,TMPL_base_reg,TMPL_imm>,\ ; 6=reg,reg,imm + <TMPL_base_reg,TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ; 7=reg,reg,byte,rot + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg>,\ ; 8=reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_rrx_op>,\ ; 9=reg,reg,reg,rrx + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;10=reg,reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_base_reg> ;11=reg,reg,reg,shift reg + cmp al,6 + jae .encode_instruction + mov edx,[operand_registers] + movzx ecx,dl + shl edx,8 + or edx,ecx + mov [operand_registers],edx + add al,6 + .encode_instruction: + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + cmp al,6 + jz THUMB_GEN_rd_rn_shifter.reg_reg_imm + cmp al,7 + jz ERROR_byte_rotation_in_thumb + cmp al,8 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg.32 + cmp al,9 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_rrx + cmp al,10 + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg_shift_imm + cmp al,11 + jz THUMB_post_process + ud2 + +THUMB_MUL_rd_rm_rs: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn.7m + mov al,[operand_register0] + mov cl,[operand_register1] + mov ah,[operand_register2] + cmp al,cl + jz .encode_al_ah + xchg cl,ah + .encode_al_ah: + ;v6t allows rd=rs + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v6t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6T + jnz .encode + cmp al,ah + jz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn.7m + .encode: + mov [thumb16_error],ERROR_dest_and_source_must_be_the_same + cmp al,cl + jnz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn.7m + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ax,0x0808 + jnz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn.7m + shl ah,3 + or al,ah + mov ah,0x40 + or eax,THUMB_INSTRUCTION_OPCODE_MUL shl 6 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn.7m + +; Branch Length Condition matched? b.n cc b.n b.w cc b.w T16 is BCC T32 is BCC +; <0x7f al x x Plain x Plain n n +; <0x7ff al x x Plain x Plain n n +; <0xfffff al x x x x Plain x n +; <0xffffff al x x x x Plain x n +; <0x7f mi n Plain x Plain x y y +; <0x7ff mi n x New IT Plain x n y +; <0xfffff mi n x x Plain x x y +; <0xffffff mi n x x x New IT x n +; <0x7f mi y x Extend x Extend n n +; <0x7ff mi y x Extend x Extend n n +; <0xfffff mi y x x x Extend x n +; <0xffffff mi y x x x Extend x n + +THUMB_B_target: + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov ecx,[addressing_space] + mov ecx,[ecx+0x00] + add ecx,[immediate_value] + sub ecx,edi + sub ecx,4 + cmp [value_undefined],0 + jz .offset_okay + xor ecx,ecx + .offset_okay: + sar ecx,1 + jc .not_aligned + mov [thumb16_error],ERROR_relative_jump_out_of_range + mov [thumb32_error],ERROR_relative_jump_out_of_range + mov edx,[arm_instruction] + and edx,0xf shl 21 + cmp edx,8 shl 21 + jz .linked + mov al,4 + irp v,7,10,19,23 { ;Bcc.n, B.n, Bcc.w, B.w + cmp ecx,1 shl v + setl dl + cmp ecx,-(1 shl v) + setge dh + and dl,dh + sub al,dl + } ;al=branch distance 0-4 + cmp al,4 ;branch too far? + jae THUMB_post_process + mov ah,[instruction_condition] + and ah,0xf0 + cmp ah,0xe0 + jae .unconditional_16 + push eax ecx + call THUMB_query_condition_match + pop ecx eax + jnc .unconditional_16 + cmp al,2 + je .conditional_32 + cmp al,0 + je .conditional_16 + dec ecx ;adjust for IT block inclusion + cmp al,3 + je .unconditional_32 + inc ecx ;adjust for no IT block inclusion + cmp ecx,-(1 shl 10) ;can fit into narrow branch? + jle .conditional_32 + dec ecx ;adjust for IT block inclusion + ;set unconditional 16 + mov edx,ecx + and edx,0x7ff + or dh,0xe0 + mov [thumb16_instruction],dx + mov [thumb16_error],0 + inc ecx ;adjust for no IT block inclusion + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jnz .conditional_32 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + jmp .conditional_32 + .conditional_16: + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + THUMB_FLAG_IS_BCC + mov dl,cl + mov dh,ah + shr dh,4 + or dh,0xd0 + mov [thumb16_instruction],dx + mov [thumb16_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jnz .conditional_32 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + .conditional_32: + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + THUMB_FLAG_IS_BCC + xor edx,edx + mov dl,ah + shl edx,22-4 + ;imm11 + mov eax,ecx + and eax,0x7ff + or edx,eax + ;imm6 + mov eax,ecx + and eax,0x3f shl 11 + shl eax,16-11 + or edx,eax + ;j1 + mov eax,ecx + and eax,1 shl (11+6) + shr eax,11+6-13 + or edx,eax + ;j2 + mov eax,ecx + and eax,1 shl (11+6+1) + shr eax,11+6+1-11 + or edx,eax + ;s + mov eax,ecx + and eax,1 shl (11+6+1+1) + shl eax,26-(11+6+1+1) + or edx,eax + or edx,0xf0008000 + mov [thumb32_instruction],edx + mov [thumb32_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jnz THUMB_post_process + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + jmp THUMB_post_process + .unconditional_16: + cmp al,1 + ja .unconditional_32 + mov edx,ecx + and edx,0x7ff + or dh,0xe0 + mov [thumb16_instruction],dx + mov [thumb16_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jnz .unconditional_32 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + .unconditional_32: + mov edx,0xf0009000 + mov [thumb32_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jnz .encode_b_bl + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + .encode_b_bl: + ;imm11 + mov eax,ecx + and eax,0x7ff + or edx,eax + ;imm10 + mov eax,ecx + and eax,0x3ff shl 11 + shl eax,16-11 + or edx,eax + ;j2 + mov eax,ecx + and eax,1 shl (11+10) + shr eax,11+10-11 + or edx,eax + ;j1 + mov eax,ecx + and eax,1 shl (11+10+1) + shr eax,11+10+1-13 + or edx,eax + ;s + mov eax,ecx + and eax,1 shl (11+10+1+1) + shl eax,26-(11+10+1+1) + or edx,eax + ;fixup i1 and i2 + sar ecx,31 ;get the sign + not ecx + and ecx,1 shl 13 + 1 shl 11 + xor edx,ecx + mov [thumb32_instruction],edx + jmp THUMB_post_process + .linked: + mov ah,[instruction_condition] + and ah,0xf0 + cmp ah,0xe0 + jae .unconditional_linked + push eax ecx + call THUMB_query_condition_match + pop ecx eax + setc dl + movzx edx,dl + sub ecx,edx ;adjust for IT block + .unconditional_linked: + cmp ecx,1 shl 23 + jge THUMB_post_process ;use default error of out of range + cmp ecx,-(1 shl 23) + jl THUMB_post_process ;use default error of out of range + mov [thumb32_error],0 + mov edx,0xf000d000 + cmp ecx,1 shl 21 + setl al + cmp ecx,-(1 shl 21) + setge ah + and al,ah + jnz .check_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jnz .encode_b_bl + mov [thumb32_error],ERROR_requires_cpu_capability_arm_6m + jmp .encode_b_bl + .check_v4t: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jnz .encode_b_bl + mov [thumb32_error],ERROR_requires_cpu_capability_arm_v4t + jmp .encode_b_bl + .not_aligned: + mov [thumb16_error],ERROR_relative_jump_not_aligned + mov [thumb32_error],ERROR_relative_jump_not_aligned + jmp THUMB_post_process + +ARM_rm: + ;used by BX + call decode_template + TEMPLATE \ + <TMPL_base_reg> ;0=rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz ERROR_requires_cpu_capability_arm_v4t + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_rm + movzx eax,[operand_register0] + or ebp,eax + jmp ARM_store_instruction + +THUMB_rm: + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov al,[operand_register0] + shl al,3 + mov ah,0x47 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +THUMB_rn_address4: + ;used by LDM, STM + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .T2 + cmp [operand_register0],8 ;<r8 + jae .check_v4 + mov [thumb16_error],ERROR_instruction_not_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jnz .T2 + .check_v4: + mov [thumb16_error],ERROR_instruction_not_16bit + ;if LDM and reg is in set then must be rn,{..} + ;if STM then reg in set can only be first register + cmp [operand_register0],13 ;SP + jz .high_reg_okay + test [operand_register0],8 ;high reg? + jnz .T2 + .high_reg_okay: + test ebp,1 shl 20 ;1=LDM + jz .check_list_stm + movzx ecx,[operand_register0] + bt [reg_list_bitmap],ecx + jnc .check_rn!_list + test [code_type],CPU_ACTIVITY_THUMB_UAL + jz .check_rn!_list + cmp al,0 ;0=rn,{..} + jz .do_16 + jmp .T2 + .check_rn!_list: + cmp al,2 ;2=rn!,{..} + jz .do_16 + jmp .T2 + .check_list_stm: + cmp al,2 ;2=rn!,{..} + jnz .T2 + movzx ecx,[operand_register0] + bt [reg_list_bitmap],ecx + jnc .do_16 + bsf edx,[reg_list_bitmap] + cmp ecx,edx + jnz .T2 + .do_16: + cmp [operand_register0],13 ;SP + jz THUMB_address4 + mov edx,[arm_instruction] + and edx,0xf shl 21 + cmp edx,4 shl 21 ;IA version of LDM & STM? + mov [thumb16_error],ERROR_instruction_not_16bit + jnz .T2 + mov cl,[operand_register0] + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + cmp cl,7 + ja .T2 + mov edx,[reg_list_bitmap] + test edx,0xff00 + mov [thumb16_error],ERROR_high_base_registers_not_allowed_in_list + jnz .T2 + mov dh,cl + or dh,0xc0 + bt ebp,20 ;1=LDM, 0=STM + jnc .store + or dh,0x8 + .store: + mov [thumb16_instruction],dx + mov [thumb16_error],0 + bt ebp,20 ;1=LDM, 0=STM + jnc .T2 + mov edx,[reg_list_bitmap] + dec edx + and edx,[reg_list_bitmap] + jnz .T2 + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov edx,0xf8500b04 + mov eax,0xf8d00000 + bsr ecx,[reg_list_bitmap] + cmp cl,[operand_register0] + cmovz edx,eax + shl ecx,12 + or edx,ecx + movzx ecx,[operand_register0] + shl ecx,16 + or edx,ecx + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + .T2_2: + mov al,2 + .T2: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + ;only IA and DB are valid, bit24 <> bit23 + lea ecx,[ebp*2] + xor ecx,ebp + test ecx,1 shl 24 + mov [thumb32_error],ERROR_instruction_not_16bit + jz THUMB_post_process + cmp al,0 + jz .rn_list + cmp al,1 + jz .rn_list_t + cmp al,2 + jz .rn!_list + cmp al,3 + jz .rn!_list_t + ud2 + .rn!_list: + or [thumb32_instruction],1 shl 21 + movzx eax,[operand_register0] + bt [reg_list_bitmap],eax + mov [thumb32_error],ERROR_destination_register_not_allowed_in_list + jc THUMB_post_process + .rn_list: + mov eax,[reg_list_bitmap] + lea ecx,[eax-1] + and eax,ecx + jz .small_set + cmp [operand_register0],0xf + jz ERROR_r15_not_valid.first + test [reg_list_bitmap],1 shl 13 + jnz ERROR_sp_in_set + test ebp,1 shl 20 ;1=LDM, 0=STM + jnz .T2_LDM_checks + test [reg_list_bitmap],1 shl 15 + jnz ERROR_pc_in_set + jmp .encode + .T2_LDM_checks: + cmp [reg_list_bitmap],0xc000 + jae ERROR_invalid_set_with_lr_pc + test [reg_list_bitmap],1 shl 15 + jz .encode + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + .encode: + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,16 + or ebp,eax + or ebp,[reg_list_bitmap] + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .rn!_list_t: + .rn_list_t: + mov [thumb32_error],ERROR_instruction_not_16bit + jmp THUMB_post_process + .small_set: + ;convert to ldr/str for a register set of 1 + mov eax,[reg_list_bitmap] + mov ebp,[thumb32_instruction] + bsf eax,eax + mov ah,[operand_register0] + mov word[operand_registers+0],ax + ;IA = [reg] type 0 + ;IA! = [reg],4 type 1 + ;DB = [reg,-4] type 2 + ;DB! = [reg,-4]! type 3 + mov ecx,ebp + and ebp,1 shl 20 + or ebp,0xf8400000 ;LDR/STR + mov [thumb32_instruction],ebp + and ecx,1 shl 23 + 1 shl 21 + mov [immediate_value],0 + mov al,0 + cmp ecx,1 shl 23 + 0 shl 21 ;IA + jz THUMB2_rd_address.do + mov [immediate_value],4 + mov al,1 + cmp ecx,1 shl 23 + 1 shl 21 ;IA! + jz THUMB2_rd_address.do + mov [immediate_value],-4 + mov al,2 + cmp ecx,0 shl 23 + 0 shl 21 ;DB + jz THUMB2_rd_address.do + mov al,3 ;DB! + jmp THUMB2_rd_address.do + +THUMB_address4: + ;used by POP, PUSH + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz THUMB_rn_address4.T2_2 + mov edx,[arm_instruction] + and edx,0xf shl 21 + shr edx,21 + mov eax,[reg_list_bitmap] + bt ebp,20 ;1=POP, 0=PUSH + jc .pop + ;push + cmp dl,0x8 ;DB version of STM? + mov [thumb16_error],ERROR_instruction_not_16bit + jnz THUMB_rn_address4.T2_2 + test ax,not 0x40ff ;LR with STM + mov [thumb16_error],ERROR_high_base_registers_not_allowed_in_list.not_lr + jnz THUMB_rn_address4.T2_2 + mov ch,0xb4 + jmp .encode + .pop: + cmp dl,0x4 ;IA version of LDM? + mov [thumb16_error],ERROR_instruction_not_16bit + jnz THUMB_rn_address4.T2_2 + test ax,not 0x80ff ;PC with LDM + mov [thumb16_error],ERROR_high_base_registers_not_allowed_in_list.not_pc + jnz THUMB_rn_address4.T2_2 + mov ch,0xbc + test [reg_list_bitmap],1 shl 15 + jz .encode + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + .encode: + test ah,ah + setnz cl + or ch,cl + mov ah,ch + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_rn_address4.T2_2 + +THUMB_immediate8: + ;used by SWI + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz ERROR_requires_cpu_capability_arm_v4t + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov eax,[immediate_value] + cmp eax,0xff + ja THUMB_post_process + mov ah,0xdf + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +;v5 + +ARM_immediate16: + ;used by BKPT + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + call BKPT_force_condition_match + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_immediate8 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + mov eax,[immediate_value] + cmp eax,0x0000ffff + ja .out_of_range + mov ecx,eax + and eax,0xf + and ecx,0xfff0 + shl ecx,4 + or eax,ecx + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0xffff + jmp ARM_store_instruction_with_error + .THUMB_immediate8: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5T + jz ERROR_requires_cpu_capability_arm_v5t + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + mov eax,[immediate_value] + cmp eax,0xff + ja THUMB_post_process + mov ah,0xbe + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +ARM_Xtarget: + ;used by BLX + call decode_template + TEMPLATE \ + <TMPL_address>,\ ;0=imm PC relative + <TMPL_base_reg> ;1=rm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_Xtarget + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + cmp al,0 + jz .address + cmp al,1 + jz .rm + ud2 + .address: + mov eax,[addressing_space] + mov eax,[eax+0x00] + add eax,[immediate_value] + sub eax,edi + sub eax,8 + test eax,1 + jnz .not_aligned + cmp eax,1 shl 25 + jge .jump_out_of_range + cmp eax,-(1 shl 25) + jl .jump_out_of_range + shr eax,2 + setc cl + or cl,0xfa + and eax,0x00ffffff + or ebp,eax + shl ecx,24 + or ebp,ecx + jmp ARM_store_instruction + .jump_out_of_range: + mov ecx,ERROR_relative_jump_out_of_range + jmp ARM_store_instruction_with_error + .not_aligned: + mov ecx,ERROR_relative_jump_not_aligned + jmp ARM_store_instruction_with_error + .rm: + movzx eax,[operand_register0] + cmp eax,15 ;PC? + je ERROR_r15_not_valid + or ebp,eax + or ebp,0x012fff30 + jmp ARM_store_instruction + .THUMB_Xtarget: + cmp al,1 + jz .rm32 + mov [thumb32_error],ERROR_instruction_not_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jnz THUMB_post_process + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + call THUMB_query_condition_pc + mov eax,[addressing_space] + sub ecx,[eax+0x00] + btr ecx,1 + neg ecx + add ecx,[immediate_value] + sub ecx,4 + test ecx,3 + jnz .not_aligned32 + sar ecx,1 + mov [thumb32_error],ERROR_relative_jump_out_of_range + cmp ecx,1 shl 23 + jge THUMB_post_process + cmp ecx,-(1 shl 23) + jl THUMB_post_process + mov [thumb32_error],0 + mov edx,0xf000c000 + cmp ecx,1 shl 21 + setl al + cmp ecx,-(1 shl 21) + setge ah + and al,ah + jnz .check_x + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jnz THUMB_B_target.encode_b_bl + mov [thumb32_error],ERROR_requires_cpu_capability_arm_t2 + jmp THUMB_B_target.encode_b_bl + .check_x: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_X + jnz THUMB_B_target.encode_b_bl + mov [thumb32_error],ERROR_requires_cpu_capability_arm_x + jmp THUMB_B_target.encode_b_bl + .rm32: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v5t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5T + jz THUMB_post_process + movzx eax,[operand_register0] + cmp eax,15 ;PC? + je ERROR_r15_not_valid + shl eax,3 + or eax,0x4780 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + .not_aligned32: + mov [thumb32_error],ERROR_relative_jump_not_aligned + jmp THUMB_post_process + +ARM_nop: + ;used by NOP + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_nop + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_K + jnz ARM_store_instruction + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V1 + jz ERROR_requires_cpu_capability_arm_v1 + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,24 + or ebp,0x01a00000 ;movcc r0,r0 + jmp ARM_store_instruction + .THUMB_nop: + mov [thumb16_instruction],0xbf00 ;nop.n + mov [thumb16_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jnz .32 + mov [thumb16_instruction],0x46C0 ;mov r8,r8 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jnz .32 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + .32: + mov [thumb32_instruction],0xf3af8000 ;nop.w + mov [thumb32_error],0 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jnz THUMB_post_process + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + jmp THUMB_post_process + +ARM_rd_rm_CLZ: + ;used by CLZ + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg> ;0=rd,rm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm_CLZ + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V5 + jz ERROR_requires_cpu_capability_arm_v5 + movzx eax,[operand_register0] + cmp eax,15 ;PC? + je ERROR_r15_not_valid.first + movzx ecx,[operand_register1] + cmp ecx,15 ;PC? + je ERROR_r15_not_valid.second + shl eax,12 + or ebp,eax + or ebp,ecx + jmp ARM_store_instruction + .THUMB_rd_rm_CLZ: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov cl,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov edx,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + movzx eax,[operand_register1] + or edx,eax + shl eax,16 + or edx,eax + mov [thumb32_instruction],edx + mov [thumb32_error],0 + jmp THUMB_post_process + +;E + +ARM_rd_rm_rn: + ;used by QADD, QSUB, QDADD, QDSUB + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=rdm,rn alternate for rd,rm,rn + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=rd,rm,rn + cmp al,0 + jnz .registers_defined + mov ecx,[operand_registers] + shl ecx,8 + mov cl,ch + mov [operand_registers],ecx + .registers_defined: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm_rn + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_E + jz ERROR_requires_cpu_capability_arm_e + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.all + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,15 + jz ERROR_r15_not_valid.all + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.all + shl eax,16 + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_rm_rn: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rm + or ebp,eax + movzx eax,[operand_register2] ;rn + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_rs_rn_E: + ;used by SMLABB, SMLABT, SMLATB, SMLATT, SMLAWB, SMLAWT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rd,rm,rs,rn + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm_rn_ra + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_E + jz ERROR_requires_cpu_capability_arm_e + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,8 + or ebp,eax + movzx eax,[operand_register3] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.fourth + shl eax,12 + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_rm_rn_ra: + ;used by SMULBB, SMULBT, SMULTB, SMULTT, SMULWB, SMULWT + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov cl,0xff + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rm + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rn + or ebp,eax + movzx eax,[operand_register3] ;ra + shl eax,12 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rdlo_rdhi_rm_rs_E: + ;used by SMLALBB, SMLALBT, SMLALTB, SMLALTT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rdlo,rdhi,rm,rs + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rdlo_rdhi_rm_rs.THUMB_rdlo_rdhi_rn_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_E + jz ERROR_requires_cpu_capability_arm_e + movzx eax,[operand_register0] ;rdlo + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rdhi + shl eax,16 + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.third + or ebp,eax + movzx eax,[operand_register3] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.fourth + shl eax,8 + or ebp,eax + mov al,[operand_register0] ;rdlo + mov ah,[operand_register1] ;rdhi + cmp al,ah + jz ERROR_destination_registers_must_differ + jmp ARM_store_instruction + +ARM_rd_rm_rs_E: + ;used by SMULBB, SMULBT, SMULTB, SMULTT, SMULWB, SMULWT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=rdm,rs + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=rd,rm,rs + cmp al,0 + jnz .registers_defined + mov ax,word[operand_registers+0] + mov word[operand_registers+1],ax + .registers_defined: + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rd_rm_rs_rn_E.THUMB_rd_rm_rn_ra + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_E + jz ERROR_requires_cpu_capability_arm_e + movzx eax,[operand_register0] ;rd + shl eax,16 + cmp eax,0xf + jz ERROR_r15_not_valid.first + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,8 + or ebp,eax + jmp ARM_store_instruction + +;P + +ARM_copro_op1_rd_rn_crm: + ;used by MCRR, MRRC, MCRR2, MRRC2 + call decode_template + TEMPLATE \ + <TMPL_cpro_sel,TMPL_copro_opcode1,TMPL_base_reg,TMPL_base_reg,TMPL_cpro_reg> ;0=copro,op1,rd,rn,crm + test [code_type],CPU_ACTIVITY_ARM + jz .check_v7m + cmp ebp,0xf shl 28 ;MCRR2 or MRRC2? + jae .check_v6 + jmp .check_p + .check_v7m: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + jmp .version_check_okay + .check_p: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_P + jz ERROR_requires_cpu_capability_arm_p + jmp .version_check_okay + .check_v6: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + .version_check_okay: + movzx eax,[operand_register0] ;cpnum + shl eax,8 + or ebp,eax + movzx eax,[copro_opcode1] ;op1 + cmp eax,15 + ja .out_of_range + shl eax,4 + or ebp,eax + movzx eax,[operand_register1] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.third + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.fourth + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;crm + or ebp,eax + test ebp,1 shl 20 ;MRRC? + jz ARM_post_process_copro + movzx eax,word[operand_register1] ;rd,rn + cmp al,ah + jz ERROR_destination_registers_must_differ + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_opcode4_out_of_range + jmp ARM_post_process_copro_with_error + +ARM_address2: + ;used by PLD, PLDW, PLI + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_address + call decode_template + TEMPLATE \ + <TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=[rn] + <TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=[rn,imm] + <TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ;2=[rn,+-rm] + <TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right>,\ ;3=[rn,+-rm,shift imm] + <TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_rrx_op,TMPL_bracket_right>,\ ;4=[rn,+-rm,rrx] + <TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;5=[imm] PC relative + <TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;6=[exp] implicit reg from structure + test ebp,1 shl 24 ;PLI=1? + jnz .check_v7 + test ebp,1 shl 22 ;PLDW=0? + jnz .check_P + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_MP + jz ERROR_requires_cpu_capability_arm_mp + cmp [operand_register0],0xf + jz ERROR_r15_not_valid.base + jmp .version_check_okay + .check_v7: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz ERROR_requires_cpu_capability_arm_v7 + jmp .version_check_okay + .check_P: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_P + jz ERROR_requires_cpu_capability_arm_p + .version_check_okay: + or ebp,0xf shl 28 + mov ecx,[operand_registers] + shl ecx,8 + mov cl,0xf + mov [operand_registers],ecx + cmp al,0 + jz ARM_rd_address2.rd_q_rn_p + cmp al,1 + jz ARM_rd_address2.rd_q_rn_imm_p + cmp al,2 + jz ARM_rd_address2.rd_q_rn_PMrm_p + cmp al,3 + jz ARM_rd_address2.rd_q_rn_PMrm_shift_imm_p + cmp al,4 + jz ARM_rd_address2.rd_q_rn_PMrm_rrx_p + cmp al,5 + jz ARM_rd_address2.rd_q_imm_p + cmp al,6 + jz ARM_rd_address2.rd_q_exp_p + ud2 + +THUMB2_address: + ;used by PLD + call decode_template + TEMPLATE \ + <TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0(0)=[rn] + <TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1(2)=[rn,imm] + <TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ;2(4)=[rn,rm] + <TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm2,TMPL_bracket_right>,\ ;3(5)=[rn,rm,shift imm] + <TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;4(6)=[imm] PC relative + <TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5(7)=[exp] implicit reg from structure + mov ecx,[operand_registers] + shl ecx,8 + or ecx,8 ;fake rd as r8 to prevent 16bit code generation + mov [operand_registers],ecx + add al,2 + cmp al,3 + ja THUMB2_rd_address.do + dec al + shr al,1 + add al,al + jmp THUMB2_rd_address.do + +;J + +ARM_rm_J: + ;used by BXJ + call decode_template + TEMPLATE \ + <TMPL_base_reg> ;0=rm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rm_j + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_J + jz ERROR_requires_cpu_capability_arm_j + movzx eax,[operand_register0] + or ebp,eax + cmp eax,15 ;PC? + jz ERROR_r15_not_valid + jmp ARM_store_instruction + .THUMB_rm_j: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov ecx,0x11 + call THUMB2_check_bad_regs + jc THUMB_post_process + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +;v6 + +ARM_mode: + ;used by CPS + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm5 + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_mode + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + mov eax,[immediate_value] + cmp eax,31 + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0x1f + jmp ARM_store_instruction_with_error + .THUMB_mode: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + mov ebp,[thumb32_instruction] + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0x1f + mov eax,[immediate_value] + cmp eax,31 + ja THUMB_post_process + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_iflags_mode: + ;used by CPSID, CPSIE + call decode_template + TEMPLATE \ + <TMPL_iflags>,\ ;0=flags + <TMPL_iflags,TMPL_imm> ;1=flags,mode + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_iflags_mode + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + cmp al,1 + jnz .iflags + .iflags_mode: + mov eax,[immediate_value] + cmp eax,31 + ja .out_of_range + or ebp,1 shl 17 + or ebp,eax + .iflags: + movzx eax,[operand_register0] + shl eax,6 + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0x1f + jmp ARM_store_instruction_with_error + .THUMB_iflags_mode: + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + mov [thumb16_error],ERROR_requires_cpu_capability_arm_7m + cmp al,1 + jz .T2 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_ALIGN + jnz .THUMB_iflags_aif + mov [thumb16_error],ERROR_requires_cpu_capability_arm_align + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jnz .THUMB_iflags_if + mov [thumb16_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jnz .THUMB_iflags_i + mov [thumb16_error],ERROR_requires_cpu_capability_arm_6m + jmp .T2 + .THUMB_iflags_i: + test [operand_register0],101b + jnz .T2 + .THUMB_iflags_if: + test [operand_register0],100b + jnz .T2 + .THUMB_iflags_aif: + mov ebp,0xb660 + mov ecx,[arm_instruction] + and ecx,1 shl 18 + shr ecx,18-4 + or ebp,ecx + movzx ecx,[operand_register0] + or ebp,ecx + mov [thumb16_instruction],bp + mov [thumb16_error],0 + .T2: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_t2 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz THUMB_post_process + mov ebp,[thumb32_instruction] + cmp al,1 + jnz .T2_iflags + .T2_iflags_mode: + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0x1f + mov eax,[immediate_value] + cmp eax,31 + ja THUMB_post_process + or ebp,1 shl 8 + or ebp,eax + .T2_iflags: + movzx eax,[operand_register0] + shl eax,5 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_CPY: + ;used by CPY + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg> ;0=reg,reg + test [code_type],CPU_ACTIVITY_ARM + mov al,2 + jnz ARM_rd_shifter.do + .THUMB_rd_rm: + mov ax,word[operand_registers+0] + mov [operand_register2],ah + test ax,0x0808 ;any high registers used? + jnz THUMB_MOV_rd_rn_shifter.hreg1_hreg2 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v6t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6T + jz THUMB_GEN_rd_rn_shifter.reg_reg_reg + jmp THUMB_MOV_rd_rn_shifter.hreg1_hreg2.do + +ARM_rd_q_rn_p: + ;used by LDREX, LDREXB, LDREXH, LDA, LDAB, LDAH, LDAEX, LDAEXB, LDAEXH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=reg,[reg] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=reg,[reg,imm] (for T2 ldrex only) + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=reg,[exp] (for T2 ldrex only) + test ebp,1 shl 8 + jnz .not_v8 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + test [code_type],CPU_ACTIVITY_ARM + jnz .version_okay + cmp [immediate_value],0 + jnz ERROR_immediate_cannot_be_encoded + jmp .THUMB_version_okay + .not_v8: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_q_rn_imm_p + test ebp,3 shl 21 ;LDREXB or LDREXH? + jz .check_v6 + .check_v6k: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_K + jz ERROR_requires_cpu_capability_arm_k + jmp .version_okay + .check_v6: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + .version_okay: + cmp [immediate_value],0 + jnz ERROR_immediate_cannot_be_encoded + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_q_rn_imm_p: + test ebp,3 shl 21 ;LDREXB or LDREXH (!=0)? + jz .check_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_SYNC + jz ERROR_requires_cpu_capability_arm_sync + cmp [immediate_value],0 + jnz ERROR_immediate_cannot_be_encoded + jmp .THUMB_version_okay + .check_7m: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + .THUMB_version_okay: + mov cl,0x13 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0x3fc + test eax,not (0xff shl 2) + jnz THUMB_post_process + shr eax,2 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rn_rm_shift_imm: + ;used by PKHBT, PKHTB + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;1=reg,reg,shift imm alternate for reg,reg,reg,shift imm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg>,\ ;2=reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm> ;3=reg,reg,reg,shift imm + cmp al,2 + jae .do + mov cx,word[operand_register0] + mov word[operand_register1],cx + .do: + test ebp,1 shl 6 + jz .lsl + test al,1 + jnz .asr + ;convert to pkhbt rd,rm,rn + .convert: + mov ax,word[operand_register1] + xchg ah,al + mov word[operand_register1],ax + and ebp,not (1 shl 6) + and [thumb32_instruction],not (1 shl 5) + jmp .encode + .asr: + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_ASR + jnz ERROR_shift_type_must_be_ASR + mov eax,[immediate_value] + sub eax,1 + jc .convert + cmp eax,31 + ja ERROR_shift_value_out_of_range.1_32 + inc eax + and eax,0x1f + mov [immediate_value],eax + jmp .encode + .lsl: + cmp al,0 + jz .encode + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz ERROR_shift_type_must_be_LSL + mov eax,[immediate_value] + cmp eax,31 + ja ERROR_shift_value_out_of_range.0_31 + .encode: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_encode + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + mov eax,[immediate_value] + shl eax,7 + or ebp,eax + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,15 + jz ERROR_r15_not_valid.third + or ebp,eax + jmp ARM_store_instruction + .THUMB_encode: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + mov eax,[immediate_value] + mov ecx,eax + and eax,0x3 + and ecx,0x7 shl 2 + shl eax,6 + shl ecx,12-2 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rn_rm: + ;used by QADD16, QADD8, QADDSUBX, QSUB16, QSUB8, QSUBADDX, + ; SADD16, SADD8, SADDSUBX, SSUB16, SSUB8, SSUBADDX, + ; SHADD16, SHADD8, SHADDSUBX, SHSUB16, SHSUB8, SHSUBADDX, + ; UADD16, UADD8, UADDSUBX, USUB16, USUB8, USUBADDX, + ; UHADD16, UHADD8, UHADDSUBX, UHSUB16, UHSUB8, UHSUBADDX, + ; UQADD16, UQADD8, UQADDSUBX, UQSUB16, UQSUB8, UQSUBADDX, + ; SEL + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=reg,reg,reg + cmp al,0 + jnz .encode + mov ax,word[operand_register0] + mov word[operand_register1],ax + .encode: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rn_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,15 + jz ERROR_r15_not_valid.third + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_rn_rm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_REV: + ;used by RBIT, REV, REV16, REVSH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg> ;0=rd,rm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm + mov ecx,ebp + and ecx,1 shl 22 + 1 shl 7 + cmp ecx,1 shl 22 + 0 shl 7 ;RBIT? + jnz .check_v6 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + jmp .ARM_version_okay + .check_v6: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + .ARM_version_okay: + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,15 + jz ERROR_r15_not_valid.second + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_rm: + mov ecx,ebp + and ecx,1 shl 22 + 1 shl 7 + cmp ecx,1 shl 22 + 0 shl 7 ;RBIT? + jz .T2 + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v6t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6T + jz .T2 + mov eax,ebp + and eax,1 shl 7 + and ebp,1 shl 22 + shr eax,7-6 + shr ebp,22-7 + or ebp,eax + movzx eax,[operand_register0] ;rd + cmp eax,7 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + ja .T2 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,7 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + ja .T2 + shl eax,3 + or ebp,eax + or ebp,0xba00 + mov [thumb16_instruction],bp + mov [thumb16_error],0 + .T2: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov cl,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rm + or ebp,eax + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rn: + ;used by RFE + call decode_template + TEMPLATE \ + <TMPL_base_reg>,\ ;0=rn + <TMPL_base_reg!> ;1=rn! + movzx eax,al + shl eax,21 + movzx ecx,[operand_register0] ;rn + cmp ecx,15 + jz ERROR_r15_not_valid.first + shl ecx,16 + or ecx,eax ;define W bit + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rn + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + or ebp,ecx + jmp ARM_store_instruction + .THUMB_rn: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov eax,ebp + shl eax,1 + xor eax,ebp + test eax,1 shl 24 ;bit23 <> bit24? + jz ERROR_instruction_not_16bit + mov ebp,[thumb32_instruction] + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_endian: + ;used by SETEND + call decode_template + TEMPLATE \ + <TMPL_endian> ;0=endian + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_endian + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx eax,[operand_register0] ;endian + shl eax,9 + or ebp,eax + jmp ARM_store_instruction + .THUMB_endian: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_ALIGN + jz ERROR_requires_cpu_capability_arm_align + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + movzx ebp,[operand_register0] ;endian + shl ebp,3 + or ebp,0xb650 + mov [thumb16_instruction],bp + mov [thumb16_error],0 + jmp THUMB_post_process + +ARM_rd_rm_rs_rn_D: + ;used by SMLAD, SMLADX, SMLSD, SMLSDX, SMMLA, SMMLAR, SMMLS, SMMLSR, USADA8 + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rd,rm,rs,rn + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + jmp ARM_rd_rm_rs_rn.encode + +ARM_rdlo_rdhi_rm_rs_D: + ;used by SMLALD, SMLALDX, SMLSLD, SMLSLDX + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rdlo,rdhi,rm,rs + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rdlo_rdhi_rm_rs.THUMB_rdlo_rdhi_rn_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + jmp ARM_rdlo_rdhi_rm_rs.encode + +ARM_rd_rm_rs_M: + ;used by SMMUL, SMMULR, SMUAD, SMUADX, SMUSD, SMUSDX + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=rd,rm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=rd,rm,rs + mov [operand_register3],0 ;rn=0 + cmp al,0 + jnz .do + mov ax,word[operand_registers+0] + mov word[operand_registers+1],ax + .do: + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rd_rm_rs_rn.THUMB_rd_rm_rs_rn + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + jmp ARM_rd_rm_rs_rn.encode + +ARM_reg_mode: + ;used by SRS + call decode_template + TEMPLATE \ + <TMPL_imm>,\ ;0=mode + <TMPL_imm,TMPL_modifier_exclaim>,\ ;1=mode ! + <TMPL_base_reg,TMPL_imm>,\ ;2=sp,mode + <TMPL_base_reg!,TMPL_imm> ;3=sp!,mode + cmp al,2 + jb .set_mode + cmp [operand_register0],13 ;SP? + jnz ERROR_register_out_of_range.must_be_sp + .set_mode: + mov ecx,eax + and ecx,1 + shl ecx,21 + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_reg_mode + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + or ebp,ecx ;define W bit + mov eax,[immediate_value] + cmp eax,31 + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0x1f + jmp ARM_store_instruction_with_error + .THUMB_reg_mode: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov eax,ebp + shl eax,1 + xor eax,ebp + test eax,1 shl 24 ;bit23 <> bit24? + jz ERROR_instruction_not_16bit + mov ebp,[thumb32_instruction] + or ebp,ecx + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0x1f + mov eax,[immediate_value] + cmp eax,31 + ja THUMB_post_process + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_imm_rm_shift: + ;used by SSAT, USAT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_base_reg>,\ ;0=reg,imm,reg + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_base_reg,TMPL_shift_op,TMPL_imm2> ;1=reg,imm,reg,shift imm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_imm_rm_shift + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx ecx,[operand_register0] ;rd + cmp ecx,15 + jz ERROR_r15_not_valid.first + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + cmp ecx,15 + jz ERROR_r15_not_valid.third + or ebp,ecx + mov ecx,[immediate_value] + test ebp,1 shl 22 ;USAT=1? + setz dl + movzx edx,dl + sub ecx,edx + cmp ecx,31 + ja .immediate_value_out_of_range + shl ecx,16 + or ebp,ecx + cmp al,1 ;reg,imm,reg,shift imm? + jnz ARM_store_instruction + mov dl,[instruction_shift_op] + cmp dl,ARM_SHIFT_OPCODE_LSL + jz .lsl + cmp dl,ARM_SHIFT_OPCODE_ASR + jnz ERROR_shift_type_must_be_LSL_or_ASR + mov ecx,ERROR_shift_value_out_of_range.1_32 + mov edx,[immediate_value2] + test edx,edx + jz .lsl + cmp edx,32 + ja ARM_store_instruction_with_error + and edx,0x1f + shl edx,7 + or ebp,edx + or ebp,1 shl 6 + jmp ARM_store_instruction + .lsl: + mov ecx,ERROR_shift_value_out_of_range.0_31 + mov edx,[immediate_value2] + cmp edx,31 + ja ARM_store_instruction_with_error + shl edx,7 + or ebp,edx + jmp ARM_store_instruction + .immediate_value_out_of_range: + test ebp,1 shl 22 ;USAT=1? + mov ecx,ERROR_immediate_value_out_of_range.1_32 + mov edx,ERROR_immediate_value_out_of_range.0_31 + cmovnz ecx,edx + jmp ARM_store_instruction_with_error + .THUMB_rd_imm_rm_shift: + mov ebp,[thumb32_instruction] + mov cl,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + movzx ecx,[operand_register0] ;rd + shl ecx,8 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + shl ecx,16 + or ebp,ecx + mov ecx,ERROR_immediate_value_out_of_range.1_32 + mov edx,ERROR_immediate_value_out_of_range.0_31 + test ebp,1 shl 23 ;USAT=1? + cmovnz ecx,edx + mov [thumb32_error],ecx + mov ecx,[immediate_value] + setz dl + movzx edx,dl + sub ecx,edx + cmp ecx,31 + ja THUMB_post_process + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + cmp al,1 ;reg,imm,reg,shift imm? + jnz THUMB_post_process + mov dl,[instruction_shift_op] + cmp dl,ARM_SHIFT_OPCODE_LSL + jz .THUMB_lsl + cmp dl,ARM_SHIFT_OPCODE_ASR + jnz ERROR_shift_type_must_be_LSL_or_ASR + mov [thumb32_error],ERROR_shift_value_out_of_range.1_31 + mov edx,[immediate_value2] + test edx,edx + jz .THUMB_encode_shift + cmp edx,31 + ja THUMB_post_process + or ebp,1 shl 21 + .THUMB_encode_shift: + mov eax,edx + and eax,3 + and edx,7 shl 2 + shl eax,6 + shl edx,12-2 + or ebp,eax + or ebp,edx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .THUMB_lsl: + mov [thumb32_error],ERROR_shift_value_out_of_range.0_31 + mov edx,[immediate_value2] + cmp edx,31 + ja THUMB_post_process + jmp .THUMB_encode_shift + +ARM_rd_imm_rm: + ;used by SSAT16, USAT16 + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_base_reg> ;0=reg,imm,reg + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_imm_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx ecx,[operand_register0] ;rd + cmp ecx,15 + jz ERROR_r15_not_valid.first + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + cmp ecx,15 + jz ERROR_r15_not_valid.third + or ebp,ecx + mov ecx,[immediate_value] + test ebp,1 shl 22 ;USAT16=1? + setz dl + movzx edx,dl + sub ecx,edx + cmp ecx,15 + ja .immediate_value_out_of_range + shl ecx,16 + or ebp,ecx + jmp ARM_store_instruction + .immediate_value_out_of_range: + test ebp,1 shl 22 ;USAT16=1? + mov ecx,ERROR_immediate_value_out_of_range.1_16 + mov edx,ERROR_immediate_value_out_of_range.0_15 + cmovnz ecx,edx + jmp ARM_store_instruction_with_error + .THUMB_rd_imm_rm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov ebp,[thumb32_instruction] + mov cl,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + movzx ecx,[operand_register0] ;rd + shl ecx,8 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + shl ecx,16 + or ebp,ecx + mov ecx,ERROR_immediate_value_out_of_range.1_16 + mov edx,ERROR_immediate_value_out_of_range.0_15 + test ebp,1 shl 23 ;USAT16=1? + cmovnz ecx,edx + mov [thumb32_error],ecx + mov ecx,[immediate_value] + setz dl + movzx edx,dl + sub ecx,edx + cmp ecx,15 + ja THUMB_post_process + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_q_rn_p_STREX: + ;used by STREX, STREXB, STREXH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,rm,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=rd,rm,[rn,imm] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=rd,rm,[exp] + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_rd_rm_q_rn_p_STREX + mov ecx,ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz ARM_store_instruction_with_error + test ebp,3 shl 21 ;STREXB or STREXH? + jz .check_v6 + .check_v6k: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_K + jz ERROR_requires_cpu_capability_arm_k + jmp .version_okay + .check_v6: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + .version_okay: + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,16 + or ebp,eax + mov al,[operand_register0] ;rd + mov ah,[operand_register1] ;rm + mov cl,[operand_register2] ;rn + cmp al,cl + jz ERROR_dest_cannot_be_source_or_memory_address + cmp al,ah + jz ERROR_dest_cannot_be_source_or_memory_address + jmp ARM_store_instruction + +THUMB_rd_rm_q_rn_p_STREX: + mov cl,0x37 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov [thumb32_error],ERROR_dest_cannot_be_source_or_memory_address + movzx eax,[operand_register0] ;rd + movzx ecx,[operand_register1] ;rm + movzx edx,[operand_register2] ;rn + cmp eax,ecx + jz THUMB_post_process + cmp eax,edx + jz THUMB_post_process + test ebp,3 shl 21 ;STREXB or STREXH? + mov ebp,[thumb32_instruction] + jz .strex + ;STREXB or STREXH + or ebp,eax + shl ecx,12 + or ebp,ecx + shl edx,16 + or ebp,edx + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_SYNC + jz ERROR_requires_cpu_capability_arm_sync + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz THUMB_post_process + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .strex: + shl eax,8 + or ebp,eax + shl ecx,12 + or ebp,ecx + shl edx,16 + or ebp,edx + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0x3fc + mov eax,[immediate_value] + test eax,not (0xff shl 2) + jnz THUMB_post_process + shr eax,2 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rn_rm_rotation: + ;used by SXTAB, SXTAB16, SXTAH, UXTAB, UXTAB16, UXTAH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg>,\ ;0=rd,rn,rm + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm> ;1=rd,rn,rm,ror imm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rn_rm_rotation + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx ecx,[operand_register0] ;rd + cmp ecx,0xf + jz ERROR_r15_not_valid.first + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;rn + cmp ecx,0xf + jz ERROR_r15_not_valid.second + shl ecx,16 + or ebp,ecx + movzx ecx,[operand_register2] ;rm + cmp ecx,0xf + jz ERROR_r15_not_valid.third + or ebp,ecx + cmp al,1 + jnz ARM_store_instruction + mov cl,[instruction_shift_op] + cmp cl,ARM_SHIFT_OPCODE_ROR + jnz ERROR_shift_type_must_be_ROR + mov ecx,[immediate_value] + test ecx,not (3 shl 3) + jnz ERROR_shift_value_out_of_range.0_24 + shl ecx,10-3 + or ebp,ecx + jmp ARM_store_instruction + .THUMB_rd_rn_rm_rotation: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx ecx,[operand_register0] ;rd + shl ecx,8 + or ebp,ecx + movzx ecx,[operand_register1] ;rn + shl ecx,16 + or ebp,ecx + movzx ecx,[operand_register2] ;rm + or ebp,ecx + cmp al,1 + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jnz THUMB_post_process + mov [thumb32_error],ERROR_shift_type_must_be_ROR + mov cl,[instruction_shift_op] + cmp cl,ARM_SHIFT_OPCODE_ROR + jnz THUMB_post_process + mov [thumb32_error],ERROR_shift_value_out_of_range.0_24 + mov ecx,[immediate_value] + test ecx,not (3 shl 3) + jnz THUMB_post_process + shl ecx,4-3 + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_rotation: + ;used by SXTB, SXTB16, SXTH, UXTB, UXTB16, UXTH + call decode_template + TEMPLATE \ + <TMPL_base_reg>,\ ;0=rdm + <TMPL_base_reg,TMPL_shift_op,TMPL_imm>,\ ;1=rdm,ror imm + <TMPL_base_reg,TMPL_base_reg>,\ ;2=rd,rm + <TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm> ;3=rd,rm,ror imm + sub al,2 + jnc .registers_okay + mov cl,[operand_register0] + mov [operand_register1],cl + .registers_okay: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx ecx,[operand_register0] ;rd + cmp ecx,0xf + jz ERROR_r15_not_valid.first + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + cmp ecx,0xf + jz ERROR_r15_not_valid.second + or ebp,ecx + cmp al,1 + jnz ARM_store_instruction + mov cl,[instruction_shift_op] + cmp cl,ARM_SHIFT_OPCODE_ROR + jnz ERROR_shift_type_must_be_ROR + mov ecx,[immediate_value] + test ecx,not (3 shl 3) + jnz ERROR_shift_value_out_of_range.0_24 + shl ecx,10-3 + or ebp,ecx + jmp ARM_store_instruction + .THUMB_rd_rm: + test ebp,1 shl 21 + jz .THUMB_rd_rm_rotation.t2 ;SXTB16, UXTB16 not encodable + cmp al,0 + jz .rotation_okay + cmp [immediate_value],0 + jnz .THUMB_rd_rm_rotation + .rotation_okay: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v6t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6T + jz .THUMB_rd_rm_rotation + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + movzx edx,word[operand_register0] ;rd,rm + test dx,0x0808 + jnz .THUMB_rd_rm_rotation + shl dh,3 + or dl,dh + test ebp,1 shl 20 + setz cl + shl cl,6 + or dl,cl + test ebp,1 shl 22 + setnz cl + shl cl,7 + or dl,cl + mov dh,0xb2 + mov [thumb16_instruction],dx + mov [thumb16_error],0 + .THUMB_rd_rm_rotation.t2: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_t2 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz THUMB_post_process + jmp .THUMB_rd_rm_rotation.do + .THUMB_rd_rm_rotation: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + .THUMB_rd_rm_rotation.do: + mov cl,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx ecx,[operand_register0] ;rd + shl ecx,8 + or ebp,ecx + movzx ecx,[operand_register1] ;rm + or ebp,ecx + cmp al,1 + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jnz THUMB_post_process + mov [thumb32_error],ERROR_shift_type_must_be_ROR + mov cl,[instruction_shift_op] + cmp cl,ARM_SHIFT_OPCODE_ROR + jnz THUMB_post_process + mov [thumb32_error],ERROR_shift_value_out_of_range.0_24 + mov ecx,[immediate_value] + test ecx,not (3 shl 3) + jnz THUMB_post_process + shl ecx,4-3 + or ebp,ecx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rm_rs_SAD: + ;used by USAD8 + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=rd,rm,rs + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rd_rn_rm.THUMB_rd_rn_rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V6 + jz ERROR_requires_cpu_capability_arm_v6 + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,8 + or ebp,eax + jmp ARM_store_instruction + +;K + +ARM_clrex: + ;used by CLREX + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_clrex + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_K + jz ERROR_requires_cpu_capability_arm_k + jmp ARM_store_instruction + .THUMB_clrex: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rt_rt2_q_rn_p: + ;used by LDREXD, LDAEXD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rt,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right> ;1=rt,rt2,[rn] + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rt_rt2_q_rn_p + mov ecx,[operand_registers] ;rt,rt2,rn + cmp al,1 + jnz .check_rt + sub ch,1 + cmp ch,cl + jnz ERROR_destination_registers_must_be_consecutive + shr ecx,8 + .check_rt: + test cl,1 + jnz ERROR_destination_register_must_be_even + cmp cl,14 + jz ERROR_r14_not_valid.first + mov [operand_registers],ecx ;rt,rn + test ebp,1 shl 8 + jnz ARM_rd_q_rn_p.check_v6k + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + jmp ARM_rd_q_rn_p.version_okay + .THUMB_rt_rt2_q_rn_p: + test ebp,1 shl 8 + jnz .check_v7 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + jmp .THUMB_version_okay + .check_v7: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz ERROR_requires_cpu_capability_arm_v7 + .THUMB_version_okay: + cmp al,1 + jz .check_bad + mov ecx,[operand_registers] ;rt,rn + shl ecx,8 + mov cl,ch + inc ch + mov [operand_registers],ecx ;rt,rt2,rn + .check_bad: + mov cl,0x37 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov [thumb32_error],ERROR_destination_registers_must_differ + mov ecx,[operand_registers] + cmp ch,cl + jz THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rt + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rt2 + shl eax,8 + or ebp,eax + movzx eax,[operand_register2] ;rn + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rt_rt2_q_rn_p: + ;used by STREXD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,rt,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right> ;1=rd,rt,rt2,[rn] + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rt_rt2_q_rn_p + mov ecx,[operand_registers] ;rd,rt,rt2,rn + cmp al,1 + jnz .check_rt + mov eax,ecx + shr eax,8 + sub ah,1 + cmp ah,al + jnz ERROR_source_registers_must_be_consecutive + mov eax,ecx + shr ecx,8 + mov ch,cl + mov cl,al + .check_rt: + test ch,1 + jnz ERROR_source_register_must_be_even + cmp ch,14 + jz ERROR_r14_not_valid.second + mov [operand_registers],ecx ;rd,rt,rn + inc ch + cmp ch,cl + jz ERROR_source_and_dest_must_differ + jmp ARM_rd_rm_q_rn_p_STREX.check_v6k + .THUMB_rd_rt_rt2_q_rn_p: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz ERROR_requires_cpu_capability_arm_v7 + .THUMB_adjust_three_to_four: + cmp al,1 + jz .check_bad + mov ecx,[operand_registers] ;rd,rt,rn + mov edx,ecx + inc ch + shl ecx,8 + mov cx,dx + mov [operand_registers],ecx + .check_bad: + mov cl,0x7f + call THUMB2_check_bad_regs + jc THUMB_post_process + mov [thumb32_error],ERROR_source_and_dest_must_differ + mov cl,[operand_register0] + cmp cl,[operand_register1] + jz THUMB_post_process + cmp cl,[operand_register2] + jz THUMB_post_process + cmp cl,[operand_register3] + jz THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + or ebp,eax + movzx eax,[operand_register1] ;rt + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rt2 + shl eax,8 + or ebp,eax + movzx eax,[operand_register3] ;rn + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +;Z + +ARM_immediate4: + ;used by SMC, SMI + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_Z + jz ERROR_requires_cpu_capability_arm_z + mov eax,[immediate_value] + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_immediate4 + cmp eax,0xf + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_15 + jmp ARM_store_instruction_with_error + .THUMB_immediate4: + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb32_error],ERROR_immediate_value_out_of_range.0_15 + cmp eax,0xf + ja THUMB_post_process + mov ebp,[thumb32_instruction] + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +;v6T2 + +ARM_rd_address3T: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB2_rd_address + ;used by LDRHT, LDRSHT, LDRSBT, STRHT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ;1=rd,[rn],+-rm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm> ;2=rd,[rn],imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + jmp ARM_rd_address3.version_check_okay + +THUMB_rd_rn_imm12: + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_rd_rn_shifter + ;used by ADDW, SUBW + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm>,\ ;0=reg,imm alternate for reg,reg,imm + <TMPL_base_reg,TMPL_base_reg,TMPL_imm> ;1=reg,reg,imm + cmp al,1 + jz .encode + mov al,[operand_register0] + mov [operand_register1],al + .encode: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov [thumb32_error],ERROR_instruction_not_16bit + test [instruction_condition],FLAG_CONDITION_SET + jnz THUMB_post_process + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0xfff + mov eax,[immediate_value] + mov edx,[thumb32_instruction] + mov ecx,eax + mov ebp,edx + xor ebp,5 shl 21 + neg ecx + cmovns eax,ecx + cmovns edx,ebp + mov [thumb32_instruction],edx + mov [immediate_value],eax + test eax,not 0xfff + jnz THUMB_post_process + mov cl,0x31 + cmp [operand_register1],13 + jnz .check_bad_regs + mov cl,0x03 + .check_bad_regs: + jmp THUMB_GEN_rd_rn_shifter.reg_reg_imm.encode + +ARM_rd_imm_imm: + ;used by BFC + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;0=reg,imm,imm + jmp ARM_rd_rn_imm_imm.do + +ARM_rd_rn_imm_imm: + ;used by BFI + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;0=reg,reg,imm,imm + .do: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rn_imm_imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + movzx eax,[operand_register0] + cmp eax,15 + jz ERROR_r15_not_valid + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + cmp eax,15 + jz ERROR_r15_not_valid + or ebp,eax + mov eax,[immediate_value] + cmp eax,31 + mov ecx,ERROR_lsb_out_of_range.0_31 + ja ARM_store_instruction_with_error + shl eax,7 + or ebp,eax + mov ecx,ERROR_width_out_of_range + mov edx,[immediate_value2] + shr eax,7 + add eax,edx + jc ARM_store_instruction_with_error + cmp eax,32 + ja ARM_store_instruction_with_error + dec eax + shl eax,16 + or ebp,eax + jmp ARM_store_instruction + .THUMB_rd_rn_imm_imm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov ecx,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + mov [thumb32_error],ERROR_lsb_out_of_range.0_31 + mov eax,[immediate_value] + cmp eax,31 + ja THUMB_post_process + mov ecx,eax + mov edx,eax + and ecx,3 + and edx,0x1c + shl ecx,6 + shl edx,12-2 + or ebp,ecx + or ebp,edx + mov [thumb32_error],ERROR_width_out_of_range + mov edx,[immediate_value2] + add eax,edx + jc THUMB_post_process + cmp eax,32 + ja THUMB_post_process + dec eax + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMB_reg_address: + ;used by CBNZ, CBZ + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_address> ;0=reg,imm PC relative + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + mov ebp,[thumb32_instruction] + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + movzx eax,[operand_register0] + cmp eax,7 + ja THUMB_post_process + or ebp,eax + mov [thumb16_error],ERROR_relative_jump_not_aligned + mov ecx,edi + mov eax,[addressing_space] + sub ecx,[eax+0x00] + neg ecx + add ecx,[immediate_value] + sub ecx,4 + cmp [value_undefined],0 + jz .offset_okay + xor ecx,ecx + .offset_okay: + test ecx,1 + jnz THUMB_post_process + sar ecx,1 + mov [thumb32_error],ERROR_relative_jump_out_of_range + cmp ecx,1 shl 6 + jae THUMB_post_process + mov eax,ecx + and eax,0x1f + and ecx,0x20 + shl eax,3 + shl ecx,9-5 + or ebp,eax + or ebp,ecx + mov [thumb16_instruction],bp + mov [thumb16_error],0 + jmp THUMB_post_process + +THUMB_condition: + ;used by IT + call decode_template + TEMPLATE \ + <TMPL_condition> ;0=condition + test [code_type],CPU_ACTIVITY_ARM + jnz .version_check_okay + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + .version_check_okay: + cmp [explicit_IT_state],0 + jnz ERROR_instruction_not_conditional + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + cmp eax,0xe ;AL? + jnz .AL_okay + bsf ecx,ebp + mov edx,ebp + btr edx,ecx + and edx,0xf + jnz ERROR_al_has_no_inverse + .AL_okay: + shl eax,4 + mov edx,eax + or edx,1 + or ebp,eax + and eax,0x10 + bsf ecx,ebp + cmp ecx,3 + jz .store + mov ebx,8 + .next_bit: + shl edx,8 + mov dl,[operand_register0] + test ebp,ebx + setnz ch + xor dl,ch + shl dl,4 + or dl,1 + shr eax,1 + xor ebp,eax + shr ebx,1 + inc cl + cmp cl,3 + jnz .next_bit + .store: + xor eax,eax + .swap_order: + shl eax,8 + mov al,dl + shr edx,8 + jnz .swap_order + or eax,2 + mov [explicit_IT_state],eax + mov [thumb16_instruction],bp + mov [thumb16_error],0 + .finalise: + test [code_type],CPU_ACTIVITY_ARM + jz THUMB_post_process + and eax,not 2 ;activate the block + mov [explicit_IT_state],eax + jmp instruction_assembled + +THUMB2_rd_address_rm_translate_table: + ;bits 24..20 translate to 11..9 + ;used for rd,[rn,rm] 16bit encoding + db 00100b ;000 str + db 00010b ;001 strh + db 00000b ;010 strb + db 10001b ;011 ldrsb + db 00101b ;100 ldr + db 00011b ;101 ldrh + db 00001b ;110 ldrb + db 10011b ;111 ldrsh + +THUMB2_rd_address_imm_translate_table: + ;bits 22..20 translate to 15..11 + ;used for rd,[rn,imm] 16bit encoding + db 01110b ;strb 000 + db 01111b ;ldrb 001 + db 10000b ;strh 010 + db 10001b ;ldrh 011 + db 01100b ;str 100 + db 01101b ;ldr 101 + +THUMB2_rd_address: + cmp [operand_size],8 ;LDRD or STRD? + jz THUMB2_rd_rd2_address + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=rd,[rn],imm POP {reg} + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;2=rd,[rn,imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;3=rd,[rn,imm]! PUSH {reg} + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ;4=rd,[rn,rm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm2,TMPL_bracket_right>,\ ;5=rd,[rn,rm,shift imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;6=rd,[imm] PC relative + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;7=rd,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;8=rd,[exp]! implicit reg from structure + ; T2 encoding, *???(??) = available in T1, ??? = bits 11..9, ????? = bits 15..11, ^=modified behaviour in T2EE mode + ; + ;* ldr 11111000u101<pc>ttttiiiiiiiiiiii if t=15 & InITBlock() & !LastInITBlock() then UNPREDICTABLE + ; ldrb 11111000u001<pc>ttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; PLD if t=15 (6T2) + ; ldrh 11111000u011<pc>ttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; + ; ldrsb 11111001u001<pc>ttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; PLI if t=15 (v7) + ; ldrsh 11111001u011<pc>ttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; + ; + ;*01101 ldr 111110001101nnnnttttiiiiiiiiiiii if t=15 & InITBlock() & !LastInITBlock() then UNPREDICTABLE + ;*01111 ldrb 111110001001nnnnttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; PLD if t=15 (6T2) + ;*10001 ldrh 111110001011nnnnttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; PLDW if t=15 (MP) + ; ldrsb 111110011001nnnnttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; PLI if t=15 (v7) + ; ldrsh 111110011011nnnnttttiiiiiiiiiiii if BadReg(t) then UNPREDICTABLE; + ; + ; ldrt 111110000101nnnntttt1110iiiiiiii if BadReg(t) then UNPREDICTABLE; + ; ldrbt 111110000001nnnntttt1110iiiiiiii if BadReg(t) then UNPREDICTABLE; + ; ldrht 111110000011nnnntttt1110iiiiiiii if BadReg(t) then UNPREDICTABLE; + ; ldrsbt 111110010001nnnntttt1110iiiiiiii if BadReg(t) then UNPREDICTABLE; + ; ldrsht 111110010011nnnntttt1110iiiiiiii if BadReg(t) then UNPREDICTABLE; + ; + ; ldr 111110000101nnnntttt1puwiiiiiiii if (wback & n=t) | (t=15 & InITBlock() & !LastInITBlock()) then UNPREDICTABLE; POP {reg} + ; ldrb 111110000001nnnntttt1puwiiiiiiii if BadReg(t) | (wback & n=t) then UNPREDICTABLE; PLD if t=15 (6T2) + ; ldrh 111110000011nnnntttt1puwiiiiiiii if BadReg(t) | (wback & n=t) then UNPREDICTABLE; PLDW if t=15 (MP) + ; ldrsb 111110010001nnnntttt1puwiiiiiiii if BadReg(t) | (wback & n=t) then UNPREDICTABLE; PLI if t=15 (v7) + ; ldrsh 111110010011nnnntttt1puwiiiiiiii if BadReg(t) | (wback & n=t) then UNPREDICTABLE; + ; + ;*100^ ldr 111110000101nnnntttt000000iimmmm if BadReg(m) then UNPREDICTABLE; if t=15 & InITBlock() & !LastInITBlock() then UNPREDICTABLE + ;*110 ldrb 111110000001nnnntttt000000iimmmm if BadReg(t) | n=15 | BadReg(m) then UNPREDICTABLE; PLD if t=15 (6T2) + ;*101^ ldrh 111110000011nnnntttt000000iimmmm if BadReg(t) | n=15 | BadReg(m) then UNPREDICTABLE; PLDW if t=15 (MP) + ;*011 ldrsb 111110010001nnnntttt000000iimmmm if BadReg(t) | n=15 | BadReg(m) then UNPREDICTABLE; PLI if t=15 (v7) + ;*111^ ldrsh 111110010011nnnntttt000000iimmmm if BadReg(t) | n=15 | BadReg(m) then UNPREDICTABLE; + ; + ;*01100 str 111110001100nnnnttttiiiiiiiiiiii if n=15 then UNDEFINED; if t=15 then UNPREDICTABLE; + ;*01110 strb 111110001000nnnnttttiiiiiiiiiiii if n=15 then UNDEFINED; if BadReg(t) then UNPREDICTABLE; + ;*10000 strh 111110001010nnnnttttiiiiiiiiiiii if n=15 then UNDEFINED; if BadReg(t) then UNPREDICTABLE; + ; + ; strt 111110000100nnnntttt1110iiiiiiii if n=15 then UNDEFINED; if BadReg(t) then UNPREDICTABLE; + ; strbt 111110000000nnnntttt1110iiiiiiii if n=15 then UNDEFINED; if BadReg(t) then UNPREDICTABLE; + ; strht 111110000010nnnntttt1110iiiiiiii if n=15 then UNDEFINED; if BadReg(t) then UNPREDICTABLE; + ; + ; str 111110000100nnnntttt1puwiiiiiiii if n=15 then UNDEFINED; if t=15 | (wback & n=t) then UNPREDICTABLE; PUSH {reg} + ; strb 111110000000nnnntttt1puwiiiiiiii if n=15 then UNDEFINED; if BadReg(t) | (wback & n=t) then UNPREDICTABLE; + ; strh 111110000010nnnntttt1puwiiiiiiii if n=15 then UNDEFINED; if BadReg(t) | (wback & n=t) then UNPREDICTABLE; + ; + ;*000^ str 111110000100nnnntttt000000iimmmm if n=15 then UNDEFINED; if t=15 | BadReg(m) then UNPREDICTABLE; + ;*010 strb 111110000000nnnntttt000000iimmmm if n=15 then UNDEFINED; if BadReg(t) | BadReg(m) then UNPREDICTABLE; + ;*001^ strh 111110000010nnnntttt000000iimmmm if n=15 then UNDEFINED; if BadReg(t) | BadReg(m) then UNPREDICTABLE; + ; + .do: + mov ebp,[thumb32_instruction] + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz .check_bad_rn + test ebp,1 shl 20 ;0=STRx, 1=LDRx + jnz .check_rd + .check_bad_rn: + cmp [operand_register1],0xf + jz ERROR_r15_not_valid.second + cmp [value_undefined],0 + jnz .check_rd + cmp al,6 + jz ERROR_r15_not_valid.second + .check_rd: + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz .check_bad_rd + test ebp,1 shl 22 ;word? + jz .check_bad_rd + test ebp,1 shl 20 ;0=STRx, 1=LDRx + jz .check_rd_for_pc + jmp .check_rm ;word loads to PC are okay + .check_bad_rd: + cmp [operand_register0],0xd + jz ERROR_dest_cannot_be_sp_pc + .check_rd_for_pc: + cmp [operand_register0],0xf + jz ERROR_dest_cannot_be_sp_pc + .check_rm: + test [operand_register2],0x80 ;-rm? + jnz ERROR_instruction_not_16bit + cmp [operand_register2],0xd + jz ERROR_offset_register_cannot_be_sp_pc + cmp [operand_register2],0xf + jz ERROR_offset_register_cannot_be_sp_pc + cmp [operand_register0],0xf + jnz .IT_block_okay + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + .IT_block_okay: + mov ecx,[operand_registers] + cmp al,0 + jz .rd_q_rn_p + cmp al,1 + jz .rd_q_rn_p_imm + cmp al,2 + jz .rd_q_rn_imm_p + cmp al,3 + jz .rd_q_rn_imm_p! + cmp al,4 + jz .rd_q_rn_rm_p + cmp al,5 + jz .rd_q_rn_rm_shift_imm_p + cmp al,6 + jz .rd_q_imm_p + cmp al,7 + jz .rd_q_exp_p + cmp al,8 + jz .rd_q_exp_p! + ud2 + .rd_q_rn_p_imm: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .rd_q_rn_p_imm.32 + cmp [operand_size],4 + jnz .rd_q_rn_p_imm.32 + ;special case for ldr lreg|pc,[sp],4 to use pop {lreg} + cmp [immediate_value],4 + jnz .rd_q_rn_p_imm.32 + cmp ch,13 + jnz .rd_q_rn_p_imm.not_sp + test ebp,1 shl 20 ;0=STRx, 1=LDRx + jz .rd_q_rn_p_imm.32 + cmp cl,15 + mov dx,0xbd00 + jz .rd_q_rn_p_imm.pc + cmp cl,7 + ja .rd_q_rn_p_imm.32 + mov dx,0xbc01 + shl dl,cl + .rd_q_rn_p_imm.pc: + mov [thumb16_instruction],dx + mov [thumb16_error],0 + jmp .rd_q_rn_p_imm.32 + .rd_q_rn_p_imm.not_sp: + ;special case for ldr/str lreg1,[lreg2],4 to use ldmia/stmia lreg2,{lreg1} + test cx,0x0808 + jnz .rd_q_rn_p_imm.32 + test ebp,1 shl 20 ;0=STRx, 1=LDRx + jz .rd_q_rn_p_imm.ldr_okay + mov [thumb16_error],ERROR_base_and_dest_must_differ_with_writeback + cmp cl,ch + jz .rd_q_rn_p_imm.32 + .rd_q_rn_p_imm.ldr_okay: + mov edx,ebp + shr edx,20-11 + and dx,0x0800 ;get L bit + or dx,0xc001 + shl dl,cl + or dh,ch + mov [thumb16_instruction],dx + mov [thumb16_error],0 + .rd_q_rn_p_imm.32: + mov [thumb32_error],ERROR_base_and_dest_must_differ_with_writeback + cmp cl,ch + jz THUMB_post_process + cmp ch,0xf + jz ERROR_r15_not_valid.post + cmp [immediate_value],0 + jz .rd_q_rn_imm_p + mov [thumb32_error],ERROR_instruction_not_16bit + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz THUMB_post_process + or ebp,1 shl 8 + jmp .encode_imm8 + .rd_q_exp_p!: + .rd_q_rn_imm_p!: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .rd_q_rn_imm_p!.32 + cmp [operand_size],4 + jnz .rd_q_rn_imm_p!.32 + ;special case for str lreg|pc,[sp,-4]! to use push {lreg} + test ebp,1 shl 20 ;0=STRx, 1=LDRx + jnz .rd_q_rn_imm_p!.32 + cmp ch,13 + jnz .rd_q_rn_imm_p!.32 + cmp [immediate_value],-4 + jnz .rd_q_rn_imm_p!.32 + cmp cl,14 + mov dx,0xb500 + jz .rd_q_rn_imm_p!.lr + cmp cl,7 + ja .rd_q_rn_imm_p!.32 + mov dx,0xb401 + shl dl,cl + .rd_q_rn_imm_p!.lr: + mov [thumb16_instruction],dx + mov [thumb16_error],0 + .rd_q_rn_imm_p!.32: + cmp cl,ch + jz ERROR_base_and_dest_must_differ_with_writeback + cmp ch,0xf + jz ERROR_r15_not_valid.post + mov [thumb32_error],ERROR_instruction_not_16bit + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz THUMB_post_process + or ebp,1 shl 10 + 1 shl 8 + jmp .encode_imm8 + .rd_q_imm_p: + mov [operand_register1],0xf + push ecx + call THUMB_query_condition_pc + mov eax,ecx + pop ecx + mov ch,0xf + cmp [value_undefined],0 + jnz .rd_q_exp_p + mov edx,[addressing_space] + sub eax,[edx+0x00] + and eax,not 3 ;round down + neg eax + add eax,[immediate_value] + sub eax,4 + test eax,3 + jz .place_aligned_offset + cmp dword[adjustment],0 + jz .place_aligned_offset + mov [next_pass_needed],-1 + and eax,not 3 ;assume the offset will be aligned + .place_aligned_offset: + mov [immediate_value],eax + .rd_q_exp_p: + .rd_q_rn_imm_p: + .rd_q_rn_p: + mov [thumb16_error],ERROR_immediate_cannot_be_encoded + test [immediate_value],-1 + jns .positive_offset + test ebp,1 shl 20 ;LDRx=1? + jz .rd_q_rn_p.thumb + test ebp,1 shl 22 ;LDR=1? + jz .rd_q_rn_p.thumb + test [code_type],CPU_ACTIVITY_THUMBEE + jz .rd_q_rn_p.thumb + mov [thumb16_error],ERROR_requires_cpu_capability_arm_t2ee + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz .rd_q_rn_p.thumb + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ecx,0x0808 ;any high registers? + jnz .rd_q_rn_p.thumb + mov [thumb16_error],ERROR_immediate_offset_out_of_range.m28_0 + mov edx,[immediate_value] + neg edx + test edx,not (7 shl 2) + jnz .rd_q_rn_p.thumb + movzx eax,ch + shl eax,3 + or al,cl + shl edx,6-2 + or eax,edx + or ax,0xc800 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + .rd_q_rn_p.thumb: + cmp ch,0xf + jz .encode_imm12 + or ebp,1 shl 10 + jmp .encode_imm8 + .positive_offset: + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz .encode_imm8 + or ebp,1 shl 23 + mov [thumb16_error],ERROR_instruction_not_16bit + test ebp,1 shl 24 ;if it is a signed load then no 16bit form is available + jnz .encode_imm12 + test [code_type],CPU_ACTIVITY_THUMBEE + jz .positive_offset.v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz .positive_offset.v4t + cmp ch,9 + jz .positive_offset.r9 + cmp ch,10 + jnz .positive_offset.v4t + test ebp,1 shl 20 ;LDRx=1? + jz .encode_imm12 + test ebp,1 shl 22 ;LDR=1? + jz .encode_imm12 + ;ldr rt,[r10,imm] + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test cl,0x08 ;high register? + jnz .encode_imm12 + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x7c + mov edx,[immediate_value] + test edx,not (0x1f shl 2) + jnz .encode_imm12 + shl edx,3-2 + movzx ecx,cl + lea edx,[edx+ecx+0xcb00] + mov [thumb16_instruction],dx + mov [thumb16_error],0 + jmp .encode_imm12 + .positive_offset.r9: + test ebp,1 shl 22 ;LDR or STR (=1)? + jz .encode_imm12 + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test cl,0x08 ;high register? + jnz .encode_imm12 + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xfc + mov edx,[immediate_value] + test edx,not (0x3f shl 2) + jnz .encode_imm12 + shl edx,3-2 + movzx ecx,cl + lea edx,[edx+ecx+0xcc00] + bt ebp,20 + setnc cl + movzx ecx,cl + shl ecx,9 + or edx,ecx + mov [thumb16_instruction],dx + mov [thumb16_error],0 + jmp .encode_imm12 + .positive_offset.v4t: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .encode_imm12 + mov dx,0x9000 + cmp ch,0xd ;SP? + jz .16bit_imm8 + mov dx,0x4000 + cmp ch,0xf ;PC? + jz .16bit_imm8 + mov [thumb16_error],ERROR_register_out_of_range + test ecx,0x0808 ;any high registers? + jnz .encode_imm12 + mov [thumb16_error],ERROR_immediate_cannot_be_encoded + mov ecx,ebp + shr ecx,20 + and ecx,6 + setz dl + add cl,dl ;ecx=1, 2 or 4 for B, H, W + imul edx,ecx,31 + not edx + test [immediate_value],edx + jnz .encode_imm12 + mov edx,ebp + shr edx,20 + and edx,111b + movzx edx,byte[edx+THUMB2_rd_address_imm_translate_table] + shl edx,11 + movzx eax,[operand_register0] + or edx,eax + movzx eax,[operand_register1] + shl eax,3 + or edx,eax + mov eax,[immediate_value] + shl eax,6 + shr ecx,1 + shr eax,cl + or edx,eax + mov [thumb16_instruction],dx + mov [thumb16_error],0 + jmp .encode_imm12 + .16bit_imm8: + mov [thumb16_error],ERROR_instruction_not_16bit + cmp [operand_size],4 ;LDR or STR? + jnz .encode_imm12 + mov [thumb16_error],ERROR_register_out_of_range + test ecx,0x08 ;a high register? + jnz .encode_imm12 + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x3fc + test [immediate_value],not (0xff shl 2) + jnz .encode_imm12 + movzx eax,[operand_register0] + shl eax,8 + or edx,eax + mov eax,[immediate_value] + shr eax,2 + mov dl,al + mov eax,ebp + shr eax,20-11 + and eax,1 shl 11 + or edx,eax + mov [thumb16_instruction],dx + mov [thumb16_error],0 + jmp .encode_imm12 + .rd_q_rn_rm_p: + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz .rd_q_rn_rm_shift_imm_p + mov [thumb16_error],ERROR_register_out_of_range.r0_r7 + test ecx,0x080808 ;any high registers? + jnz .rd_q_rn_rm_shift_imm_p + test [code_type],CPU_ACTIVITY_THUMBEE + jz .rd_q_rn_rm_p.thumb + ;only byte version encodings are available in T2EE mode + mov [thumb16_error],ERROR_instruction_not_t2ee + test ebp,01110b shl 20 + jnz .rd_q_rn_rm_shift_imm_p + mov [thumb16_error],ERROR_requires_cpu_capability_arm_t2ee + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz .rd_q_rn_rm_shift_imm_p + jmp .rd_q_rn_rm_p.thumbee + .rd_q_rn_rm_p.thumb: + mov [thumb16_error],ERROR_requires_cpu_capability_arm_v4t + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V4T + jz .rd_q_rn_rm_shift_imm_p + .rd_q_rn_rm_p.thumbee: + ;encode a 16bit form + mov eax,ebp + shr eax,20 + and eax,11111b + mov edx,THUMB2_rd_address_rm_translate_table + .find_16bit_rm_code: + cmp al,[edx] + jz .found_16bit_rm_code + inc edx + cmp edx,THUMB2_rd_address_rm_translate_table+8 + jb .find_16bit_rm_code + ud2 + .found_16bit_rm_code: + sub edx,THUMB2_rd_address_rm_translate_table + shl edx,9 + or edx,0x5000 + movzx eax,[operand_register0] + or edx,eax + movzx eax,[operand_register1] + shl eax,3 + or edx,eax + movzx eax,[operand_register2] + shl eax,6 + or edx,eax + mov [thumb16_instruction],dx + mov [thumb16_error],0 + .rd_q_rn_rm_shift_imm_p: + mov [thumb32_error],ERROR_r15_not_valid.base + cmp ch,0xf + jz THUMB_post_process + mov [thumb32_error],ERROR_shift_type_must_be_LSL + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz THUMB_post_process + ;T2EE + cmp [thumb16_error],0 ;second time around? + jz .rd_q_rn_rm_shift_imm_p.thumb + test [code_type],CPU_ACTIVITY_THUMBEE + jz .rd_q_rn_rm_shift_imm_p.thumb + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz .rd_q_rn_rm_shift_imm_p.thumb + mov [thumb16_error],ERROR_register_out_of_range + test ecx,0x080808 ;any high registers? + jnz .rd_q_rn_rm_shift_imm_p.thumb + ;hword and word version encodings are available in T2EE mode + mov [thumb16_error],ERROR_instruction_not_t2ee + test ebp,01110b shl 20 + jz .rd_q_rn_rm_shift_imm_p.thumb + mov [thumb16_error],ERROR_requires_cpu_capability_arm_t2ee + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz .rd_q_rn_rm_shift_imm_p.thumb + ;check bits 22:21 match the shift count + mov ecx,ERROR_shift_value_out_of_range.1 + mov edx,ERROR_shift_value_out_of_range.2 + test ebp,1 shl 22 + cmovnz ecx,edx + mov [thumb16_error],ecx + mov ecx,ebp + shr ecx,21 + and ecx,3 + cmp ecx,[immediate_value2] + jz .rd_q_rn_rm_p.thumbee + .rd_q_rn_rm_shift_imm_p.thumb: + mov [thumb32_error],ERROR_shift_value_out_of_range.0_3 + cmp [immediate_value2],3 + ja THUMB_post_process + mov [thumb32_error],ERROR_instruction_not_16bit + test ebp,1111b shl 8 ;STRxT/LDRxT? + jnz THUMB_post_process + jmp .encode_regs + .encode_imm12: + mov eax,[immediate_value] + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0xfff + test ebp,1 shl 23 + jnz .imm12_positive_only + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0xfff + or ebp,1 shl 23 + test eax,eax + jns .imm12_positive_only + and ebp,not (1 shl 23) + neg eax + .imm12_positive_only: + cmp eax,0xfff + ja THUMB_post_process + or ebp,eax + jmp .encode_regs + .encode_imm8: + or ebp,1 shl 11 + mov eax,[immediate_value] + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0xff + test ebp,1 shl 9 + jnz .imm8_positive_only + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0xff + or ebp,1 shl 9 + test eax,eax + jns .imm8_positive_only + and ebp,not (1 shl 9) + neg eax + .imm8_positive_only: + cmp eax,0xff + ja THUMB_post_process + or ebp,eax + .encode_regs: + mov ecx,ebp + and ecx,0x17 shl 20 + 0xf shl 12 + ;if bits[24..20]=0x011 and bits[15..12]=1111 then check for MP (PLDW) + cmp ecx,0x03 shl 20 + 0xf shl 12 + jz .check_PLDW + ;if bits[24..20]=1x001 and bits[15..12]=1111 then check for v7 (PLI) + cmp ecx,0x11 shl 20 + 0xf shl 12 + jz .check_PLI + mov [thumb32_error],ERROR_requires_cpu_capability_arm_7m + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + jmp .version_check_okay + .check_PLDW: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_mp + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_MP + jz THUMB_post_process + mov [thumb32_error],ERROR_r15_not_valid.base + cmp [operand_register1],0xf + jz THUMB_post_process + jmp .version_check_okay + .check_PLI: + mov [thumb32_error],ERROR_requires_cpu_capability_arm_v7 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz THUMB_post_process + .version_check_okay: + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + or ebp,eax + mov eax,[immediate_value2] + shl eax,4 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMB2_rd_rd2_address: + ;used by STRD, LDRD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 0=rd,[rn] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=rd,[rn],imm + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=rd,[rn,imm] + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=rd,[rn,imm]! + <TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ; 4=rd,[imm] PC relative + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 5=rd,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 6=rd,[exp]! implicit reg from structure + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 7=rd,rd2,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 8=rd,rd2,[rn],imm + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 9=rd,rd2,[rn,imm] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;10=rd,rd2,[rn,imm]! + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;11=rd,rd2,[imm] PC relative + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=rd,rd2,[exp] implicit reg from structure + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;13=rd,rd2,[exp]! implicit reg from structure + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov ebp,[thumb32_instruction] + sub al,7 + jae .dest_registers_defined + mov ecx,[operand_registers] + mov dl,cl + inc cl + shl ecx,8 + mov cl,dl + mov [operand_registers],ecx + add al,7 + .dest_registers_defined: + mov cl,0x33 + mov dl,0x37 + test ebp,1 shl 20 ;LDRD? + cmovz ecx,edx + call THUMB2_check_bad_regs + jc THUMB_post_process + test ebp,1 shl 20 ;LDRD? + jz .same_regs_okay + mov ecx,[operand_registers] + cmp cl,ch + mov [thumb32_error],ERROR_destination_registers_must_differ + jz THUMB_post_process + .same_regs_okay: + cmp al,0 + jz .rd_q_rn_p + cmp al,1 + jz .rd_q_rn_p_imm + cmp al,2 + jz .rd_q_rn_imm_p + cmp al,3 + jz .rd_q_rn_imm_p! + cmp al,4 + jz .rd_q_imm_p + cmp al,5 + jz .rd_q_exp_p + cmp al,6 + jz .rd_q_exp_p! + ud2 + .rd_q_rn_p_imm: + cmp [operand_register2],0xf + jz ERROR_r15_not_valid.post + or ebp,1 shl 21 ;set W + jmp .check_dest_and_source_differ + .rd_q_imm_p: + mov [operand_register2],0xf + call THUMB_query_condition_pc + mov eax,ecx + mov ch,0xf + cmp [value_undefined],0 + jnz .rd_q_exp_p + mov edx,[addressing_space] + sub eax,[edx+0x00] + and eax,not 3 ;round down + neg eax + add eax,[immediate_value] + sub eax,4 + mov [immediate_value],eax + .rd_q_exp_p: + .rd_q_rn_imm_p: + .rd_q_rn_p: + or ebp,1 shl 24 ;set P + jmp .encode + .rd_q_exp_p!: + .rd_q_rn_imm_p!: + cmp [operand_register2],0xf + jz ERROR_r15_not_valid.post + or ebp,1 shl 24 + 1 shl 21 ;set P & W + .check_dest_and_source_differ: + mov [thumb32_error],ERROR_base_and_dest_must_differ_with_writeback + mov cl,[operand_register2] + cmp cl,[operand_register1] + jz THUMB_post_process + cmp cl,[operand_register0] + jz THUMB_post_process + .encode: + mov eax,[immediate_value] + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0x3fc + or ebp,1 shl 23 + test eax,eax + jns .imm8_positive + and ebp,not (1 shl 23) + neg eax + .imm8_positive: + test eax,not (0xff shl 2) + jnz THUMB_post_process + shr eax,2 + or ebp,eax + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,8 + or ebp,eax + movzx eax,[operand_register2] + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_imm16: + ;used by MOVW, MOVT + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm> ;0=reg,imm + .do: + ;entry from MOV + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_imm16 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + movzx eax,[operand_register0] + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + mov eax,[immediate_value] + cmp eax,0xffff + mov ecx,ERROR_immediate_value_out_of_range.0_0xffff + ja ARM_store_instruction_with_error + mov ecx,eax + and eax,0x0fff + and ecx,0xf000 + shl ecx,16-12 + or ebp,eax + or ebp,ecx + jmp ARM_store_instruction + .THUMB_rd_imm16: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov ebp,[thumb32_instruction] + mov cl,0x11 + call THUMB2_check_bad_regs + jc THUMB_post_process + movzx eax,[operand_register0] + shl eax,8 + or ebp,eax + mov eax,[immediate_value] + cmp eax,0xffff + mov [thumb32_error],ERROR_immediate_value_out_of_range.0_0xffff + ja THUMB_post_process + mov ecx,eax + mov edx,eax + mov ebx,eax + and eax,0x00ff + and ecx,0x0700 + and edx,0x0800 + and ebx,0xf000 + shl ecx,12-8 + shl edx,26-11 + shl ebx,16-12 + or ebp,eax + or ebp,ecx + or ebp,edx + or ebp,ebx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rn_imm_imm_X: + ;used by SBFX, UBFX + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;0=reg,reg,imm,imm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rn_imm_imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2 + jz ERROR_requires_cpu_capability_arm_t2 + movzx eax,[operand_register0] + cmp eax,15 + jz ERROR_r15_not_valid + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + cmp eax,15 + jz ERROR_r15_not_valid + or ebp,eax + mov eax,[immediate_value] + cmp eax,31 + mov ecx,ERROR_lsb_out_of_range.0_31 + ja ARM_store_instruction_with_error + shl eax,7 + or ebp,eax + mov ecx,ERROR_width_out_of_range + mov edx,[immediate_value2] + shr eax,7 + add eax,edx + jc ARM_store_instruction_with_error + cmp eax,32 + ja ARM_store_instruction_with_error + dec edx + shl edx,16 + or ebp,edx + jmp ARM_store_instruction + .THUMB_rd_rn_imm_imm: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov ecx,0x33 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + mov [thumb32_error],ERROR_lsb_out_of_range.0_31 + mov eax,[immediate_value] + cmp eax,31 + ja THUMB_post_process + mov ecx,eax + mov edx,eax + and ecx,3 + and edx,0x1c + shl ecx,6 + shl edx,12-2 + or ebp,ecx + or ebp,edx + mov [thumb32_error],ERROR_width_out_of_range + mov edx,[immediate_value2] + add eax,edx + jc THUMB_post_process + cmp eax,32 + ja THUMB_post_process + dec edx + or ebp,edx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMB_q_rn_rm_p: + ;used by TBB + call decode_template + TEMPLATE \ + <TMPL_bracket_left,TMPL_base_reg,TMPL_base_reg,TMPL_bracket_right> ;0=[rn,rm] + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov ecx,0x32 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMB_q_rn_rm_lsl_1_p: + ;used by TBH + call decode_template + TEMPLATE \ + <TMPL_bracket_left,TMPL_base_reg,TMPL_base_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right> ;0=[rn,rm] + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov ecx,0x32 + call THUMB2_check_bad_regs + jc THUMB_post_process + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz ERROR_shift_type_must_be_LSL + cmp [immediate_value],1 + jnz ERROR_immediate_offset_out_of_range.1 + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +;thumbee + +THUMBEE_enterx: + ;used by ENTERX, LEAVEX + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=EOL + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz ERROR_requires_cpu_capability_arm_t2ee + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + mov [thumb32_error],0 + jmp THUMB_post_process + +THUMBEE_rn_rm: + ;used by CHKA + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg> ;0=rn,rm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz ERROR_requires_cpu_capability_arm_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jz ERROR_instruction_needs_t2ee + mov cl,0x23 + call THUMB2_check_bad_regs + jc THUMB_post_process + movzx eax,[operand_register0] + movzx ecx,[operand_register1] + mov edx,eax + and eax,7 + and edx,8 + shl edx,7-3 + or eax,edx + shl ecx,3 + lea eax,[eax+ecx+0xca00] + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +THUMBEE_imm: + ;used by HB, HBL + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz ERROR_requires_cpu_capability_arm_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jz ERROR_instruction_needs_t2ee + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_0xff + mov eax,[immediate_value] + cmp eax,0xff + ja THUMB_post_process + or eax,ebp + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +THUMBEE_imm5_imm5: + ;used by HBLP + call decode_template + TEMPLATE \ + <TMPL_imm,TMPL_comma,TMPL_imm2> ;0=imm,imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz ERROR_requires_cpu_capability_arm_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jz ERROR_instruction_needs_t2ee + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_31 + mov eax,[immediate_value] + cmp eax,0x1f + ja THUMB_post_process + shl eax,5 + or ebp,eax + mov eax,[immediate_value2] + cmp eax,0x1f + ja THUMB_post_process + or eax,ebp + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +THUMBEE_imm3_imm5: + ;used by HBP + call decode_template + TEMPLATE \ + <TMPL_imm,TMPL_comma,TMPL_imm2> ;0=imm,imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_T2EE + jz ERROR_requires_cpu_capability_arm_t2ee + test [code_type],CPU_ACTIVITY_THUMBEE + jz ERROR_instruction_needs_t2ee + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_7 + mov eax,[immediate_value] + cmp eax,7 + ja THUMB_post_process + shl eax,5 + or ebp,eax + mov [thumb16_error],ERROR_immediate_value_out_of_range.0_31 + mov eax,[immediate_value2] + cmp eax,0x1f + ja THUMB_post_process + or eax,ebp + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +;v7 + +ARM_imm4: + ;used by DBG + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_imm4 + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz ERROR_requires_cpu_capability_arm_v7 + mov eax,[immediate_value] + cmp eax,15 + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_15 + jmp ARM_store_instruction_with_error + .THUMB_imm4: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz ERROR_requires_cpu_capability_arm_7m + mov ebp,[thumb32_instruction] + mov [thumb32_error],ERROR_immediate_value_out_of_range.0_15 + mov eax,[immediate_value] + cmp eax,15 + ja THUMB_post_process + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_barrier: + ;used by DMB, DSB, ISB + call decode_template + TEMPLATE \ + <TMPL_barrier>,\ ;0=barrier + <TMPL_imm>,\ ;1=imm + <TMPL_EOL> ;2=default + cmp al,1 + jz .encode + mov [immediate_value],0xf + cmp al,2 + jz .encode + movzx eax,[operand_register0] + mov [immediate_value],eax + .encode: + test ebp,0x20 ;ISB? + jz .do + cmp [immediate_value],0xf ;only SY is valid + jnz ERROR_parameter_n_not_valid.all + .do: + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_barrier + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V7 + jz ERROR_requires_cpu_capability_arm_v7 + mov eax,[immediate_value] + cmp eax,15 + ja .out_of_range + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_15 + jmp ARM_store_instruction_with_error + .THUMB_barrier: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + jz ERROR_requires_cpu_capability_arm_6m + mov ebp,[thumb32_instruction] + mov [thumb32_error],ERROR_immediate_value_out_of_range.0_15 + mov eax,[immediate_value] + cmp eax,15 + ja THUMB_post_process + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_nops: + ;used by SEV, SEVL, WFE, WFI, YIELD + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_nops + mov ecx,ebp + and cl,0xf + cmp cl,5 ;SEVL? + jnz .check_k + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + jmp ARM_store_instruction + .check_k: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_K + jz ERROR_requires_cpu_capability_arm_k + jmp ARM_store_instruction + .THUMB_nops: + mov ecx,ebp + and cl,0xf + cmp cl,5 ;SEVL? + jnz .THUMB_check_k + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + mov [thumb32_error],0 + mov [thumb16_error],0 + jmp .THUMB_version_okay + .THUMB_check_k: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + setz cl + movzx ecx,cl + neg ecx + and ecx,ERROR_requires_cpu_capability_arm_7m + mov [thumb32_error],ecx + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_6M + setz cl + movzx ecx,cl + neg ecx + and ecx,ERROR_requires_cpu_capability_arm_6m + mov [thumb16_error],ecx + .THUMB_version_okay: + mov eax,[thumb32_instruction] + and eax,0xf + shl eax,4 + or eax,0xbf00 + mov [thumb16_instruction],ax + jmp THUMB_post_process + +;DIV + +ARM_rd_rn_rm_DIV: + ;used by SDIV, UDIV + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg>,\ ;0=reg,reg alternate for reg,reg,reg + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;1=reg,reg,reg + cmp al,0 + jnz .encode + mov ax,word[operand_register0] + mov word[operand_register1],ax + .encode: + test [code_type],CPU_ACTIVITY_ARM + jnz .v7ve + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_DIV + jz ERROR_requires_cpu_capability_arm_div + mov cl,0x77 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + .v7ve: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_VE + jz ERROR_requires_cpu_capability_arm_ve + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.all + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.all + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,0xf + jz ERROR_r15_not_valid.all + shl eax,8 + or ebp,eax + jmp ARM_store_instruction + +;versionless + +ARM_und: + ;used by UND + call decode_template + TEMPLATE \ + <TMPL_imm>,\ ;0=imm + <TMPL_EOL> ;1=empty + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_und + mov eax,[immediate_value] + cmp eax,0xffff + ja ERROR_immediate_offset_out_of_range.0_0xffff + mov ecx,eax + and eax,0x000f + and ecx,0xfff0 + shl ecx,4 + or ebp,eax + or ebp,ecx + jmp ARM_store_instruction + .THUMB_und: + mov eax,[immediate_value] + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0xff + cmp eax,0xff + ja .T2 + mov ah,0xde + mov [thumb16_instruction],ax + mov [thumb16_error],0 + mov eax,[immediate_value] + .T2: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_7M + jz THUMB_post_process + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0xfff + cmp eax,0xfff + ja THUMB_post_process + mov ecx,eax + mov edx,eax + and eax,0x00f + and ecx,0x0f0 + and edx,0xf00 + shl ecx,8-4 + shl edx,16-8 + or eax,ecx + or eax,edx + or [thumb32_instruction],eax + mov [thumb32_error],0 + jmp THUMB_post_process + +;FPA + +FPA_fn_fm: + ;used by CMF, CMFE, CNF, CNFE + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_fpa_freg>,\ ;0=fn,fm + <TMPL_fpa_freg,TMPL_imm_float> ;1=fn,const + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx ecx,[operand_register0] ;fn + shl ecx,16 + or ebp,ecx + cmp al,1 + jz FPA_encode_constant + movzx ecx,[operand_register1] ;fm + or ebp,ecx + jmp ARM_post_process_copro + +FPA_rd: + ;used by RFC, RFS, WFC, WFS + call decode_template + TEMPLATE \ + <TMPL_base_reg> ;0=rd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx eax,[operand_register0] ;rd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +FPA_fd_fn_fm: + ;used by ADFD, ADFDM, ADFDP, ADFDZ, ADFE, ADFEM, ADFEP, ADFEZ, ADFS, ADFSM, ADFSP, ADFSZ, + ; DVFD, DVFDM, DVFDP, DVFDZ, DVFE, DVFEM, DVFEP, DVFEZ, DVFS, DVFSM, DVFSP, DVFSZ, + ; FDVD, FDVDM, FDVDP, FDVDZ, FDVE, FDVEM, FDVEP, FDVEZ, FDVS, FDVSM, FDVSP, FDVSZ, + ; FMLD, FMLDM, FMLDP, FMLDZ, FMLE, FMLEM, FMLEP, FMLEZ, FMLS, FMLSM, FMLSP, FMLSZ, + ; FRDD, FRDDM, FRDDP, FRDDZ, FRDE, FRDEM, FRDEP, FRDEZ, FRDS, FRDSM, FRDSP, FRDSZ, + ; MUFD, MUFDM, MUFDP, MUFDZ, MUFE, MUFEM, MUFEP, MUFEZ, MUFS, MUFSM, MUFSP, MUFSZ, + ; POLD, POLDM, POLDP, POLDZ, POLE, POLEM, POLEP, POLEZ, POLS, POLSM, POLSP, POLSZ, + ; POWD, POWDM, POWDP, POWDZ, POWE, POWEM, POWEP, POWEZ, POWS, POWSM, POWSP, POWSZ, + ; RDFD, RDFDM, RDFDP, RDFDZ, RDFE, RDFEM, RDFEP, RDFEZ, RDFS, RDFSM, RDFSP, RDFSZ, + ; RMFD, RMFDM, RMFDP, RMFDZ, RMFE, RMFEM, RMFEP, RMFEZ, RMFS, RMFSM, RMFSP, RMFSZ, + ; RPWD, RPWDM, RPWDP, RPWDZ, RPWE, RPWEM, RPWEP, RPWEZ, RPWS, RPWSM, RPWSP, RPWSZ, + ; RSFD, RSFDM, RSFDP, RSFDZ, RSFE, RSFEM, RSFEP, RSFEZ, RSFS, RSFSM, RSFSP, RSFSZ, + ; SUFD, SUFDM, SUFDP, SUFDZ, SUFE, SUFEM, SUFEP, SUFEZ, SUFS, SUFSM, SUFSP, SUFSZ + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_fpa_freg,TMPL_fpa_freg>,\ ;0=fd,fn,fm + <TMPL_fpa_freg,TMPL_fpa_freg,TMPL_imm_float> ;1=fd,fn,const + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx ecx,[operand_register0] ;fd + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;fn + shl ecx,16 + or ebp,ecx + cmp al,1 + jz FPA_encode_constant + movzx ecx,[operand_register2] ;fm + or ebp,ecx + jmp ARM_post_process_copro + +FPA_fn_rd: + ;used by FLTD, FLTDM, FLTDP, FLTDZ, FLTE, FLTEM, FLTEP, FLTEZ, FLTS, FLTSM, FLTSP, FLTSZ + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_base_reg> ;0=fn,rd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx eax,[operand_register0] ;fn + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +FPA_fd_imm_address5: + ;used by LFM, SFM + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=fd,imm2,[rn] + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=fd,imm2,[rn],imm + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ;2=fd,imm2,[rn],{imm} + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;3=fd,imm2,[rn,imm] + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\;4=fd,imm2,[rn,imm]! + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;5=fd,imm2,[imm] PC relative + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;6=fd,imm2,[exp] implicit reg from structure + <TMPL_fpa_freg,TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;7=fd,imm2,[exp]! implicit reg from structure + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V2 + jz ERROR_requires_copro_capability_fpa_v2 + mov ecx,[immediate_value2] + dec ecx + cmp ecx,4 + ja ERROR_count_value_out_of_range.1_4 + inc ecx + and ecx,3 + mov edx,ecx + and ecx,1 + and edx,2 + shl ecx,15 + shl edx,22-1 + or ebp,ecx + or ebp,edx + mov ecx,[operand_registers] + shl ecx,8 + mov [operand_registers],ecx + jmp ARM_copro_crd_address5.version_check_okay + +FPA_fd_imm_rn: + ;used by LFMEA, LFMFD, SFMEA, SFMFD + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_imm,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=fd,imm,[rn] + <TMPL_fpa_freg,TMPL_imm,TMPL_comma,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_modifier_exclaim> ;1=fd,imm,[rn]! + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V2 + jz ERROR_requires_copro_capability_fpa_v2 + movzx eax,al + shl eax,21 + or ebp,eax ;set W bit + movzx eax,[operand_register0] ;fd + shl eax,12 + or ebp,eax + mov ecx,[immediate_value] + dec ecx + cmp ecx,4 + ja ERROR_count_value_out_of_range.1_4 + inc ecx + and ecx,3 + mov edx,ecx + and ecx,1 + and edx,2 + shl ecx,15 + shl edx,22-1 + or ebp,ecx + or ebp,edx + movzx eax,[operand_register1] ;rn + test ebp,1 shl 21 ;W? + jz .rn_okay + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.third + .rn_okay: + shl eax,16 + or ebp,eax + mov ecx,ebp + and ecx,1 shl 24 + 1 shl 23 + 1 shl 21 ;P, U, W + cmp ecx,0 shl 24 + 1 shl 23 + 0 shl 21 ;0, 1, 0 + jz ARM_post_process_copro + mov ecx,[immediate_value] + imul ecx,3 + or ebp,ecx ;set the offset field + jmp ARM_post_process_copro + +FPA_fd_address5: + ;used by LDFD, LDFE, LDFP, LDFS, STFD, STFE, STFP, STFS + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=fd,[rn] + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=fd,[rn],imm + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ;2=fd,[rn],{imm} + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;3=fd,[rn,imm] + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;4=fd,[rn,imm]! + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;5=fd,[imm] PC relative + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;6=fd,[exp] implicit reg from structure + <TMPL_fpa_freg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;7=fd,[exp]! implicit reg from structure + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + mov ecx,[operand_registers] + shl ecx,8 + mov [operand_registers],ecx + jmp ARM_copro_crd_address5.version_check_okay + +FPA_fd_fm: + ;used by ABSD, ABSDM, ABSDP, ABSDZ, ABSE, ABSEM, ABSEP, ABSEZ, ABSS, ABSSM, ABSSP, ABSSZ, + ; ACSD, ACSDM, ACSDP, ACSDZ, ACSE, ACSEM, ACSEP, ACSEZ, ACSS, ACSSM, ACSSP, ACSSZ, + ; ASND, ASNDM, ASNDP, ASNDZ, ASNE, ASNEM, ASNEP, ASNEZ, ASNS, ASNSM, ASNSP, ASNSZ, + ; ATND, ATNDM, ATNDP, ATNDZ, ATNE, ATNEM, ATNEP, ATNEZ, ATNS, ATNSM, ATNSP, ATNSZ, + ; COSD, COSDM, COSDP, COSDZ, COSE, COSEM, COSEP, COSEZ, COSS, COSSM, COSSP, COSSZ, + ; EXPD, EXPDM, EXPDP, EXPDZ, EXPE, EXPEM, EXPEP, EXPEZ, EXPS, EXPSM, EXPSP, EXPSZ, + ; LGND, LGNDM, LGNDP, LGNDZ, LGNE, LGNEM, LGNEP, LGNEZ, LGNS, LGNSM, LGNSP, LGNSZ, + ; LOGD, LOGDM, LOGDP, LOGDZ, LOGE, LOGEM, LOGEP, LOGEZ, LOGS, LOGSM, LOGSP, LOGSZ, + ; MNFD, MNFDM, MNFDP, MNFDZ, MNFE, MNFEM, MNFEP, MNFEZ, MNFS, MNFSM, MNFSP, MNFSZ, + ; MVFD, MVFDM, MVFDP, MVFDZ, MVFE, MVFEM, MVFEP, MVFEZ, MVFS, MVFSM, MVFSP, MVFSZ, + ; NRMD, NRMDM, NRMDP, NRMDZ, NRME, NRMEM, NRMEP, NRMEZ, NRMS, NRMSM, NRMSP, NRMSZ, + ; RNDD, RNDDM, RNDDP, RNDDZ, RNDE, RNDEM, RNDEP, RNDEZ, RNDS, RNDSM, RNDSP, RNDSZ, + ; SIND, SINDM, SINDP, SINDZ, SINE, SINEM, SINEP, SINEZ, SINS, SINSM, SINSP, SINSZ, + ; SQTD, SQTDM, SQTDP, SQTDZ, SQTE, SQTEM, SQTEP, SQTEZ, SQTS, SQTSM, SQTSP, SQTSZ, + ; TAND, TANDM, TANDP, TANDZ, TANE, TANEM, TANEP, TANEZ, TANS, TANSM, TANSP, TANSZ, + ; URDD, URDDM, URDDP, URDDZ, URDE, URDEM, URDEP, URDEZ, URDS, URDSM, URDSP, URDSZ + call decode_template + TEMPLATE \ + <TMPL_fpa_freg,TMPL_fpa_freg>,\ ;0=fd,fm + <TMPL_fpa_freg,TMPL_imm_float> ;1=fd,const + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx ecx,[operand_register0] ;fd + shl ecx,12 + or ebp,ecx + cmp al,1 + jz FPA_encode_constant + movzx ecx,[operand_register1] ;fm + or ebp,ecx + jmp ARM_post_process_copro + +FPA_rd_fm: + ;used by FIX, FIXM, FIXP, FIXZ + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_fpa_freg> ;0=rd,fm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_FPA_V1 + jz ERROR_requires_copro_capability_fpa_v1 + movzx ecx,[operand_register0] ;rd + shl ecx,12 + or ebp,ecx + movzx ecx,[operand_register1] ;fm + or ebp,ecx + jmp ARM_post_process_copro + + align 4 +FPA_constants: + dd 0.0 + dd 1.0 + dd 2.0 + dd 3.0 + dd 4.0 + dd 5.0 + dd 0.5 + dd 10.0 + +FPA_encode_constant: + mov eax,[immediate_value] + mov ecx,FPA_constants + mov edx,8 + .find_constant: + dec edx + js .not_found + cmp eax,[ecx+edx*4] + jnz .find_constant + lea eax,[edx+8] + or ebp,eax + jmp ARM_post_process_copro + .not_found: + mov ecx,ERROR_constant_cannot_be_encoded + jmp ARM_post_process_copro_with_error + +;MAVERICK + +MAVERICK_crd_crn: + ;used by CFABS32, CFABS64, CFABSS, CFABSD, CFCPYS, CFCPYD, CFCVT32S, CFCVT32D, CFCVT64S, CFCVT64D, CFCVTD32, + ; CFCVTDS, CFCVTS32, CFCVTSD, CFNEG32, CFNEG64, CFNEGS, CFNEGD, CFTRUNCS32, CFTRUNCD32 + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_cpro_reg> ;0=crd,crn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crd_crn_crm: + ;used by CFADD32, CFADD64, CFADDD, CFADDS, CFMAC32, CFMSC32, CFMUL32, CFMUL64, CFMULS, CFMULD, + ; CFSUB32, CFSUB64, CFSUBD, CFSUBS + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_cpro_reg,TMPL_cpro_reg> ;0=crd,crn,crm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;crm + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_rd_crn_crm: + ;used by CFCMP32, CFCMP64, CFCMPS, CFCMPD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_cpro_reg,TMPL_cpro_reg> ;0=rd,crn,crm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;rd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;crm + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crd_address5: + ;used by CFLDR32, CFLDR64, CFLDRS, CFLDRD, CFSTR32, CFSTR64, CFSTRS, CFSTRD + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=crd,[rn] + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=crd,[rn],imm + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ;2=crd,[rn],{imm} + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;3=crd,[rn,imm] + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;4=crd,[rn,imm]! + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;5=crd,[imm] PC relative + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;6=crd,[exp] implicit reg from structure + <TMPL_cpro_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;7=crd,[exp]! implicit reg from structure + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + mov ecx,[operand_registers] + shl ecx,8 + mov [operand_registers],ecx + jmp ARM_copro_crd_address5.version_check_okay + +MAVERICK_aa_crd_crn_crm: + ;used by CFMADD32, CFMSUB32 + call decode_template + TEMPLATE \ + <TMPL_mvrk_areg,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_cpro_reg> ;0=aa,crd,crn,crm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;aa + shl eax,5 + or ebp,eax + movzx eax,[operand_register1] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;crm + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_aa_ad_crn_crm: + ;used by CFMADDA32, CFMSUBA32 + call decode_template + TEMPLATE \ + <TMPL_mvrk_areg,TMPL_mvrk_areg,TMPL_cpro_reg,TMPL_cpro_reg> ;0=aa,ad,crn,crm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;aa + shl eax,5 + or ebp,eax + movzx eax,[operand_register1] ;ad + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;crm + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crd_an: + ;used by CFMV32A, CFMV32AH, CFMV32AL, CFMV32AM, CFMV64A + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_mvrk_areg> ;0=crd,an + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;an + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crd_psc: + ;used by CFMV32SC + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_mvrk_psc> ;0=crd,psc + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_psc_crd: + ;used by CFMVSC32 + call decode_template + TEMPLATE \ + <TMPL_mvrk_psc,TMPL_cpro_reg> ;0=psc,crd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crn_rd: + ;used by CFMV64HR, CFMV64LR, CFMVDHR, CFMVDLR, CFMVSR + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_base_reg> ;0=crn,rd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_ad_crn: + ;used by CFMVA32, CFMVA64, CFMVAH32, CFMVAL32, CFMVAM32 + call decode_template + TEMPLATE \ + <TMPL_mvrk_areg,TMPL_cpro_reg> ;0=ad,crn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;ad + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_rd_crn: + ;used by CFMVR64H, CFMVR64L, CFMVRDH, CFMVRDL, CFMVRS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_cpro_reg> ;0=rd,crn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;rd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crm_crn_rd: + ;used by CFRSHL32, CFRSHL64 + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_cpro_reg,TMPL_base_reg> ;0=crm,crn,rd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crm + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rd + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +MAVERICK_crd_crn_imm: + ;used by CFSH32, CFSH64 + call decode_template + TEMPLATE \ + <TMPL_cpro_reg,TMPL_cpro_reg,TMPL_imm> ;0=crm,crn,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_MAVERICK + jz ERROR_requires_copro_capability_maverick + movzx eax,[operand_register0] ;crd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;crn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] ;imm + cmp eax,-64 + jl .out_of_range + cmp eax,63 + jg .out_of_range + mov ecx,eax + and eax,0x0f + and ecx,0x70 + shl ecx,1 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.m64_63 + jmp ARM_post_process_copro_with_error + +;vfp1 + +VFP_sd_sn_sm: + ;used by FMULS, FNMULS, FADDS, FSUBS, FDIVS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;0=sdn,sm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;1=sd,sn,sm + .v1xd_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + .do: + cmp al,0 + jnz .registers_shifted + mov eax,[operand_registers] + mov cl,al + shl eax,8 + mov al,cl + mov [operand_registers],eax + .registers_shifted: + movzx eax,[operand_register0] ;fd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;fn + xor ecx,ecx + shr eax,1 + setc cl + shl eax,16 + shl ecx,7 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register2] ;fm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + +VFP_dd_dn_dm: + ;used by FMULD, FNMULD, FADDD, FSUBD, FDIVD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;1=dd,dn,dm + .begin: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sn_sm.do + mov edx,[operand_registers] ;fd,fn,fm + test edx,0x010101 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sn_sm.do + +VFP_sd_sm: + ;used by FABSS, FCPYS, FNEGS, FSITOS, FSQRTS, FTOSIS, FTOSIZS, FTOUIS, FTOUIZS, FUITOS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sm + .v1xd_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + .do: + movzx eax,[operand_register0] ;fd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;fm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + +VFP_dd_dm: + ;used by FABSD, FCPYD, FNEGD, FSQRTD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=dd,dm + .encode: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sm.do + mov edx,[operand_registers] ;fd,fm + test edx,0x0101 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sm.do + +VFP_sd_sm_zero: + ;used by FCMPS, FCMPES + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;0=sd,sm + <TMPL_vfps_reg,TMPL_imm> ;1=sd,0.0 + test al,al + jz VFP_sd_sm.v1xd_test + cmp [immediate_value],0 + mov ecx,ERROR_immediate_offset_out_of_range.0 + jnz ARM_post_process_copro_with_error + or ebp,1 shl 16 ;set for FCMP(E)Z + jmp VFP_sd_sm.v1xd_test + +VFP_dd_dm_zero: + ;used by FCMPD, FCMPED + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,0.0 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + test al,al + jnz .zero + .check_d32: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sm.do + mov edx,[operand_registers] ;fd,fm + test edx,0x0101 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sm.do + .zero: + cmp [immediate_value],0 + mov ecx,ERROR_immediate_offset_out_of_range.0 + jnz ARM_post_process_copro_with_error + or ebp,1 shl 16 ;set for FCMP(E)Z + jmp .check_d32 + +VFP_sd: + ;used by FCMPZS, FCMPEZS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg> ;0=sd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1 + mov [operand_register1],0 ;fm + jmp VFP_sd_sm.do + +VFP_dd: + ;used by FCMPZD, FCMPEZD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg> ;0=dd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + mov [operand_register1],0 ;fm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sm.do + mov edx,[operand_registers] ;fd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sm.do + +VFP_dd_sm: + ;used by FCVTDS, FSITOD, FUITOD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfps_reg> ;0=dd,sm + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sm.do + mov edx,[operand_registers] ;fd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sm.do + +VFP_sd_dm: + ;used by FCVTSD, FTOSID, FTOSIZD, FTOUID, FTOUIZD + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfpd_reg> ;0=sd,dm + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1 + jz ERROR_requires_copro_capability_vfp_v1 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_sm.do + mov edx,[operand_registers] ;fm + test edx,0x0100 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_sm.do + +VFP_sd_sm_HP: + ;used by VCVTB, VCVTT + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_HP + jz ERROR_requires_copro_capability_vfp_hp + jmp VFP_sd_sm.do + +VFP_sd_rn_offset: + ;used by FLDS, FSTS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=sd,[rn] + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=sd,[rn,imm] + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;2=sd,[imm] PC relative + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;3=sd,[exp] implicit reg from structure + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + cmp al,0 + jz .fd_q_rn_p + cmp al,1 + jz .fd_q_rn_imm_p + cmp al,2 + jz .fd_q_imm_p + cmp al,3 + jz .fd_q_exp_p + ud2 + .fd_q_imm_p: + mov [operand_register1],0xf + call THUMB_query_condition_pc + mov eax,[addressing_space] + sub ecx,[eax+0x00] + and ecx,not 3 ;round down + neg ecx + add ecx,[immediate_value] + test [code_type],CPU_ACTIVITY_ARM + setnz al + movzx eax,al + shl eax,2 + add eax,4 ;offset=4 for THUMB and 8 for ARM + sub ecx,eax + mov [immediate_value],ecx + .fd_q_exp_p: + .fd_q_rn_p: + .fd_q_rn_imm_p: + or ebp,1 shl 23 + mov eax,[immediate_value] + test eax,eax + jns .positive_imm + and ebp,not (1 shl 23) + neg eax + .positive_imm: + test eax,3 + jnz .out_of_range + shr eax,2 + cmp eax,0xff + ja .out_of_range + or ebp,eax + movzx eax,[operand_register0] ;fd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0x3fc + jmp ARM_post_process_copro_with_error + +VFP_dd_rn_offset: + ;used by FLDD, FSTD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=dd,[rn] + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=dd,[rn,imm] + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;2=dd,[imm] PC relative + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;3=dd,[exp] implicit reg from structure + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_sd_rn_offset.do + mov edx,[operand_registers] ;fd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_sd_rn_offset.do + +VFP_rn_list_s: + ;used by FLDMIAS, FLDMDBS, FSTMIAS, FSTMDBS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfp_reg_list_s>,\ ;0=rn,{..} + <TMPL_base_reg!,TMPL_vfp_reg_list_s> ;1=rn!,{..} + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + cmp al,1 ;writeback? + jnz .rn_okay + cmp [operand_register0],15 ;PC? + jz ERROR_r15_not_valid.first + or ebp,1 shl 21 + .rn_okay: + mov eax,ebp + and eax,1 shl 24 + 1 shl 21 ;isolate P and W + xor eax,1 shl 24 ;P=!P + jz ERROR_must_have_writeback_operator ;P=1 & W=0 is FLD/FST, not valid + mov edx,[reg_list_bitmap] + bsf eax,edx + bsr ecx,edx + ;check for a contiguous set + xor ecx,31 + shl edx,cl + add ecx,eax + sar edx,cl + inc edx + jnz ERROR_non_contiguous_set + mov ecx,[reg_list_bitmap] + bsf eax,ecx ;eax=start register + bsr edx,ecx + sub edx,eax + inc edx ;edx=register count + test ebp,1 shl 8 ;FLDMD? + jz .encode + cmp edx,16 + ja ERROR_large_set + ;double everything + add eax,eax + add edx,edx + ;shift high bit to LSb + mov ah,al + shr ah,5 + and ax,0x011e + or al,ah + movzx eax,al + .encode: + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,eax + or ebp,ecx + or ebp,edx + movzx eax,[operand_register0] ;rn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +VFP_rn_list_d: + ;used by FLDMIAD, FLDMDBD, FLDMIAX, FLDMDBX, FSTMIAD, FSTMDBD, FSTMIAX, FSTMDBX + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfp_reg_list_d>,\ ;0=rn,{..} + <TMPL_base_reg!,TMPL_vfp_reg_list_d> ;1=rn!,{..} + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz VFP_rn_list_s.do + mov edx,[reg_list_bitmap] + test edx,0xffff0000 + jnz ERROR_requires_copro_capability_vfp_d32 + jmp VFP_rn_list_s.do + +VFP_dn_rd: + ;used by FMDHR, FMDLR + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_base_reg> ;0=dn,rd + .test_version: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + movzx eax,[operand_register0] ;dn + xor ecx,ecx + shr eax,1 + setc cl + shl eax,16 + shl ecx,7 + or ebp,ecx + or ebp,eax + movzx eax,[operand_register1] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +VFP_rd_dn: + ;used by FMRDH, FMRDL + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfpd_reg> ;0=rd,dn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x0100 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + .encode: + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + and eax,0xf + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;dn + xor ecx,ecx + shr eax,1 + setc cl + shl eax,16 + shl ecx,7 + or ebp,ecx + or ebp,eax + jmp ARM_post_process_copro + +VFP_rd_sn: + ;used by FMRS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfps_reg> ;0=rd,sn + jmp VFP_rd_dn.do + +VFP_sn_rd: + ;used by FMSR + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_base_reg> ;0=sn,rd + .do: + mov ax,word[operand_register0] + xchg ah,al + mov word[operand_register0],ax + jmp VFP_rd_dn.do + +VFP_rd_sysreg: + ;used by FMRX, VMRS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfp_syst>,\ ;0=rd,sysreg + <TMPL_psr,TMPL_vfp_syst> ;0=apsr_nzcv,sysreg + cmp al,0 + mov ax,word[operand_registers+0] + jz .dest_okay + cmp al,34 ;apsr? + jnz ERROR_parameter_n_not_valid.first + mov al,0xf + .dest_okay: + shl ah,1 ;set sysreg encoding + cmp ah,1 shl 1 ;fpscr? + setz cl + shl cl,4 + or al,cl ;disable r15 check, r15 is okay here if reading fpscr + mov word[operand_registers+0],ax + jmp VFP_rd_dn.do + +VFP_sysreg_rd: + ;used by FMXR, VMSR + call decode_template + TEMPLATE \ + <TMPL_vfp_syst,TMPL_base_reg> ;0=sysreg,rd + mov ax,word[operand_registers+0] + xchg ah,al + shl ah,1 ;set sysreg encoding + mov word[operand_registers+0],ax + jmp VFP_rd_dn.do + +;vfp2 + +VFP_dm_rd_rn: + ;used by FMDRR + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_base_reg,TMPL_base_reg> ;0=dm,rd,rn + .test_version: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V2 + jz ERROR_requires_copro_capability_vfp_v2 + movzx eax,[operand_register0] ;dm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,ecx + or ebp,eax + movzx eax,[operand_register1] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.third + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +VFP_rd_rn_dm: + ;used by FMRRD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_vfpd_reg> ;0=rd,rn,dm + .test_version: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x010000 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V2 + jz ERROR_requires_copro_capability_vfp_v2 + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;dm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,ecx + or ebp,eax + jmp ARM_post_process_copro + +VFP_rd_rn_sm: + ;used by FMRRS + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_vfp_reg_list_s> ;0=rd,rn,{..} + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V2 + jz ERROR_requires_copro_capability_vfp_v2 + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + mov ecx,[reg_list_bitmap] + bsf eax,ecx ;eax=start register + bsr edx,ecx + ;check for a 2 register set + dec edx + cmp edx,eax + jnz ERROR_two_registers_required + cmp eax,30 + ja ERROR_two_registers_required + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,ecx + or ebp,eax + jmp ARM_post_process_copro + +VFP_sm_rd_rn: + ;used by FMSRR + call decode_template + TEMPLATE \ + <TMPL_vfp_reg_list_s,TMPL_comma,TMPL_base_reg,TMPL_base_reg> ;0={..},rd,rn + jmp VFP_rd_rn_sm.do + +VFP_fmstat: + ;used by FMSTAT + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V1xD + jz ERROR_requires_copro_capability_vfp_v1xd + jmp ARM_post_process_copro + +VFP_convert_single_to_quarter: + mov eax,[immediate_value] + mov ecx,eax + mov edx,eax + and eax,1 shl 23-1 ;eax=mantissa + shr ecx,23 + and ecx,0xff ;ecx=exponent + add eax,1 shl 18 + shr eax,19 + cmp eax,0xf + jbe .rounding_done + xor eax,eax + inc ecx + .rounding_done: + cmp cl,01111100b + jb .out_of_range + cmp cl,10000011b + ja .out_of_range + shr edx,31-7 + and edx,0x80 ;dl=sign + and ecx,7 + shl ecx,4 + or edx,ecx + or eax,edx + mov [immediate_value],eax + ret + .out_of_range: + or eax,-1 + mov [immediate_value],eax + ret + +VFP_dm_imm: + ;used by FCONSTD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm_float>,\ ;0=dd,float + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,imm + .vesion_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x01 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V3 + jz ERROR_requires_copro_capability_vfp_v3 + cmp al,1 + jz .constant_converted + call VFP_convert_single_to_quarter + .constant_converted: + movzx eax,[operand_register0] ;dd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,ecx + or ebp,eax + mov eax,[immediate_value] + cmp eax,0xff + ja .out_of_range + mov ecx,eax + and eax,0xf + and ecx,0xf0 + shl ecx,16-4 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0xff + jmp ARM_post_process_copro_with_error + +VFP_sm_imm: + ;used by FCONSTS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_imm_float>,\ ;0=sd,float + <TMPL_vfps_reg,TMPL_imm> ;1=sd,imm + jmp VFP_dm_imm.do + +VFP_dd_dd_imm: + ;used by FSHTOD, FSLTOD, FUHTOD, FULTOD, FTOSHD, FTOSLD, FTOUHD, FTOULD + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=dd,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm> ;1=dd,dd,imm + .test_version: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz .do + mov edx,[operand_registers] ;dd + test edx,0x0101 + jnz ERROR_requires_copro_capability_vfp_d32 + .do: + shr al,1 + jc .register_okay + mov cl,[operand_register0] + mov [operand_register1],cl + .register_okay: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V3 + jz ERROR_requires_copro_capability_vfp_v3 + movzx eax,word[operand_register0] ;dd,dd + cmp ah,al + jnz ERROR_dest_and_source_must_be_the_same + mov ah,0 + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,ecx + or ebp,eax + mov ecx,[immediate_value] + test ebp,1 shl 7 + jz .half + ;long + cmp ecx,1 + jb .out_of_range_long + cmp ecx,32 + ja .out_of_range_long + mov eax,32 + jmp .encode + .half: + cmp ecx,16 + ja .out_of_range_half + mov eax,16 + .encode: + sub eax,ecx + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,ecx + or ebp,eax + jmp ARM_post_process_copro + .out_of_range_long: + mov ecx,ERROR_immediate_value_out_of_range.1_32 + jmp ARM_post_process_copro_with_error + .out_of_range_half: + mov ecx,ERROR_immediate_value_out_of_range.0_16 + jmp ARM_post_process_copro_with_error + +VFP_sd_sd_imm: + ;used by FSHTOS, FSLTOS, FUHTOS, FULTOS, FTOSHS, FTOSLS, FTOUHS, FTOULS + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_imm>,\ ;0=sd,imm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_imm> ;1=sd,sd,imm + jmp VFP_dd_dd_imm.do + +;xScale + +XSCALE_acc_rm_rs: + ;used by MIA, MIAPH, MIABB, MIABT, MIATB, MIATT + call decode_template + TEMPLATE \ + <TMPL_acc_40bt,TMPL_base_reg,TMPL_base_reg> ;0=acc,rm,rs + test [copro_capability_flags],1 shl COPRO_CAPABILITY_XSCALE + jz ERROR_requires_copro_capability_xscale + movzx eax,[operand_register0] ;acc + shl eax,5 + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.third + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +XSCALE_acc_rdlo_rdhi: + ;used by MAR + call decode_template + TEMPLATE \ + <TMPL_acc_40bt,TMPL_base_reg,TMPL_base_reg> ;0=acc,rdlo,rdhi + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_XSCALE + jz ERROR_requires_copro_capability_xscale + movzx eax,[operand_register0] ;acc + or ebp,eax + movzx eax,[operand_register1] ;rm + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rs + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.third + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +XSCALE_rdlo_rdhi_acc: + ;used by MRA + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_acc_40bt> ;0=rdlo,rdhi,acc + test [copro_capability_flags],1 shl COPRO_CAPABILITY_XSCALE + jz ERROR_requires_copro_capability_xscale + mov eax,[operand_registers] + mov ecx,eax + shl eax,8 + shr ecx,16 + mov al,cl + mov [operand_registers],eax + jmp XSCALE_acc_rdlo_rdhi.do + +;IWMMXT V1 + +IWMMXT_r15: + ;used by TANDCB, TANDCH, TANDCW, TORCB, TORCH, TORCW + call decode_template + TEMPLATE \ + <TMPL_base_reg> ;0=r15 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;r15 + cmp eax,15 ;PC? + jnz ERROR_must_be_r15.first + jmp ARM_post_process_copro + +IWMMXT_wrd_rn: + ;used by TBCSTB, TBCSTH, TBCSTW + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_base_reg> ;0=wrd,rn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_r15_imm: + ;used by TEXTRCB, TEXTRCH, TEXTRCW + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_imm> ;0=r15,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;r15 + cmp eax,15 ;PC? + jnz ERROR_must_be_r15.first + mov eax,[immediate_value] + cmp eax,7 + ja .out_of_range + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_7 + jmp ARM_post_process_copro_with_error + +IWMMXT_rd_wrn_imm: + ;used by TEXTRMSB, TEXTRMSH, TEXTRMSW, TEXTRMUB, TEXTRMUH, TEXTRMUW + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_iwmmx_wreg,TMPL_imm> ;0=rd,wrn,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + cmp eax,7 + ja .out_of_range + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_7 + jmp ARM_post_process_copro_with_error + +IWMMXT_wrd_rn_imm: + ;used by TINSRB, TINSRH, TINSRW + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_base_reg,TMPL_imm> ;0=wrd,rn,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,12 + or ebp,eax + mov eax,[immediate_value] + cmp eax,7 + ja .out_of_range + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_7 + jmp ARM_post_process_copro_with_error + +IWMMXT_wcd_rn: + ;used by TMCR + call decode_template + TEMPLATE \ + <TMPL_iwmmx_creg,TMPL_base_reg> ;0=wcd,rn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wcd + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_rdlo_rdhi: + ;used by TMCRR + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_base_reg,TMPL_base_reg> ;0=wrd,rdlo,rdhi + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + or ebp,eax + movzx eax,[operand_register1] ;rdlo + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] ;rdhi + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_rm_rs: + ;used by TMIA, TMIAPH, TMIAxy + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_base_reg,TMPL_base_reg> ;0=wrd,rm,rs + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,5 + or ebp,eax + movzx eax,[operand_register1] ;rm + or ebp,eax + movzx eax,[operand_register2] ;rs + shl eax,12 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_rd_wrn: + ;used by TMOVMSKB, TMOVMSKH, TMOVMSKW + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_iwmmx_wreg> ;0=rd,wrn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_rd_wcn: + ;used by TMRC + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_iwmmx_creg> ;0=rd,wcn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;rd + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wcn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_rdlo_rdhi_wrn: + ;used by TMRRC + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_iwmmx_wreg> ;0=rdlo,rdhi,wrn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,word[operand_register0] + cmp ah,al + jz ERROR_destination_registers_must_differ + movzx eax,[operand_register0] ;rdlo + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rdhi + cmp eax,15 ;PC? + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrn + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn: + ;used by WACCB, WACCH, WACCW, WUNPCKEHUB, WUNPCKEHUH, WUNPCKEHUW, WUNPCKEHSB, WUNPCKEHSH, WUNPCKEHSW + ; WUNPCKELUB, WUNPCKELUH, WUNPCKELUW, WUNPCKELSB, WUNPCKELSH, WUNPCKELSW + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg> ;0=wrd,wrn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn_wrm: + ;used by WADDB, WADDH, WADDW, WADDBSS, WADDHSS, WADDWSS, WADDBUS, WADDHUS, WADDWUS, + ; WALIGNR0, WALIGNR1, WALIGNR2, WALIGNR3, WAND, WANDN, WAVG2B, WAVG2H, WAVG2BR, WAVG2HR, + ; WCMPEQB, WCMPEQH, WCMPEQW, WCMPGTSB, WCMPGTSH, WCMPGTSW, WCMPGTUB, WCMPGTUH, WCMPGTUW, + ; WMACS, WMACU, WMACSZ, WMACUZ, WMADDU, WMADDS, WMAXUB, WMAXUH, WMAXUW, WMAXSB, WMAXSH, WMAXSW, + ; WMINUB, WMINUH, WMINUW, WMINSB, WMINSH, WMINSW, WMULSM, WMULSL, WMULUM, WMULUL, + ; WPACKDSS, WPACKDUS, WPACKHSS, WPACKHUS, WPACKWSS, WPACKWUS, WSADB, WSADH, WSADBZ, WSADHZ, + ; WSUBB, WSUBH, WSUBW, WSUBBSS, WSUBHSS, WSUBWSS, WSUBBUS, WSUBHUS, WSUBWUS, + ; WUNPCKIHB, WUNPCKIHH, WUNPCKIHW, WUNPCKILB, WUNPCKILH, WUNPCKILW, WXOR + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_wreg> ;0=wrd,wrn,wrm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrm + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn_wrm_imm: + ;used by WALIGNI + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_imm> ;0=wrd,wrn,wrm,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrm + or ebp,eax + mov eax,[immediate_value] + cmp eax,7 + ja .out_of_range + shl eax,20 + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_7 + jmp ARM_post_process_copro_with_error + +IWMMXT_wrd_address5: + ;used by WLDRB, WLDRH, WLDRW, WSTRB, WSTRH, WSTRW + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 0=wrd,[rn] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=wrd,[rn],imm + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ; 2=wrd,[rn],{imm} + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 3=wrd,[rn,imm] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 4=wrd,[rn,imm]! + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ; 5=wrd,[imm] PC relative + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 6=wrd,[exp] implicit reg from structure + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 7=wrd,[exp]! implicit reg from structure + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 8=crd,[rn] + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 9=crd,[rn],imm + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ;10=crd,[rn],{imm} + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;11=crd,[rn,imm] + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;12=crd,[rn,imm]! + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;13=crd,[imm] PC relative + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;14=crd,[exp] implicit reg from structure + <TMPL_iwmmx_creg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;15=crd,[exp]! implicit reg from structure + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + cmp al,8 ;wcr? + jb .wcr_okay + ;check for W mode + mov ecx,ebp + and ecx,1 shl 22 + 1 shl 8 + cmp ecx,1 shl 8 + jnz ERROR_control_register_only_valid_with_word + sub al,8 + or ebp,0xf shl 28 + .wcr_okay: + cmp al,5 ;wrd,[imm]? + jnz .offset_okay + mov [operand_register1],0xf + call THUMB_query_condition_pc + mov eax,[addressing_space] + sub ecx,[eax+0x00] + and ecx,not 3 ;round down + neg ecx + add ecx,[immediate_value] + test [code_type],CPU_ACTIVITY_ARM + setnz al + movzx eax,al + shl eax,2 + add eax,4 ;offset=4 for THUMB and 8 for ARM + sub ecx,eax + mov [immediate_value],ecx + mov eax,3 ;wrd,[rn,imm] + .offset_okay: + test ebp,1 shl 8 ;WLDRB/WLDRH? + jnz .imm_adjusted + cmp al,2 ;option? + jz .imm_adjusted + shl [immediate_value],2 + .imm_adjusted: + mov ecx,[operand_registers] + shl ecx,8 + mov [operand_registers],ecx + jmp ARM_copro_crd_address5.version_check_okay + +IWMMXT_wrd_wrn_WMOV: + ;used by WMOV + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg> ;0=wrd,wrn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + or ebp,eax + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn_wcm: + ;used by WRORHG, WRORWG, WRORDG, WSLLHG, WSLLWG, WSLLDG, WSRAHG, WSRAWG, WSRADG, WSRLHG, WSRLWG, WSRLDG + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_creg> ;0=wrd,wrn,wcm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wcm + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn_imm: + ;used by WSHUFH + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_imm> ;0=wrd,wrn,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + cmp eax,0xff + ja .out_of_range + mov ecx,eax + and eax,0xf + and ecx,0xf0 + shl ecx,20-4 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_0xff + jmp ARM_post_process_copro_with_error + +IWMMXT_wrd: + ;used by WZERO + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg> ;0=wrd + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + or ebp,eax + shl eax,12 + or ebp,eax + shl eax,4 + or ebp,eax + jmp ARM_post_process_copro + +;IWMMXT V2 + +IWMMXT_r15_v2: + ;used by TORVSCB, TORVSCH, TORVSCW + call decode_template + TEMPLATE \ + <TMPL_base_reg> ;0=r15 + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + movzx eax,[operand_register0] ;r15 + cmp eax,15 ;PC? + jnz ERROR_must_be_r15.first + jmp ARM_post_process_copro + +IWMMXT_rd_rn_rm_imm: + ;used by WMERGE + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_imm> ;0=wrd,wrn,wrm,imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrm + or ebp,eax + mov eax,[immediate_value] + cmp eax,7 + ja .out_of_range + shl eax,21 + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_7 + jmp ARM_post_process_copro_with_error + +IWMMXT_rd_rn_v2: + ;used by WABSB, WABSH, WABSW + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg> ;0=wrd,wrn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_rd_rn_rm_v2: + ;used by WABSDIFFB, WABSDIFFH, WABSDIFFW, WADDBHUSL, WADDBHUSM, WADDHC, WADDSUBHX, WADDWC, + ; WAVG4, WAVG4R, WMADDSN, WMADDSX, WMADDUN, WMADDUX, WMIABB, WMIABBN, WMIABT, WMIABTN, + ; WMIATB, WMIATBN, WMIATT, WMIATTN, WMIAWBB, WMIAWBBN, WMIAWBT, WMIAWBTN, WMIAWTB, + ; WMIAWTBN, WMIAWTT, WMIAWTTN, WMULSMR, WMULUMR, WMULWL, WMULWSM, WMULWSMR, WMULWUM, + ; WMULWUMR, WQMIABB, WQMIABBN, WQMIABT, WQMIABTN, WQMIATB, WQMIATBN, WQMIATT, WQMIATTN, + ; WQMULM, WQMULMR, WQMULWM, WQMULWMR, WSUBADDHX + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_wreg> ;0=wrd,wrn,wrm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrm + or ebp,eax + jmp ARM_post_process_copro + +IWMMXT_wrd_wrn_param: + ;used by WSLLH, WSLLW, WSLLD, WSRAH, WSRAW, WSRAD, WSRLH, WSRLW, WSRLD, WRORH, WRORW, WRORD + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_iwmmx_wreg>,\ ;0=wrd,wrn,wrm + <TMPL_iwmmx_wreg,TMPL_iwmmx_wreg,TMPL_imm> ;1=wrd,wrn,imm + cmp al,1 + jz .wrd_wrn_imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V1 + jz ERROR_requires_copro_capability_iwmmxt_v1 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;wrm + or ebp,eax + jmp ARM_post_process_copro + .wrd_wrn_imm: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + or ebp,0xf shl 28 + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;wrn + shl eax,16 + or ebp,eax + mov eax,[immediate_value] + cmp eax,32 + ja .out_of_range + cmp eax,0 + jz .shift_0 + mov ecx,eax + and ecx,0x10 + and eax,0x0f + shl ecx,8-4 + or ebp,eax + or ebp,ecx + jmp ARM_post_process_copro + .shift_0: + or ebp,3 shl 20 ;force to WROR + mov ecx,ebp + and ecx,3 shl 22 + cmp ecx,1 shl 22 ;H? + jz .shift_0_H + cmp ecx,2 shl 22 ;W? + jz ARM_post_process_copro ;WRORW wrd,wrn,32 + ;shift 0 D + and ebp,not (0x10f00ff0) ;force to WOR + movzx eax,[operand_register1] ;wrn + or ebp,eax ;WOR wrd,wrn,wrn + jmp ARM_post_process_copro + .shift_0_H: + or ebp,1 shl 8 ;WRORH wrd,wrn,16 + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.0_32 + jmp ARM_post_process_copro_with_error + +IWMMXT_wrd_address5_reg_offset_translate: + db 0 ;0 0=wrd,[rn] + db -1 ;1 + db -1 ;2 + db 1 ;3 1=wrd,[rn],imm + db 2 ;4 2=wrd,[rn],{imm} + db 3 ;5 3=wrd,[rn,imm] + db 4 ;6 4=wrd,[rn,imm]! + db -1 ;7 + db -1 ;8 + db -1 ;9 + db -1 ;10 + db 5 ;11 5=wrd,[imm] PC relative + db 6 ;12 6=wrd,[exp] implicit reg from structure + db 7 ;13 7=wrd,[exp]! implicit reg from structure + +IWMMXT_wrd_address5_reg_offset: + ;used by WLDRD, WSTRD + call decode_template + TEMPLATE \ + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ; 0=wrd,[rn] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg>,\ ; 1=wrd,[rn],+-rm + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm>,\ ; 2=wrd,[rn],+-rm,lsl imm + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_imm>,\ ; 3=wrd,[rn],imm + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right,TMPL_option>,\ ; 4=wrd,[rn],{imm} + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ; 5=wrd,[rn,imm] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 6=wrd,[rn,imm]! + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right>,\ ; 7=wrd,[rn,+-rm] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 8=wrd,[rn,+-rm]! + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right>,\ ; 9=wrd,[rn,+-rm,lsl imm] + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_base_reg,TMPL_add_sub_reg,TMPL_shift_op,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;10=wrd,[rn,+-rm,lsl imm]! + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;11=wrd,[imm] PC relative + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=wrd,[exp] implicit reg from structure + <TMPL_iwmmx_wreg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;13=wrd,[exp]! implicit reg from structure + mov cl,al + movzx eax,al + mov al,[eax+IWMMXT_wrd_address5_reg_offset_translate] + cmp al,-1 + jnz IWMMXT_wrd_address5.do + test [copro_capability_flags],1 shl COPRO_CAPABILITY_IWMMXT_V2 + jz ERROR_requires_copro_capability_iwmmxt_v2 + or ebp,0xf shl 28 + mov al,[operand_register2] ;rm + movzx edx,al + not edx + and edx,0x80 ;get '+' state + shl edx,23-7 + or ebp,edx ;set U if '+' + and al,0xf + cmp al,0xf + jz ERROR_r15_not_valid.third + mov [operand_register2],al ;rm + mov eax,[immediate_value] + cmp eax,15 + ja .out_of_range + cmp cl,1 + jz .wrd_q_rn_p_PMrm + cmp cl,2 + jz .wrd_q_rn_p_PMrm_lsl_imm + cmp cl,7 + jz .wrd_q_rn_PMrm_p + cmp cl,8 + jz .wrd_q_rn_PMrm_p! + cmp cl,9 + jz .wrd_q_rn_PMrm_lsl_imm_p + cmp cl,10 + jz .wrd_q_rn_PMrm_lsl_imm_p! + ud2 + .wrd_q_rn_p_PMrm_lsl_imm: + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz ERROR_shift_type_must_be_LSL + .wrd_q_rn_p_PMrm: + or ebp,1 shl 21 ;set W + jmp .encode + .wrd_q_rn_PMrm_lsl_imm_p!: + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz ERROR_shift_type_must_be_LSL + .wrd_q_rn_PMrm_p!: + or ebp,1 shl 21 + 1 shl 24 ;set W & P + jmp .encode + .wrd_q_rn_PMrm_lsl_imm_p: + cmp [instruction_shift_op],ARM_SHIFT_OPCODE_LSL + jnz ERROR_shift_type_must_be_LSL + .wrd_q_rn_PMrm_p: + or ebp,1 shl 24 ;set P + .encode: + movzx eax,[operand_register0] ;wrd + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + or ebp,eax + mov eax,[immediate_value] + shl eax,4 + or ebp,eax + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.0_15 + jmp ARM_post_process_copro_with_error + +;SIMD + +SIMD_INT_vd_vn_vm: + ;used by VABA.S16, VABA.S32, VABA.S8, VABA.U16, VABA.U32, VABA.U8, + ; VMLA.S8, VMLA.U8, VMLA.I8, VMLS.S8, VMLS.U8, VMLS.I8 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;1=qd,qn,qm + .int_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + .encode: + movzx eax,al + shl eax,6 + or ebp,eax ;set Q bit + movzx eax,[operand_register0] ;vd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 ;D bit + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;vn + xor ecx,ecx + shr eax,1 + setc cl + shl eax,16 + shl ecx,7 ;N bit + or ebp,eax + or ebp,ecx + movzx eax,[operand_register2] ;vm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 ;M bit + or ebp,eax + or ebp,ecx + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction + cmp ebp,0xf0000000 + jb ARM_post_process_copro.thumb + jmp ARM_post_process_simd + +SIMD_INT_vd_vn_vm_alt: + ;used by VABD.S16, VABD.S32, VABD.S8, VABD.U16, VABD.U32, VABD.U8, + ; VADD.I8, VADD.I16, VADD.I32, VADD.I64, VAND, VBIC, VBIF, VBIT, VBSL, + ; VCGE.U8, VCGE.U16, VCGE.U32, VCGT.U8, VCGT.U16, VCGT.U32, VEOR, + ; VHADD.S8, VHADD.S16, VHADD.S32, VHADD.U8, VHADD.U16, VHADD.U32, + ; VHSUB.S8, VHSUB.S16, VHSUB.S32, VHSUB.U8, VHSUB.U16, VHSUB.U32, + ; VMAX.S8, VMAX.S16, VMAX.S32, VMAX.U8, VMAX.U16, VMAX.U32, + ; VMIN.S8, VMIN.S16, VMIN.S32, VMIN.U8, VMIN.U16, VMIN.U32, + ; VMUL.I8, VMUL.S8, VMUL.S16, VMUL.S32, VMUL.U8, VMUL.U16, VMUL.U32, VMUL.P8, + ; VQADD.S8, VQADD.S16, VQADD.S32, VQADD.S64, VQADD.U8, VQADD.U16, VQADD.U32, VQADD.U64, + ; VQRSHL.S8, VQRSHL.S16, VQRSHL.S32, VQRSHL.S64, VQRSHL.U8, VQRSHL.U16, VQRSHL.U32, VQRSHL.U64, + ; VQSUB.S8, VQSUB.S16, VQSUB.S32, VQSUB.S64, VQSUB.U8, VQSUB.U16, VQSUB.U32, VQSUB.U64, + ; VRHADD.S8, VRHADD.S16, VRHADD.S32, VRHADD.U8, VRHADD.U16, VRHADD.U32, + ; VRSHL.S16, VRSHL.S32, VRSHL.S64, VRSHL.S8, VRSHL.U16, VRSHL.U32, VRSHL.U64, VRSHL.U8, + ; VSHL.S16, VSHL.S32, VSHL.S64, VSHL.S8, VSHL.U16, VSHL.U32, VSHL.U64, VSHL.U8, + ; VSUB.I8, VSUB.I16, VSUB.I32, VSUB.I64, VTST.8, VTST.16, VTST.32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;3=qd,qn,qm + .encode: + shr al,1 + jc SIMD_INT_vd_vn_vm.int_test + mov cx,word[operand_registers+0] + mov word[operand_registers+1],cx + jmp SIMD_INT_vd_vn_vm.int_test + +SIMD_INT_vd_vn_vm_alt_zero: + ;used by VCEQ.I8, VCEQ.I16, VCEQ.I32, VCGE.S8, VCGE.S16, VCGE.S32, VCGT.S8, VCGT.S16, VCGT.S32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qdm,0 + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;5=qd,qm,0 + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + test al,010b + jnz .not_zero + .zero: + cmp [immediate_value],0 + mov ecx,ERROR_immediate_offset_out_of_range.0 + jnz ARM_post_process_simd_with_error + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + mov ah,al + shr al,2 + test ah,1 + jnz SIMD_INT_vd_vm.int_test + mov cl,[operand_register0] + mov [operand_register1],cl + jmp SIMD_INT_vd_vm.int_test + .not_zero: + mov ah,al + and ax,0x0401 + shr ah,1 + or al,ah + jmp SIMD_INT_vd_vn_vm_alt.encode + +SIMD_INT_vd_vn_vm_long: + ;used by VABAL.S16, VABAL.S32, VABAL.S8, VABAL.U16, VABAL.U32, VABAL.U8, + ; VABDL.S16, VABDL.S32, VABDL.S8, VABDL.U16, VABDL.U32, VABDL.U8, + ; VADDL.S16, VADDL.S32, VADDL.S8, VADDL.U16, VADDL.U32, VADDL.U8, + ; VSUBL.S16, VSUBL.S32, VSUBL.S8, VSUBL.U16, VSUBL.U32, VSUBL.U8, + ; VMLAL.S8, VMLAL.U8, VMLSL.S8, VMLSL.U8, VMULL.S8, VMULL.U8, VMULL.P8 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=qd,dn,dm + jmp SIMD_INT_vd_vn_vm.int_test + +SIMD_INT_vd_vn_vm_wide: + ;used by VADDW.S16, VADDW.S32, VADDW.S8, VADDW.U16, VADDW.U32, VADDW.U8 + ; VSUBW.S16, VSUBW.S32, VSUBW.S8, VSUBW.U16, VSUBW.U32, VSUBW.U8 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg>,\ ;0=qdn,dm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_vfpd_reg> ;1=qd,qn,dm + jmp SIMD_INT_vd_vn_vm_alt.encode + +SIMD_FLOAT_vd_vn_vm_alt: + ;used by VABD.F32, VACGE.F32, VACGT.F32, VMAX.F32, VMIN.F32, VRECPS.F32, VRSQRTS.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;3=qd,qn,qm + .float_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + shr al,1 + jc SIMD_INT_vd_vn_vm.encode + mov cx,word[operand_registers+0] + mov word[operand_registers+1],cx + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_FLOAT_vd_vn_vm_alt_zero: + ;used by VCEQ.F32, VCGE.F32, VCGT.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qdm,0 + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;5=qd,qm,0 + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + test al,010b + jnz .not_zero + .zero: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + cmp [immediate_value],0 + mov ecx,ERROR_immediate_offset_out_of_range.0 + jnz ARM_post_process_simd_with_error + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + mov ah,al + shr al,2 + test ah,1 + jnz SIMD_INT_vd_vm.encode + mov cl,[operand_register0] + mov [operand_register1],cl + jmp SIMD_INT_vd_vm.encode + .not_zero: + mov ah,al + and ax,0x0401 + shr ah,1 + or al,ah + jmp SIMD_FLOAT_vd_vn_vm_alt.float_test + +SIMD_FLOAT_vd_vm_vn_alt: + ;used by VACLE.F32, VACLT.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddm,dn + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dm,dn + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qdm,qn + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;3=qd,qm,qn + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + .swap: + mov cx,word[operand_registers+1] + xchg ch,cl + mov word[operand_registers+1],cx + shr al,1 + jc SIMD_INT_vd_vn_vm.encode + mov cl,ch + mov ch,[operand_register0] + mov word[operand_registers+1],cx + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_INT_vd_vn_vm_alt_swap: + ;used by VCLE.U8, VCLE.U16, VCLE.U32, VCLT.U8, VCLT.U16, VCLT.U32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;3=qd,qn,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + jmp SIMD_FLOAT_vd_vm_vn_alt.swap + +SIMD_INT_vd_vn_vm_alt_zero_swap: + ;used by VCLE.S8, VCLE.S16, VCLE.S32, VCLT.S8, VCLT.S16, VCLT.S32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qdm,0 + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;5=qd,qm,0 + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + test al,010b + jz SIMD_INT_vd_vn_vm_alt_zero.zero + mov ah,al + and ax,0x0401 + shr ah,1 + or al,ah + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + jmp SIMD_FLOAT_vd_vm_vn_alt.swap + +SIMD_FLOAT_vd_vn_vm_alt_zero_swap: + ;used by VCLE.F32, VCLT.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,0 + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qdm,0 + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;5=qd,qm,0 + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + test al,010b + jz SIMD_FLOAT_vd_vn_vm_alt_zero.zero + mov ah,al + and ax,0x0401 + shr ah,1 + or al,ah + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + jmp SIMD_FLOAT_vd_vm_vn_alt.swap + +SIMD_INT_vd_vm: + ;used by VABS.S8, VABS.S16, VABS.S32, VCLS.S8, VCLS.S16, VCLS.S32, VCLZ.S8, VCLZ.S16, VCLZ.S32, VCNT.8, + ; VMVN, VNEG.S8, VNEG.S16, VNEG.S32, VPADAL.S8, VPADAL.S16, VPADAL.S32, VPADAL.U8, VPADAL.U16, VPADAL.U32 + ; VPADDL.S8, VPADDL.S16, VPADDL.S32, VPADDL.U8, VPADDL.U16, VPADDL.U32, VQABS.S8, VQABS.S16, VQABS.S32, + ; VQNEG.S8, VQNEG.S16, VQNEG.S32, VRECPE.U32, VREV16.8, VREV32.16, VREV32.8, VREV64.16, VREV64.32, VREV64.8, + ; VRSQRTE.U32, VSWP, VTRN.8, VTRN.16, VTRN.32, VUZP.8, VUZP.16, VUZP.32, VZIP.8, VZIP.16, VZIP.32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_simd_qreg,TMPL_simd_qreg> ;1=qd,qm + .int_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + .encode: + movzx eax,al + shl eax,6 + or ebp,eax ;set Q bit + movzx eax,[operand_register0] ;vd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 ;D bit + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;vm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 ;M bit + or ebp,eax + or ebp,ecx + jmp ARM_post_process_simd + +SIMD_FLOAT_vd_vm_imm: + ;used by VCVT.F32.S32, VCVT.F32.U32, VCVT.S32.F32, VCVT.U32.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,imm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qd,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;3=qd,qm,imm + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;4=sd,sm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_imm>,\ ;5=sd,sm,imm + <TMPL_vfps_reg,TMPL_imm> ;6=sdm,imm + cmp al,6 + jnz .registers_okay + mov cl,[operand_register0] + mov [operand_register1],cl + mov al,5 + .registers_okay: + shr al,1 + jnc SIMD_FLOAT_vd_vm_f32.encode + ;recode for immediate forms + mov ecx,ebp + mov edx,ebp + and ecx,1 shl 7 ;signed=0, unsigned=1 + and edx,1 shl 8 ;to float=0, to int=1 + shl edx,(18-8)-(16-7) + or edx,ecx + shl edx,16-7 + or edx,0x0eba0ac0 ;fsltos + mov [thumb32_instruction],edx + shl ecx,24-7 + and ebp,1 shl 8 + or ebp,ecx + or ebp,0xf2a00e10 ;vcvt.f32.s32 without imm + cmp al,2 + jz .VFP_alias + mov ecx,[immediate_value] + cmp ecx,1 + jb .out_of_range + cmp ecx,32 + ja .out_of_range + mov edx,32 + sub edx,ecx + shl edx,16 + or ebp,edx + jmp SIMD_FLOAT_vd_vm_f32.float_test + .VFP_alias: + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + jmp VFP_dd_dd_imm.do + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.1_32 + jmp ARM_post_process_copro_with_error + +SIMD_FLOAT_vd_vm_f32: + ;used by VABS.F32, VNEG.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;1=qd,qm + <TMPL_vfps_reg,TMPL_vfps_reg> ;2=sd,sm + .encode: + cmp al,2 + jnz .float_test + ;VFP alias + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + jmp VFP_sd_sm.v1xd_test + .float_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + jmp SIMD_INT_vd_vm.encode + +SIMD_FLOAT_vd_vn_vm_f32: + ;used by VADD.F32, VSUB.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;2=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;3=qd,qn,qm + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;4=sdn,sm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;5=sd,sn,sm + .do: + cmp al,4 + jb SIMD_FLOAT_vd_vn_vm_alt.float_test + ;VFP alias + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + sub al,4 + jmp VFP_sd_sn_sm.v1xd_test + +SIMD_INT_vd_vn_vm_narrow: + ;used by VADDHN.I16, VADDHN.I32, VADDHN.I64, VRADDHN.I16, VRADDHN.I32, VRADDHN.I64, + ; VRSUBHN.I16, VRSUBHN.I32, VRSUBHN.I64, VSUBHN.I16, VSUBHN.I32, VSUBHN.I64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_simd_qreg,TMPL_simd_qreg> ;0=dd,qn,qm + jmp SIMD_INT_vd_vn_vm.int_test + +SIMD_INT_vd_imm: + ;used by VAND.I32, VAND.I16, VBIC.I32, VBIC.I16, VORN.I32, VORN.I16, VORR.I32, VORR.I16 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_imm>,\ ;0=qd,imm + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,imm + mov ecx,[immediate_value] + btr ebp,0 ;test for VAND + jnc .inversion_done + not ecx + test ebp,1000b shl 8 ;test for .I16 instruction + jz .inversion_done + cmp ecx,0xffff0000 + jb .inversion_done + movzx ecx,cx + .inversion_done: + test ecx,not 0xff + jz .encode + xor ebp,0010b shl 8 + ror ecx,8 + test ecx,not 0xff + jz .encode + test ebp,1000b shl 8 ;test for .I16 instruction + jnz .out_of_range + xor ebp,0110b shl 8 + ror ecx,8 + test ecx,not 0xff + jz .encode + xor ebp,0010b shl 8 + ror ecx,8 + test ecx,not 0xff + jnz .out_of_range + .encode: + and eax,1 + xor eax,1 + shl eax,6 + or ebp,eax ;set Q + mov eax,ecx + mov edx,ecx + and eax,0x0f + and ecx,0x70 + and edx,0x80 + shl ecx,16-4 + shl edx,24-7 + or ebp,eax ;imm4 + or ebp,ecx ;imm3 + or ebp,edx ;i + movzx eax,[operand_register0] ;vd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 ;D bit + or ebp,eax + or ebp,ecx + jmp ARM_post_process_simd + .out_of_range: + mov ecx,ERROR_immediate_cannot_be_encoded + jmp ARM_post_process_simd_with_error + +SIMD_FLOAT_qd_dm: + ;used by VCVT.F32.F16 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg> ;0=qd,dm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_HP + jz ERROR_requires_copro_capability_simd_hp + jmp SIMD_INT_vd_vm.encode + +SIMD_FLOAT_dd_qm: + ;used by VCVT.F16.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_simd_qreg> ;0=dd,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_HP + jz ERROR_requires_copro_capability_simd_hp + jmp SIMD_INT_vd_vm.encode + +SIMD_INT_qd_dmx: + ;used by VDUP.8, VDUP.16, VDUP.32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;0=dd,dm[x] + <TMPL_vfpd_reg,TMPL_base_reg>,\ ;1=dd,rt + <TMPL_simd_qreg,TMPL_vfpdx_reg>,\ ;2=qd,dm[x] + <TMPL_simd_qreg,TMPL_base_reg> ;3=qd,rt + shr al,1 + jc .reg + mov ecx,ebp + shr ecx,16 + and ecx,0xf ;ecx=1, 2 or 3 for 8, 16 or 32 size + and ebp,not (0xf shl 16) + mov edx,16 + shr edx,cl + cmp edx,[immediate_value] + jbe .out_of_range + mov edx,[immediate_value] + shl edx,1 + or edx,1 + add ecx,16-1 + shl edx,cl + or ebp,edx + jmp SIMD_INT_vd_vm.int_test + .reg: + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + shl eax,21 + or ebp,eax ;set Q + movzx eax,[operand_register0] ;vd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,16 + shl ecx,7 ;D bit + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;rt + cmp eax,15 ;PC? + jz ERROR_r15_not_valid + shl eax,12 + or ebp,eax + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_post_process_copro + cmp eax,13 shl 12 ;SP? + jz ERROR_r13_not_valid + jmp ARM_post_process_copro + .out_of_range: + mov ecx,ERROR_immediate_cannot_be_encoded + jmp ARM_post_process_simd_with_error + +SIMD_INT_vd_vn_vm_imm: + ;used by VEXT.8, VEXT.16, VEXT.32, VEXT.64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddn,dm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dn,dm,imm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;2=qdn,qm,imm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm> ;3=qd,qn,qm,imm + mov edx,[immediate_value] + mov ecx,ebp + shr ecx,8 + and ecx,0xf ;ecx=multiplier + imul edx,ecx + mov ecx,eax + shr ecx,1 + and ecx,1 + xor ecx,1 + shl edx,cl + cmp edx,16 + jae .out_of_range + shr edx,cl + and ebp,not (0xf shl 8) + shl edx,8 + or ebp,edx + shr al,1 + jc SIMD_INT_vd_vn_vm.int_test + mov cx,word[operand_registers+0] + mov word[operand_registers+1],cx + jmp SIMD_INT_vd_vn_vm.int_test + .out_of_range: + mov ecx,ERROR_immediate_cannot_be_encoded + jmp ARM_post_process_simd_with_error + +SIMD_INT_list_rn_rm_1: + ;used by VLD1.8, VLD1.16, VLD1.32, VLD1.64, VST1.8, VST1.16, VST1.32, VST1.64 + call decode_template + TEMPLATE \ + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right>,\ ;0={dy[x]},[rn] + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;1={dy[x]},[rn]! + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_base_reg>,\ ;2={dy[x]},[rn],rm + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_imm> ;3={dy[x]},[rn],imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + jz .element + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + jz .vector + ;register + mov ah,[simd_reg_list_count] + xor ecx,ecx + mov edx,7 shl 8 ;type = 0111 + cmp ah,1 + cmovz ecx,edx + mov edx,10 shl 8 ;type = 1010 + cmp ah,2 + cmovz ecx,edx + mov edx,6 shl 8 ;type = 0110 + cmp ah,3 + cmovz ecx,edx + mov edx,2 shl 8 ;type = 0010 + cmp ah,4 + cmovz ecx,edx + or ebp,ecx + test ecx,ecx + mov ecx,ERROR_register_list_invalid + jz ARM_post_process_simd_with_error + mov ah,[operand_register0] ;rn + mov ecx,0 shl 4 ;align = 00 + shr ah,4 + jz .set_alignment + mov ecx,1 shl 4 ;align = 01 + cmp ah,3 ;@64 + jz .set_alignment + mov ecx,2 shl 4 ;align = 10 + cmp ah,4 ;@128 + jz .set_alignment + cmp ah,5 ;@256 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + mov ecx,3 shl 4 ;align = 11 + .set_alignment: + or ebp,ecx + movzx ebx,[simd_reg_list_count] + shl ebx,3 ;ebx=writeback offset + .encode: + mov edx,0xf + cmp al,0 + jz .set_rm + mov edx,0xd + cmp al,1 + jz .set_rm + movzx edx,[operand_register1] ;rm + mov ecx,ERROR_r13_r15_not_valid.third + cmp edx,13 + jz ARM_post_process_simd_with_error + cmp edx,15 + jz ARM_post_process_simd_with_error + cmp al,2 + jz .set_rm + ;immediate post update + cmp ebx,[immediate_value] + mov ecx,ERROR_immediate_offset_out_of_range + jnz ARM_post_process_simd_with_error + mov edx,0xd + .set_rm: + or ebp,edx + movzx eax,[simd_reg_list_first] ;vd + mov ecx,eax + and eax,0x0f + and ecx,0x10 + shl eax,12 + shl ecx,22-4 ;D bit + or ebp,eax + or ebp,ecx + movzx eax,[operand_register0] ;rn + and eax,0xf + cmp eax,0xf + mov ecx,ERROR_r15_not_valid.second + jz ARM_post_process_simd_with_error + shl eax,16 + or ebp,eax + jmp ARM_post_process_simd + .element: + or ebp,1 shl 23 + cmp [simd_reg_list_count],1 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + mov edx,ebp + and edx,3 shl 6 + cmp edx,3 shl 6 ;.64 size? + mov ecx,ERROR_use_fldr_for_single_reg + jz ARM_post_process_simd_with_error + and ebp,not (3 shl 6) + shl edx,10-6 + or ebp,edx + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 10 + movzx edx,[simd_reg_list_x] + ja .element.32 + jz .element.16 + ;element.8 + test ah,ah + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + cmp edx,7 + mov ecx,ERROR_element_value_out_of_range.0_7 + ja ARM_post_process_simd_with_error + shl edx,4+1 + or ebp,edx + mov ebx,1 + jmp .encode + .element.16: + cmp ah,1 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp edx,3 + mov ecx,ERROR_element_value_out_of_range.0_3 + ja ARM_post_process_simd_with_error + shl edx,2 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,2 + jmp .encode + .element.32: + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + cmp edx,1 + mov ecx,ERROR_element_value_out_of_range.0_1 + ja ARM_post_process_simd_with_error + shl edx,3 + or dl,ah + shr ah,1 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,4 + jmp .encode + .vector: + mov ecx,ERROR_register_list_invalid + test ebp,1 shl 21 ;VST1=0 + jz ARM_post_process_simd_with_error + or ebp,1 shl 23 + 3 shl 10 + movzx edx,[simd_reg_list_count] + cmp edx,2 + mov ecx,ERROR_register_list_invalid + ja ARM_post_process_simd_with_error + dec edx + shl edx,5 + or ebp,edx ;set T bit + mov edx,ebp + and edx,3 shl 6 + cmp edx,3 shl 6 ;.64 size? + mov ecx,ERROR_reg_size_64_not_encodable + jz ARM_post_process_simd_with_error + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 6 + movzx edx,ah + ja .vector.32 + jz .vector.16 + ;vector.8 + test ah,ah + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + mov ebx,1 + jmp .encode + .vector.16: + cmp ah,1 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + shl edx,4 + or ebp,edx + mov ebx,2 + jmp .encode + .vector.32: + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + shl edx,3 + or ebp,edx + mov ebx,4 + jmp .encode + +SIMD_INT_list_rn_rm_2: + ;used by VLD2.8, VLD2.16, VLD2.32, VST2.8, VST2.16, VST2.32 + call decode_template + TEMPLATE \ + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right>,\ ;0={dy[x]},[rn] + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;1={dy[x]},[rn]! + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_base_reg>,\ ;2={dy[x]},[rn],rm + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_imm> ;3={dy[x]},[rn],imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + jz .element + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + jz .vector + ;register + mov ah,[simd_reg_list_count] + xor ecx,ecx + mov edx,8 shl 8 ;type = 1000 + cmp ah,2 + cmovz ecx,edx + mov edx,9 shl 8 ;type = 1001 + cmp ah,0x82 + cmovz ecx,edx + mov edx,3 shl 8 ;type = 0011 + cmp ah,4 + cmovz ecx,edx + or ebp,ecx + test ecx,ecx + mov ecx,ERROR_register_list_invalid + jz ARM_post_process_simd_with_error + mov ah,[operand_register0] ;rn + mov ecx,0 shl 4 ;align = 00 + shr ah,4 + jz .set_alignment + mov ecx,1 shl 4 ;align = 01 + cmp ah,3 ;@64 + jz .set_alignment + mov ecx,2 shl 4 ;align = 10 + cmp ah,4 ;@128 + jz .set_alignment + cmp ah,5 ;@256 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + cmp [simd_reg_list_count],4 + jnz ARM_post_process_simd_with_error + mov ecx,3 shl 4 ;align = 11 + .set_alignment: + or ebp,ecx + mov bl,[simd_reg_list_count] + and ebx,0x7f + shl ebx,3 ;ebx=writeback offset + jmp SIMD_INT_list_rn_rm_1.encode + .element: + or ebp,1 shl 23 + 1 shl 8 + mov cl,[simd_reg_list_count] + test ebp,3 shl 6 ;.8? + setz ch + shl ch,7 + or ch,0x7f + and cl,ch + cmp cl,2 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + mov edx,ebp + and edx,3 shl 6 + and ebp,not (3 shl 6) + shl edx,10-6 + or ebp,edx + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 10 + movzx edx,[simd_reg_list_x] + ja .element.32 + jz .element.16 + ;element.8 + cmp ah,1 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp edx,7 + mov ecx,ERROR_element_value_out_of_range.0_7 + ja ARM_post_process_simd_with_error + shl edx,1 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,2 + jmp SIMD_INT_list_rn_rm_1.encode + .element.16: + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + cmp edx,3 + mov ecx,ERROR_element_value_out_of_range.0_3 + ja ARM_post_process_simd_with_error + shl edx,1 + mov cl,[simd_reg_list_count] + shr cl,7 + or dl,cl + shl edx,1 + shr ah,1 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,4 + jmp SIMD_INT_list_rn_rm_1.encode + .element.32: + cmp ah,3 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + cmp edx,1 + mov ecx,ERROR_element_value_out_of_range.0_1 + ja ARM_post_process_simd_with_error + shl edx,1 + mov cl,[simd_reg_list_count] + shr cl,7 + or dl,cl + shl edx,2 + and ah,1 + xor ah,1 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,8 + jmp SIMD_INT_list_rn_rm_1.encode + .vector: + mov ecx,ERROR_register_list_invalid + test ebp,1 shl 21 ;VST2=0 + jz ARM_post_process_simd_with_error + or ebp,1 shl 23 + 0xd shl 8 + mov dl,[simd_reg_list_count] + mov dh,dl + and dx,0x7f80 + cmp dh,2 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + shr edx,7-5 + and edx,0x20 + or ebp,edx ;set T bit + mov edx,ebp + and edx,3 shl 6 + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 6 + movzx edx,ah + ja .vector.32 + jz .vector.16 + ;vector.8 + cmp ah,1 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + shl edx,4 + or ebp,edx + mov ebx,2 + jmp SIMD_INT_list_rn_rm_1.encode + .vector.16: + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + shl edx,3 + or ebp,edx + mov ebx,4 + jmp SIMD_INT_list_rn_rm_1.encode + .vector.32: + cmp ah,3 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + and edx,1 + shl edx,4 + or ebp,edx + mov ebx,8 + jmp SIMD_INT_list_rn_rm_1.encode + +SIMD_INT_list_rn_rm_3: + ;used by VLD3.8, VLD3.16, VLD3.32, VST3.8, VST3.16, VST3.32 + call decode_template + TEMPLATE \ + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right>,\ ;0={dy[x]},[rn] + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;1={dy[x]},[rn]! + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_base_reg>,\ ;2={dy[x]},[rn],rm + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_imm> ;3={dy[x]},[rn],imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + jz .element + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + jz .vector + ;register + mov ah,[simd_reg_list_count] + xor ecx,ecx + mov edx,4 shl 8 ;type = 0100 + cmp ah,3 + cmovz ecx,edx + mov edx,5 shl 8 ;type = 0101 + cmp ah,0x83 + cmovz ecx,edx + or ebp,ecx + test ecx,ecx + mov ecx,ERROR_register_list_invalid + jz ARM_post_process_simd_with_error + mov ah,[operand_register0] ;rn + mov ecx,0 shl 4 ;align = 00 + shr ah,4 + jz .set_alignment + cmp ah,3 ;@64 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + mov ecx,1 shl 4 ;align = 01 + .set_alignment: + or ebp,ecx + mov ebx,24 ;ebx=writeback offset + jmp SIMD_INT_list_rn_rm_1.encode + .element: + or ebp,1 shl 23 + 2 shl 8 + mov ah,[simd_reg_list_count] + and ah,0x7f + cmp ah,3 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + mov edx,ebp + and edx,3 shl 6 + and ebp,not (3 shl 6) + shl edx,10-6 + or ebp,edx + mov ah,[simd_reg_list_count] + shr ah,7 + test [operand_register0],0xf0 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + cmp edx,1 shl 10 + movzx edx,[simd_reg_list_x] + ja .element.32 + jz .element.16 + ;element.8 + test [simd_reg_list_count],0x80 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + cmp edx,7 + mov ecx,ERROR_element_value_out_of_range.0_7 + ja ARM_post_process_simd_with_error + shl edx,4+1 + or ebp,edx + mov ebx,3 + jmp SIMD_INT_list_rn_rm_1.encode + .element.16: + cmp edx,3 + mov ecx,ERROR_element_value_out_of_range.0_3 + ja ARM_post_process_simd_with_error + shl edx,1 + or dl,ah + shl edx,4+1 + or ebp,edx + mov ebx,6 + jmp SIMD_INT_list_rn_rm_1.encode + .element.32: + cmp edx,1 + mov ecx,ERROR_element_value_out_of_range.0_1 + ja ARM_post_process_simd_with_error + shl edx,1 + or dl,ah + shl edx,4+2 + or ebp,edx + mov ebx,12 + jmp SIMD_INT_list_rn_rm_1.encode + .vector: + mov ecx,ERROR_register_list_invalid + test ebp,1 shl 21 ;VST3=0 + jz ARM_post_process_simd_with_error + or ebp,1 shl 23 + 0xe shl 8 + mov ah,[simd_reg_list_count] + and ah,0x7f + cmp ah,3 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + movzx edx,[simd_reg_list_count] + shr edx,7-5 + or ebp,edx ;set T bit + test [operand_register0],0xf0 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + mov ecx,ebp + shr ecx,6 + and ecx,3 + mov ebx,3 + shl ebx,cl + jmp SIMD_INT_list_rn_rm_1.encode + +SIMD_INT_list_rn_rm_4: + ;used by VLD4.8, VLD4.16, VLD4.32, VST4.8, VST4.16, VST4.32 + call decode_template + TEMPLATE \ + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right>,\ ;0={dy[x]},[rn] + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;1={dy[x]},[rn]! + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_base_reg>,\ ;2={dy[x]},[rn],rm + <TMPL_simd_reg_list,TMPL_bracket_left,TMPL_address_reg@,TMPL_bracket_right,TMPL_imm> ;3={dy[x]},[rn],imm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_ELEMENT + jz .element + cmp [simd_reg_list_type],SIMD_REG_LIST_TYPE_VECTOR + jz .vector + ;register + mov ah,[simd_reg_list_count] + or ecx,-1 + mov edx,0 shl 8 ;type = 0000 + cmp ah,4 + cmovz ecx,edx + mov edx,1 shl 8 ;type = 0001 + cmp ah,0x84 + cmovz ecx,edx + or ebp,ecx + inc ecx + mov ecx,ERROR_register_list_invalid + jz ARM_post_process_simd_with_error + mov ah,[operand_register0] ;rn + mov ecx,0 shl 4 ;align = 00 + shr ah,4 + jz .set_alignment + mov ecx,1 shl 4 ;align = 01 + cmp ah,3 ;@64 + jz .set_alignment + mov ecx,2 shl 4 ;align = 10 + cmp ah,4 ;@128 + jz .set_alignment + cmp ah,5 ;@256 + mov ecx,ERROR_alignment_invalid + jnz ARM_post_process_simd_with_error + mov ecx,3 shl 4 ;align = 11 + .set_alignment: + or ebp,ecx + mov ebx,32 + jmp SIMD_INT_list_rn_rm_1.encode + .element: + or ebp,1 shl 23 + 3 shl 8 + mov cl,[simd_reg_list_count] + test ebp,3 shl 6 ;.8? + setz ch + shl ch,7 + or ch,0x7f + and cl,ch + cmp cl,4 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + mov edx,ebp + and edx,3 shl 6 + and ebp,not (3 shl 6) + shl edx,10-6 + or ebp,edx + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 10 + movzx edx,[simd_reg_list_x] + ja .element.32 + jz .element.16 + ;element.8 + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + cmp edx,7 + mov ecx,ERROR_element_value_out_of_range.0_7 + ja ARM_post_process_simd_with_error + shl edx,2 + or dl,ah + shl edx,3 + or ebp,edx + mov ebx,4 + jmp SIMD_INT_list_rn_rm_1.encode + .element.16: + cmp ah,3 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + cmp edx,3 + mov ecx,ERROR_element_value_out_of_range.0_3 + ja ARM_post_process_simd_with_error + shl edx,1 + mov cl,[simd_reg_list_count] + shr cl,7 + or dl,cl + shl edx,1 + and ah,1 + xor ah,1 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,8 + jmp SIMD_INT_list_rn_rm_1.encode + .element.32: + cmp ah,4 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + cmp edx,1 + mov ecx,ERROR_element_value_out_of_range.0_1 + ja ARM_post_process_simd_with_error + shl edx,1 + mov cl,[simd_reg_list_count] + shr cl,7 + or dl,cl + shl edx,2 + inc ah + shr ah,1 + and ah,3 + or dl,ah + shl edx,4 + or ebp,edx + mov ebx,16 + jmp SIMD_INT_list_rn_rm_1.encode + .vector: + mov ecx,ERROR_register_list_invalid + test ebp,1 shl 21 ;VST4=0 + jz ARM_post_process_simd_with_error + or ebp,1 shl 23 + 0xf shl 8 + mov dl,[simd_reg_list_count] + mov dh,dl + and dx,0x7f80 + cmp dh,4 + mov ecx,ERROR_register_list_invalid + jnz ARM_post_process_simd_with_error + shr edx,7-5 + and edx,0x20 + or ebp,edx ;set T bit + mov edx,ebp + and edx,3 shl 6 + mov ah,[operand_register0] ;rn + shr ah,4 + cmp edx,1 shl 6 + movzx edx,ah + ja .vector.32 + jz .vector.16 + ;vector.8 + cmp ah,2 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + cmp ah,1 + mov ecx,ERROR_alignment_invalid + jz ARM_post_process_simd_with_error + shl edx,3 + or ebp,edx + mov ebx,4 + jmp SIMD_INT_list_rn_rm_1.encode + .vector.16: + cmp ah,3 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + and edx,1 + shl edx,4 + or ebp,edx + mov ebx,8 + jmp SIMD_INT_list_rn_rm_1.encode + .vector.32: + cmp ah,4 + mov ecx,ERROR_alignment_invalid + ja ARM_post_process_simd_with_error + dec ah + cmp ah,2 + mov ecx,ERROR_alignment_invalid + jb ARM_post_process_simd_with_error + and edx,4 + shl edx,6-2 + not ah + and ah,0x10 + or dl,ah + or ebp,edx + mov ebx,16 + jmp SIMD_INT_list_rn_rm_1.encode + +SIMD_INT_rn_list: + ;used by VLDMIA, VLDMDB, VSTMIA, VSTMDB + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfp_reg_list_s>,\ ;0=rn,{s..} + <TMPL_base_reg,TMPL_vfp_reg_list_d>,\ ;1=rn,{d..} + <TMPL_base_reg!,TMPL_vfp_reg_list_s>,\ ;2=rn!,{s..} + <TMPL_base_reg!,TMPL_vfp_reg_list_d> ;3=rn!,{d..} + shr al,1 + jnc VFP_rn_list_s.do + or ebp,1 shl 8 + jmp VFP_rn_list_d.do + +SIMD_INT_vd_rn_offset: + ;used by VLDR, VSTR + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=sd,[rn] + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=sd,[rn,imm] + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;2=sd,[imm] PC relative + <TMPL_vfps_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;3=sd,[exp] implicit reg from structure + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;4=dd,[rn] + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;5=dd,[rn,imm] + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_address,TMPL_bracket_right>,\ ;6=dd,[imm] PC relative + <TMPL_vfpd_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;7=dd,[exp] implicit reg from structure + cmp al,3 + jbe VFP_sd_rn_offset.do + or ebp,1 shl 8 + sub al,4 + jmp VFP_dd_rn_offset.do + +SIMD_INT_vd_vn_vmx: + ;used by VMLA.S16, VMLA.S32, VMLA.U16, VMLA.U32, VMLA.I16, VMLA.I32, + ; VMLS.S16, VMLS.S32, VMLS.U16, VMLS.U32, VMLS.I16, VMLS.I32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;1=dd,dn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;2=qd,qn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_vfpdx_reg> ;3=qd,qn,dm[x] + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + shr al,1 + jnc SIMD_INT_vd_vn_vm.encode + mov ecx,ebp + and ebp,0x00300000 + and ecx,0x01000000 + or ebp,0xf2800040 + shr ecx,24-10 + or ebp,ecx + .encode: + mov dl,[operand_register2] + shr dl,1 + sbb cl,cl + and cl,0x10 + or dl,cl + mov [operand_register2],dl + movzx eax,al + shl eax,24 + or ebp,eax ;set Q + mov ecx,ebp + shr ecx,21 + and ecx,1 ;ecx=1 for size .32 + mov eax,3 + mov edx,8 + shr eax,cl ;eax=maximum index value + shl edx,cl ;edx=maximum register + 1 + test ecx,ecx + mov ecx,ERROR_element_value_out_of_range.0_1 + mov ebx,ERROR_element_value_out_of_range.0_3 + cmovz ecx,ebx + cmp [immediate_value],eax + ja ARM_post_process_simd_with_error + mov ecx,ERROR_scalar_register_out_of_range.0_7 + mov ebx,ERROR_scalar_register_out_of_range.0_15 + cmp edx,8 + cmovnz ecx,ebx + cmp [operand_register2],dl + jae ARM_post_process_simd_with_error + shr edx,4 + mov ecx,edx + mov eax,[immediate_value] + shl eax,cl + mov edx,eax + and edx,1 + shl edx,3 + or dl,[operand_register2] + shr eax,2 + rcl edx,1 + mov [operand_register2],dl + xor eax,eax + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_FLOAT_vd_vn_vmx_f32: + ;used by VMLA.F32, VMLS.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;1=dd,dn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;2=qd,qn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_vfpdx_reg>,\;3=qd,qn,dm[x] + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;4=sd,sn,sm + cmp al,4 + jae .vfp_alias + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + shr al,1 + jnc SIMD_INT_vd_vn_vm.encode + and ebp,0x00200000 + shr ebp,21-10 + or ebp,0xf2a00140 + jmp SIMD_INT_vd_vn_vmx.encode + .vfp_alias: + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + mov al,1 + jmp VFP_sd_sn_sm.v1xd_test + +SIMD_INT_vd_vn_vmx_long: + ;used by VMLAL.S16, VMLAL.S32, VMLAL.U16, VMLAL.U32, VMLSL.S16, VMLSL.S32, VMLSL.U16, VMLSL.U32, + ; VMULL.S16, VMULL.S32, VMULL.U16, VMULL.U32, VQDMLAL.S16, VQDMLAL.S32, VQDMLSL.S16, VQDMLSL.S32, + ; VQDMULL.S16, VQDMULL.S32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=qd,dn,dm + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_vfpdx_reg> ;1=qd,dn,dm[x] + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + shr al,1 + jnc SIMD_INT_vd_vn_vm.encode + mov ebp,[thumb32_instruction] + jmp SIMD_INT_vd_vn_vmx.encode + +SIMD_INT_vd_imm_i8: + ;used by VMOV.I8, VMOV.I64 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_imm>,\ ;0=qd,imm + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,imm + mov ecx,[immediate_value] + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + jmp SIMD_INT_vd_imm.out_of_range + +SIMD_INT_vd_imm_i16: + ;used by VMOV.I16, VMVN.I16 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_imm>,\ ;0=qd,imm + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,imm + mov ecx,[immediate_value] + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + xor ebp,0x00000200 ;cmode=a + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + xor ebp,1 shl 5 + 0x00000200 ;cmode=8, invert op, VMVN<-->VMOV + mov ecx,[immediate_value] + not cx + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + xor ebp,0x00000200 ;cmode=a + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + jmp SIMD_INT_vd_imm.out_of_range + +SIMD_INT_vd_imm_i32: + ;used by VMOV.I32, VMVN.I32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_imm>,\ ;0=qd,imm + <TMPL_vfpd_reg,TMPL_imm> ;1=dd,imm + mov ecx,[immediate_value] + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=2 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=4 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=6 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000600 ;cmode=c + ror ecx,8+8 + xor ecx,0xff000000 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000100 ;cmode=d + ror ecx,8 + xor ecx,0xff000000 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + xor ebp,1 shl 5 + 0x00000d00 ;cmode=0, invert op, VMVN<-->VMOV + mov ecx,[immediate_value] + not ecx + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=2 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=4 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000200 ;cmode=6 + ror ecx,8 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000600 ;cmode=c + ror ecx,8+8 + xor ecx,0xff000000 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + add ebp,0x00000100 ;cmode=d + ror ecx,8 + xor ecx,0xff000000 + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + jmp SIMD_INT_vd_imm.out_of_range + +SIMD_FLOAT_dm_imm: + ;used by VMOV.F64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm_float>,\ ;0=dd,float + <TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg> ;2=dd,dm + cmp al,2 + jb VFP_dm_imm.vesion_test + or ebp,0x00000040 ;FCPYD + jmp VFP_dd_dm.encode + +SIMD_FLOAT_sm_imm: + ;used by VMOV.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_imm_float>,\ ;0=sd,float + <TMPL_vfps_reg,TMPL_imm>,\ ;1=sd,imm + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;2=sd,sm + <TMPL_simd_qreg,TMPL_imm_float>,\ ;3=qd,float + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qd,imm + <TMPL_vfpd_reg,TMPL_imm_float>,\ ;5=dd,float + <TMPL_vfpd_reg,TMPL_imm> ;6=dd,imm + cmp al,2 + jb VFP_dm_imm.do + lea ebp,[ebp+0x00000040] ;FCPYS + jz VFP_sd_sm.v1xd_test + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + sub al,3 + shr al,1 + movzx ebp,al + jc .constant_converted + call VFP_convert_single_to_quarter + .constant_converted: + mov eax,ebp + mov ebp,[thumb32_instruction] + mov ecx,[immediate_value] + test ecx,not 0xff + jz SIMD_INT_vd_imm.encode + jmp SIMD_INT_vd_imm.out_of_range + +SIMD_INT_rd_dnx: + ;used by VMOV.S8, VMOV.S16, VMOV.U8, VMOV.U16 + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_vfpdx_reg> ;0=rd,dn[x] + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + mov edx,[immediate_value] + mov ecx,ebp + shr ecx,5 + and ecx,1 + shl edx,cl + test ecx,ecx + mov ecx,ERROR_element_value_out_of_range.0_3 + mov ebx,ERROR_element_value_out_of_range.0_7 + cmovz ecx,ebx + cmp edx,7 + ja ARM_post_process_simd_with_error + mov ecx,edx + and edx,3 + and ecx,4 + shl edx,5 + shl ecx,21-2 + or ebp,edx + or ebp,ecx + test [code_type],CPU_ACTIVITY_ARM + jnz VFP_rd_dn.encode + movzx eax,[operand_register0] ;rd + cmp eax,13 ;SP? + jz ERROR_r13_not_valid + jmp VFP_rd_dn.encode + +SIMD_INT_ddx_rn: + ;used by VMOV.8, VMOV.16 + call decode_template + TEMPLATE \ + <TMPL_vfpdx_reg,TMPL_base_reg> ;0=dd[x],rn + mov ax,word[operand_registers+0] + xchg ah,al + mov word[operand_registers+0],ax + jmp SIMD_INT_rd_dnx.do + +SIMD_INT_rdd_rdn: + ;used by VMOV.32 + call decode_template + TEMPLATE \ + <TMPL_vfpdx_reg,TMPL_base_reg>,\ ;0=dd[x],rn + <TMPL_base_reg,TMPL_vfpdx_reg> ;1=rd,dn[x] + .do: + movzx eax,al + mov cx,word[operand_registers+0] + mov dx,cx + xchg ch,cl + shl eax,20 + cmovz ecx,edx + mov word[operand_registers+0],cx + or ebp,eax + mov edx,[immediate_value] + cmp edx,1 + mov ecx,ERROR_element_value_out_of_range.0_1 + ja ARM_post_process_simd_with_error + shl edx,21 + or ebp,edx + test [code_type],CPU_ACTIVITY_ARM + jnz VFP_dn_rd.test_version + movzx eax,[operand_register0] ;rd + cmp eax,13 ;SP? + jz ERROR_r13_not_valid + jmp VFP_dn_rd.test_version + + align 4 +SIMD_INT_MOV_table: + dd 0x0e000a10,VFP_sn_rd.do,0 ;0=FMSR + dd 0x0c400a10,SIMD_INT_MOV.msrr,0 ;1=FMSRR + dd 0x0e000b10,SIMD_INT_rdd_rdn.do,0 ;2=VMOV.32 + dd 0xf2200110,SIMD_INT_MOV.vd_vm,0 ;3=dd,dn + dd 0x0c400b10,VFP_dm_rd_rn.test_version,0 ;4=FMDRR + dd 0x0e000b10,SIMD_INT_rdd_rdn.do,1 ;5=VMOV.32 + dd 0x0e100a10,VFP_rd_dn.do,0 ;6=FMRS + dd 0x0c500a10,SIMD_INT_MOV.mrrs,0 ;7=FMRRS + dd 0x0c500b10,VFP_rd_rn_dm.test_version,0 ;8=FMRRD + dd 0xf2200150,SIMD_INT_MOV.vd_vm,0 ;9=qd,qn + +SIMD_INT_MOV: + ;used by VMOV + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_base_reg>,\ ;0=sn,rd + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_base_reg,TMPL_base_reg>,\ ;1=sd1,sd2,rn1,rn2 + <TMPL_vfpdx_reg,TMPL_base_reg>,\ ;2=dd[x],rn + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn + <TMPL_vfpd_reg,TMPL_base_reg,TMPL_base_reg>,\ ;4=dd,rn1,rn2 + <TMPL_base_reg,TMPL_vfpdx_reg>,\ ;5=rd,dn[x] + <TMPL_base_reg,TMPL_vfps_reg>,\ ;6=rd,sn + <TMPL_base_reg,TMPL_base_reg,TMPL_vfps_reg,TMPL_vfps_reg>,\ ;7=rd1,rd2,sn1,sn2 + <TMPL_base_reg,TMPL_base_reg,TMPL_vfpd_reg>,\ ;8=rd1,rd2,dn + <TMPL_simd_qreg,TMPL_simd_qreg> ;9=qd,qn + movzx eax,al + imul eax,12 + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[eax+SIMD_INT_MOV_table+0] + mov ecx,[eax+SIMD_INT_MOV_table+4] + mov eax,[eax+SIMD_INT_MOV_table+8] + jmp vcx + .msrr: + xor edx,edx + movzx ecx,[operand_register0] + bts edx,ecx + movzx ecx,[operand_register1] + bts edx,ecx + mov [reg_list_bitmap],edx + mov ecx,[operand_registers] + shr ecx,16 + mov [operand_registers],ecx + jmp VFP_rd_rn_sm.do + .mrrs: + xor edx,edx + movzx ecx,[operand_register2] + bts edx,ecx + movzx ecx,[operand_register3] + bts edx,ecx + mov [reg_list_bitmap],edx + jmp VFP_rd_rn_sm.do + .vd_vm: + mov cl,[operand_register1] + mov [operand_register2],cl + jmp SIMD_INT_vd_vn_vm.int_test + +SIMD_INT_qd_dm: + ;used by VMOVL.S8, VMOVL.S16, VMOVL.S32, VMOVL.U8, VMOVL.U16, VMOVL.U32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg> ;0=qd,dm + jmp SIMD_INT_vd_vm.int_test + +SIMD_INT_dd_qm: + ;used by VMOVN.I8, VMOVN.I16, VMOVN.I32, VQMOVN.S16, VQMOVN.S32, VQMOVN.S64, VQMOVN.U16, + ; VQMOVN.U32, VQMOVN.U64, VQMOVUN.S16, VQMOVUN.S32, VQMOVUN.S64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_simd_qreg> ;0=dd,qm + jmp SIMD_INT_vd_vm.int_test + +SIMD_INT_vd_vn_vmx_alt: + ;used by VMUL.I16, VMUL.I32, VQDMULH.S16, VQDMULH.S32, VQRDMULH.S16, VQRDMULH.S32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;0=ddn,dm[x] + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;1=dd,dn,dm[x] + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_vfpdx_reg>,\ ;4=qdn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_vfpdx_reg>,\;5=qd,qn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_INT + jz ERROR_requires_copro_capability_simd_int + .do: + shr al,1 + jc .registers_okay + mov cx,word[operand_registers+0] + mov word[operand_registers+1],cx + .registers_okay: + shr al,1 + jc SIMD_INT_vd_vn_vm.encode + mov ebp,[thumb32_instruction] + jmp SIMD_INT_vd_vn_vmx.encode + +SIMD_FLOAT_vd_vn_vmx_alt_f32: + ;used by VMUL.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;0=ddn,dm[x] + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpdx_reg>,\ ;1=dd,dn,dm[x] + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;2=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_vfpdx_reg>,\ ;4=qdn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_vfpdx_reg>,\;5=qd,qn,dm[x] + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;6=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;7=qd,qn,qm + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;8=sdn,sm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;9=sd,sn,sm + cmp al,8 + jae .vfp_alias + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + mov [thumb32_instruction],0xf2a00940 ;scalar + jmp SIMD_INT_vd_vn_vmx_alt.do + .vfp_alias: + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + sub al,8 + jmp VFP_sd_sn_sm.v1xd_test + +SIMD_INT_dd_dn_dm_alt: + ;used by VPADD.I8, VPADD.I16, VPADD.I32, VPMAX.S8, VPMAX.S16, VPMAX.S32, VPMAX.U8, VPMAX.U16, VPMAX.U32 + ; VPMIN.S8, VPMIN.S16, VPMIN.S32, VPMIN.U8, VPMIN.U16, VPMIN.U32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;1=dd,dn,dm + jmp SIMD_INT_vd_vn_vm_alt.encode + +SIMD_FLOAT_dd_dn_dm_alt: + ;used by VPADD.F32, VPMAX.F32, VPMIN.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;1=dd,dn,dm + jmp SIMD_FLOAT_vd_vn_vm_alt.float_test + +SIMD_INT_list: + ;used by VPOP, VPUSH + call decode_template + TEMPLATE \ + <TMPL_vfp_reg_list_s>,\ ;0={s..} + <TMPL_vfp_reg_list_d> ;1={d..} + cmp al,0 + mov [operand_register0],13 ;SP + mov al,1 ;rn! + jz VFP_rn_list_s.do + or ebp,0x00000100 + jmp VFP_rn_list_d.do + +SIMD_INT_list.32: + ;used by VPOP, VPUSH + call decode_template + TEMPLATE \ + <TMPL_vfp_reg_list_s> ;0={s..} + mov [operand_register0],13 ;SP + mov al,1 ;rn! + jmp VFP_rn_list_s.do + +SIMD_INT_list.64: + ;used by VPOP, VPUSH + call decode_template + TEMPLATE \ + <TMPL_vfp_reg_list_d> ;0={d..} + mov [operand_register0],13 ;SP + mov al,1 ;rn! + jmp VFP_rn_list_d.do + +SIMD_INT_dd_qm_imm: + ;used by VQRSHRN.S16, VQRSHRN.S32, VQRSHRN.S64, VQRSHRN.U16, VQRSHRN.U32, VQRSHRN.U64, + ; VQRSHRUN.S16, VQRSHRUN.S32, VQRSHRUN.S64, VQSHRN.S16, VQSHRN.S32, VQSHRN.S64, + ; VQSHRN.U16, VQSHRN.U32, VQSHRN.U64, VQSHRUN.S16, VQSHRUN.S32, VQSHRUN.S64, + ; VRSHRUN.I16, VRSHRUN.I32, VRSHRUN.I64, VSHRN.I16, VSHRN.I32, VSHRN.I64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_simd_qreg,TMPL_imm> ;0=dd,qm,imm + .encode: + mov ecx,ebp + mov edx,ebp + shr ecx,16 + shr edx,7-6 + and ecx,0x3f + and edx,0x40 + or ecx,edx + mov edx,ecx + sub ecx,[immediate_value] + shl ecx,16 + or ebp,ecx + shr ecx,16 + dec edx + not edx + test ecx,edx + jz SIMD_INT_vd_vm.int_test + mov ecx,ERROR_shift_value_out_of_range.1_8 + mov eax,ERROR_shift_value_out_of_range.1_16 + test edx,1 shl 3 + cmovz ecx,eax + mov eax,ERROR_shift_value_out_of_range.1_32 + test edx,1 shl 4 + cmovz ecx,eax + mov eax,ERROR_shift_value_out_of_range.1_64 + test edx,1 shl 5 + cmovz ecx,eax + jmp ARM_post_process_simd_with_error + +SIMD_INT_vd_vn_vm_imm_alt: + ;used by VQSHL.S8, VQSHL.S16, VQSHL.S32, VQSHL.S64, VQSHL.U8, VQSHL.U16, VQSHL.U32, VQSHL.U64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=ddn,dm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;2=dd,dm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;3=dd,dn,dm + <TMPL_simd_qreg,TMPL_imm>,\ ;4=qdm,imm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;5=qdn,qm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm>,\ ;6=qd,qm,imm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;7=qd,qn,qm + shr al,1 + jc SIMD_INT_vd_vn_vm_alt.encode + mov ebp,[thumb32_instruction] + .encode: + shr al,1 + jc .registers_okay + mov cl,[operand_register0] + mov [operand_register1],cl + .registers_okay: + mov ecx,ebp + mov edx,ebp + shr ecx,16 + shr edx,7-6 + and ecx,0x3f + and edx,0x40 + or edx,ecx + mov ecx,[immediate_value] + shl ecx,16 + or ebp,ecx + cmp edx,[immediate_value] + ja SIMD_INT_vd_vm.int_test + mov ecx,ERROR_shift_value_out_of_range.0_7 + mov eax,ERROR_shift_value_out_of_range.0_15 + test edx,1 shl 4 + cmovnz ecx,eax + mov eax,ERROR_shift_value_out_of_range.0_31 + test edx,1 shl 5 + cmovnz ecx,eax + mov eax,ERROR_shift_value_out_of_range.0_63 + test edx,1 shl 6 + cmovnz ecx,eax + jmp ARM_post_process_simd_with_error + +SIMD_INT_vd_vm_imm_alt: + ;used by VQSHLU.S8, VQSHLU.S16, VQSHLU.S32, VQSHLU.S64, + ; VSHL.I8, VSHL.I16, VSHL.I32, VSHL.I64, VSLI.8, VSLI.16, VSLI.32, VSLI.64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,imm + <TMPL_simd_qreg,TMPL_imm>,\ ;2=qdm,imm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm> ;3=qd,qm,imm + jmp SIMD_INT_vd_vn_vm_imm_alt.encode + +SIMD_INT_vd_vm_imm_alt_neg: + ;used by VRSHR.S8, VRSHR.S16, VRSHR.S32, VRSHR.S64, VRSHR.U8, VRSHR.U16, VRSHR.U32, VRSHR.U64, + ; VRSRA.S8, VRSRA.S16, VRSRA.S32, VRSRA.S64, VRSRA.U8, VRSRA.U16, VRSRA.U32, VRSRA.U64, + ; VSHR.S8, VSHR.S16, VSHR.S32, VSHR.S64, VSHR.U8, VSHR.U16, VSHR.U32, VSHR.U64, + ; VSRA.S8, VSRA.S16, VSRA.S32, VSRA.S64, VSRA.U8, VSRA.U16, VSRA.U32, VSRA.U64, + ; VSRI.8, VSRI.16, VSRI.32, VSRI.64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_imm>,\ ;0=ddm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm>,\ ;1=dd,dm,imm + <TMPL_simd_qreg,TMPL_imm>,\ ;2=qdm,imm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_imm> ;3=qd,qm,imm + shr al,1 + jc .registers_okay + mov cl,[operand_register0] + mov [operand_register1],cl + .registers_okay: + jmp SIMD_INT_dd_qm_imm.encode + +SIMD_FLOAT_vd_vm: + ;used by VRECPE.F32, VRSQRTE.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_simd_qreg,TMPL_simd_qreg> ;1=qd,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_FLOAT + jz ERROR_requires_copro_capability_simd_float + jmp SIMD_INT_vd_vm.encode + +SIMD_INT_qd_dm_imm: + ;used by VSHLL.S8, VSHLL.S16, VSHLL.S32, VSHLL.U8, VSHLL.U16, VSHLL.U32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_imm> ;0=qd,qm,imm + mov ecx,[immediate_value] + mov edx,ebp + and edx,0x3f shl 16 + rol ecx,16 + or ebp,ecx + cmp ecx,edx ;imm=size? + jz .imm_eq_size + dec edx + and edx,0x3f shl 16 + not edx + test ecx,edx + jz SIMD_INT_vd_vm.int_test + mov ecx,ERROR_shift_value_out_of_range.0_8 + mov eax,ERROR_shift_value_out_of_range.0_16 + test edx,1 shl (3+16) + cmovz ecx,eax + mov eax,ERROR_shift_value_out_of_range.0_32 + test edx,1 shl (4+16) + cmovz ecx,eax + jmp ARM_post_process_simd_with_error + .imm_eq_size: + mov ebp,[thumb32_instruction] + jmp SIMD_INT_vd_vm.int_test + +SIMD_INT_qd_dm_imm_I: + ;used by VSHLL.I8, VSHLL.I16, VSHLL.I32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_imm> ;0=qd,qm,imm + mov ecx,ebp + shr ecx,18 + and ecx,3 + mov edx,8 + shl edx,cl + mov ecx,[immediate_value] + cmp ecx,edx ;imm=size? + jz SIMD_INT_vd_vm.int_test + mov ecx,ERROR_shift_value_out_of_range.8 + mov eax,ERROR_shift_value_out_of_range.16 + cmp edx,16 + cmovz ecx,eax + mov eax,ERROR_shift_value_out_of_range.32 + cmp edx,32 + cmovz ecx,eax + jmp ARM_post_process_simd_with_error + +SIMD_dn_list_dm: + ;used by VTBL.8, VTBX.8 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfp_reg_list_d,TMPL_comma,TMPL_vfpd_reg> ;0=dd,{dn,..},dm + mov edx,[reg_list_bitmap] + bsf eax,edx + bsr ecx,edx + ;check for a contiguous set + xor ecx,31 + shl edx,cl + add ecx,eax + sar edx,cl + inc edx + mov ecx,ERROR_non_contiguous_set + jnz ARM_post_process_simd_with_error + mov ecx,[reg_list_bitmap] + bsf eax,ecx ;eax=start register + bsr edx,ecx + sub edx,eax ;edx=register count - 1 + cmp edx,3 + mov ecx,ERROR_register_list_invalid ;too many registers + ja ARM_post_process_simd_with_error + shl edx,8 + or ebp,edx + mov cl,[operand_register1] ;dm + mov [operand_register2],cl ;dm + add eax,eax + mov ah,al + shr ah,5 + and ax,0x011e + or al,ah + mov [operand_register1],al ;dn + xor eax,eax + jmp SIMD_INT_vd_vn_vm.int_test + +SIMD_FLOAT_dd_sm_CVT: + ;used by VCVT.F64.S32, VCVT.F64.U32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfps_reg>,\ ;0=dd,sm + <TMPL_vfpd_reg,TMPL_imm>,\ ;1=ddm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm> ;2=dd,dm,imm + sub al,1 + jc VFP_dd_sm.do + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + jmp VFP_dd_dd_imm.test_version + +SIMD_FLOAT_sd_dm_CVT: + ;used by VCVT.S32.F64, VCVT.U32.F64, + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfpd_reg>,\ ;0=sd,dm + <TMPL_vfpd_reg,TMPL_imm>,\ ;1=ddm,imm + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_imm> ;2=dd,dm,imm + sub al,1 + jc VFP_sd_dm.do + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + jmp VFP_dd_dd_imm.test_version + +VFP_FLOAT_dd_dn_dm: + ;used by FMACD, FNMACD, FMSCD, FNMSCD, VNMLA.F64, VNMLS.F64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=dd,dn,dm + mov al,1 + jmp VFP_dd_dn_dm.begin + +VFP_FLOAT_sd_sn_sm: + ;used by FMACS, FNMACS, FMSCS, FNMSCS, VNMLA.F32, VNMLS.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sn,sm + mov al,1 + jmp VFP_sd_sn_sm.v1xd_test + +;VFPv4 and SIMDv2 + +SIMD_FLOAT_vd_vn_vm: + ;used by VFMA.F32, VFMS.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;1=qd,qn,qm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;2=sd,sn,sm + cmp al,2 + jb .simdv2_test + .vfpv4_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_V4 + jz ERROR_requires_copro_capability_vfp_v4 + movzx ebp,[instruction_condition] + and ebp,0xf0 + shl ebp,28-4 + or ebp,[thumb32_instruction] + jmp VFP_sd_sn_sm.registers_shifted + .simdv2_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_V2 + jz ERROR_requires_copro_capability_simd_v2 + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_FLOAT_dd_dn_dm: + ;used by VFMA.F64, VFMS.F64, VFNMA.F64, VFNMS.F64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=dd,dn,dm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_VFP_D32 + jnz SIMD_FLOAT_vd_vn_vm.vfpv4_test + mov edx,[operand_registers] ;fd,fn,fm + test edx,0x010101 + jnz ERROR_requires_copro_capability_vfp_d32 + mov al,1 + jmp SIMD_FLOAT_vd_vn_vm.vfpv4_test + +SIMD_FLOAT_sd_sn_sm: + ;used by VFNMA.F32, VFNMS.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sn,sm + mov al,1 + jmp SIMD_FLOAT_vd_vn_vm.vfpv4_test + +;v7VE + +ARM_eret: + ;used by ERET + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_VE + jz ERROR_requires_cpu_capability_arm_ve + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_eret + jmp ARM_store_instruction + .THUMB_eret: + or [thumb_flags_16],THUMB_FLAG_ONLY_LAST_IT + or [thumb_flags_32],THUMB_FLAG_ONLY_LAST_IT + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_immediate16_ve: + ;used by HVC + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_VE + jz ERROR_requires_cpu_capability_arm_ve + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB + mov eax,[immediate_value] + cmp eax,0x0000ffff + ja .out_of_range + mov ecx,eax + and eax,0xf + and ecx,0xfff0 + shl ecx,4 + or eax,ecx + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0xffff + jmp ARM_store_instruction_with_error + .THUMB: + or [thumb_flags_16],THUMB_FLAG_NOT_INSIDE_IT + or [thumb_flags_32],THUMB_FLAG_NOT_INSIDE_IT + mov [thumb32_error],ERROR_immediate_offset_out_of_range.0_0xffff + mov eax,[immediate_value] + cmp eax,0xffff + ja THUMB_post_process + mov ecx,eax + and eax,0xfff + and ecx,0xf000 + shl ecx,4 + or eax,ecx + or [thumb32_instruction],eax + mov [thumb32_error],0 + jmp THUMB_post_process + +;v8 + +ARM_immediate16_v8: + ;used by HLT + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_immediate6 + mov eax,[immediate_value] + cmp eax,0x0000ffff + ja .out_of_range + mov ecx,eax + and eax,0xf + and ecx,0xfff0 + shl ecx,4 + or eax,ecx + or ebp,eax + jmp ARM_store_instruction + .out_of_range: + mov ecx,ERROR_immediate_offset_out_of_range.0_0xffff + jmp ARM_store_instruction_with_error + .THUMB_immediate6: + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + mov [thumb16_error],ERROR_immediate_offset_out_of_range.0_0x3f + mov eax,[immediate_value] + cmp eax,0x3f + ja THUMB_post_process + or ax,0xba80 + mov [thumb16_instruction],ax + mov [thumb16_error],0 + jmp THUMB_post_process + +ARM_rt_q_rn_p: + ;used by STL, STLB, STLH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right> ;0=reg,[reg] + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rt_q_rn_p + movzx eax,[operand_register0] ;rt + cmp eax,15 + jz ERROR_r15_not_valid.first + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + jmp ARM_store_instruction + .THUMB_rt_q_rn_p: + mov cl,0x03 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rt + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rt_q_rn_p_STLEX: + ;used by STLEX, STLEXB, STLEXH + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,rm,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=rd,rm,[rn,imm] + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=rd,rm,[exp] + mov ecx,ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz ARM_store_instruction_with_error + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rt_q_rn_p_STLEX + movzx eax,[operand_register0] ;rd + cmp eax,0xf + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rt + cmp eax,0xf + jz ERROR_r15_not_valid.second + or ebp,eax + movzx eax,[operand_register2] ;rn + cmp eax,0xf + jz ERROR_r15_not_valid.third + shl eax,16 + or ebp,eax + mov al,[operand_register0] ;rd + mov ah,[operand_register1] ;rt + mov cl,[operand_register2] ;rn + cmp al,cl + jz ERROR_dest_cannot_be_source_or_memory_address + cmp al,ah + jz ERROR_dest_cannot_be_source_or_memory_address + jmp ARM_store_instruction + .THUMB_rd_rt_q_rn_p_STLEX: + mov ebp,[thumb32_instruction] + mov cl,0x07 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov [thumb32_error],ERROR_dest_cannot_be_source_or_memory_address + movzx eax,[operand_register0] ;rd + movzx ecx,[operand_register1] ;rt + movzx edx,[operand_register2] ;rn + cmp eax,ecx + jz THUMB_post_process + cmp eax,edx + jz THUMB_post_process + or ebp,eax + shl ecx,12 + or ebp,ecx + shl edx,16 + or ebp,edx + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +ARM_rd_rt_rt2_q_rn_p_STLEXD: + ;used by STLEXD + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right>,\ ;0=rd,rt,[rn] + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg,TMPL_bracket_left,TMPL_base_reg,TMPL_bracket_right> ;1=rd,rt,rt2,[rn] + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + test [code_type],CPU_ACTIVITY_ARM + jz ARM_rd_rt_rt2_q_rn_p.THUMB_adjust_three_to_four + mov ecx,[operand_registers] ;rd,rt,rt2,rn + cmp al,1 + jnz .check_rt + mov eax,ecx + shr eax,8 + sub ah,1 + cmp ah,al + jnz ERROR_source_registers_must_be_consecutive + mov eax,ecx + shr ecx,8 + mov ch,cl + mov cl,al + .check_rt: + test ch,1 + jnz ERROR_source_register_must_be_even + cmp ch,14 + jz ERROR_r14_not_valid.second + mov [operand_registers],ecx ;rd,rt,rn + inc ch + cmp ch,cl + jz ERROR_source_and_dest_must_differ + jmp ARM_rd_rm_q_rn_p_STREX.version_okay + +THUMB_v8: + ;used by DCPS1, DCPS2, DCPS3 + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [code_type],CPU_ACTIVITY_ARM + jnz ERROR_instruction_not_32bit + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_V8 + jz ERROR_requires_cpu_capability_arm_v8 + mov [thumb32_error],0 + jmp THUMB_post_process + +SIMD_sd_sm: + ;used by VCVTM.S32.F32, VCVTM.U32.F32, VCVTN.S32.F32, VCVTN.U32.F32, VCVTP.S32.F32, VCVTP.U32.F32, VCVTA.S32.F32, VCVTA.U32.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg>,\ ;0=sd,sm + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;1=dd,dm + <TMPL_simd_qreg,TMPL_simd_qreg> ;2=qd,qm + .do: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_V8 + jz ERROR_requires_copro_capability_simd_v8 + cmp al,0 + jz .encode + mov ebp,[thumb32_instruction] ;get the SIMD encoding + cmp al,2 + jnz .encode + or ebp,1 shl 6 ;set the Q bit + .encode: + movzx eax,[operand_register0] ;fd + xor ecx,ecx + shr eax,1 + setc cl + shl eax,12 + shl ecx,22 + or ebp,eax + or ebp,ecx + movzx eax,[operand_register1] ;fm + xor ecx,ecx + shr eax,1 + setc cl + shl ecx,5 + or ebp,eax + or ebp,ecx + xor ecx,ecx ;clear the error code + test [code_type],CPU_ACTIVITY_ARM + jnz ARM_store_instruction + cmp ebp,0xf0000000 + jb ARM_post_process_copro.thumb + jmp ARM_post_process_simd + +SIMD_sd_dm: + ;used by VCVTM.S32.F64, VCVTM.U32.F64, VCVTN.S32.F64, VCVTN.U32.F64, VCVTP.S32.F64, VCVTP.U32.F64, VCVTA.S32.F64, VCVTA.U32.F64 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfpd_reg> ;0=sd,dm + jmp SIMD_sd_sm.do + +VFP_sd_dm_HP: + ;used by VCVTB.F16.F64, VCVTT.F16.F64 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfpd_reg> ;0=sd,dm + jmp SIMD_sd_sm.do + +VFP_dd_sm_HP: + ;used by VCVTB.F64.F16, VCVTT.F64.F16 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfps_reg> ;0=dd,sm + jmp SIMD_sd_sm.do + +SIMD_FLOAT_vd_vn_vm_v8: + ;used by VMAXNM.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dn,dm + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg>,\;1=qd,qn,qm + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;2=sd,sn,sm + .v8_test: + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_V8 + jz ERROR_requires_copro_capability_simd_v8 + cmp al,2 + jz .encode + mov ebp,[thumb32_instruction] ;get the SIMD encoding + test [code_type],CPU_ACTIVITY_ARM + jnz .encode + ;in THUMB mode no v8 SIMD instructions can be conditional + mov ah,[instruction_condition] + and ah,0xf0 + cmp ah,0xe0 + jb ERROR_instruction_not_conditional + .encode: + and al,1 ;extract the Q bit + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_FLOAT_sd_sn_sm_v8: + ;used by VSELEQ.F32, VSELVS.F32, VSELGE.F32, VSELGT.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sn,sm + jmp SIMD_FLOAT_vd_vn_vm_v8.v8_test + +SIMD_FLOAT_dd_dn_dm_v8: + ;used by VMAXNM.F64, VSELEQ.F64, VSELVS.F64, VSELGE.F64, VSELGT.F64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=dd,dn,dm + jmp SIMD_FLOAT_vd_vn_vm_v8.v8_test + +SIMD_FLOAT_vd_vn_v8: + ;used by VRINTM.F32.F32, VRINTN.F32.F32, VRINTP.F32.F32, VRINTA.F32.F32, VRINTX.F32.F32, VRINTZ.F32.F32 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg>,\ ;0=dd,dm + <TMPL_simd_qreg,TMPL_simd_qreg>,\ ;1=qd,qm + <TMPL_vfps_reg,TMPL_vfps_reg> ;2=sd,sm + .do: + mov cl,[operand_register1] + mov [operand_register1],0 + mov [operand_register2],cl + jmp SIMD_FLOAT_vd_vn_vm_v8.v8_test + +SIMD_FLOAT_sd_sn_v8: + ;used by VRINTR.F32.F32 + call decode_template + TEMPLATE \ + <TMPL_vfps_reg,TMPL_vfps_reg> ;0=sd,sm + mov al,2 + jmp SIMD_FLOAT_vd_vn_v8.do + +SIMD_FLOAT_dd_dn_v8: + ;used by VRINTM.F64.F64, VRINTN.F64.F64, VRINTP.F64.F64, VRINTA.F64.F64, VRINTX.F64.F64, VRINTR.F64.F64, VRINTZ.F64.F64 + call decode_template + TEMPLATE \ + <TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=dd,dm + mov al,2 + jmp SIMD_FLOAT_vd_vn_v8.do + +ARM_rd_rn_rm_crc: + ;used by CRC32B + call decode_template + TEMPLATE \ + <TMPL_base_reg,TMPL_base_reg,TMPL_base_reg> ;0=reg,reg,reg + test [cpu_capability_flags],1 shl CPU32_CAPABILITY_CRC + jz ERROR_requires_cpu_capability_crc + test [code_type],CPU_ACTIVITY_ARM + jz .THUMB_rd_rn_rm + movzx eax,[operand_register0] ;rd + cmp eax,15 + jz ERROR_r15_not_valid.first + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] ;rn + cmp eax,15 + jz ERROR_r15_not_valid.second + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + cmp eax,15 + jz ERROR_r15_not_valid.third + or ebp,eax + and ebp,not 0x10000000 ;force to 0xE... opcode + jmp ARM_store_instruction + .THUMB_rd_rn_rm: + mov cl,0x07 + call THUMB2_check_bad_regs + jc THUMB_post_process + mov ebp,[thumb32_instruction] + movzx eax,[operand_register0] ;rd + shl eax,8 + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] ;rm + or ebp,eax + mov [thumb32_instruction],ebp + mov [thumb32_error],0 + jmp THUMB_post_process + +SIMD_CRYPTO_qd_qm: + ;used by AESD.8, AESE.8, AESIMC.8, AESMC.8, SHA1H.32, SHA1SU1.32, SHA256SU0.32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_simd_qreg> ;0=qd,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_CRYPTO + jz ERROR_requires_copro_capability_simd_crypto + mov cl,[operand_register1] + mov [operand_register1],0 + mov [operand_register2],cl + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_CRYPTO_qd_qn_qm: + ;used by SHA1C.32, SHA1P.32, SHA1M.32, SHA1SU0.32, SHA256H.32, SHA256H2.32, SHA256SU1.32 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_simd_qreg,TMPL_simd_qreg> ;0=qd,qn,qm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_CRYPTO + jz ERROR_requires_copro_capability_simd_crypto + jmp SIMD_INT_vd_vn_vm.encode + +SIMD_INT_qd_dn_dm: + ;used by VMULL.P64 + call decode_template + TEMPLATE \ + <TMPL_simd_qreg,TMPL_vfpd_reg,TMPL_vfpd_reg> ;0=qd,dn,dm + test [copro_capability_flags],1 shl COPRO_CAPABILITY_SIMD_CRYPTO + jz ERROR_requires_copro_capability_simd_crypto + jmp SIMD_INT_vd_vn_vm.encode + +;v8 64 bit + +ARM64_encode_bitmask: + ;create N:immr:imms from immediate_value_high:immediate_value + ;return carry = true if failed + ;return eax = N:immr:imms if successful + ;first stage: find the smallest unit that can be replicated + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ebx,64 ;ebx = current replicate bit size + cmp edx,eax + jnz .find_rotation + shr ebx,1 ;32 + ror edx,16 + cmp dx,ax + jnz .find_rotation + shr ebx,1 ;16 + cmp ah,al + jnz .find_rotation + shr ebx,1 ;8 + ror ah,4 + cmp ah,al + jnz .find_rotation + shr ebx,1 ;4 + ror ah,2 + cmp ah,al + jnz .find_rotation + shr ebx,1 ;2 + cmp al,-1 ;all ones? + jz .cannot_encode + .find_rotation: + push ebx + ;second stage: find a rotation that puts all the bits at the lower end + cmp bl,64 + jz .mask_done + mov ecx,ebx + neg ecx + rol eax,cl + cdq + sar eax,cl + .mask_done: + ;count leading 1's + not edx + not eax + bsr ecx,edx + lea ecx,[ecx+32] + jnz .leading_ones_count_okay + bsr ecx,eax + .leading_ones_count_okay: + not edx + not eax + not ecx + and ecx,0x3f + jnz .rotate_and_check + ;count trailing 0's + bsf ecx,eax + jnz .trailing_zeros_count_okay + bsf ecx,edx + jz .zero_value + add ecx,32 + .trailing_zeros_count_okay: + ;invert the count + sub ecx,64 + neg ecx + and ecx,0x3f + .rotate_and_check: + push ecx + ;rotate left by ecx bits + cmp ecx,32 + jb .rotate_small + xchg edx,eax + .rotate_small: + mov ebx,eax + shld eax,edx,cl + shld edx,ebx,cl + ;check that it is one less than a power of 2 + mov ecx,eax + mov ebx,edx + add ecx,1 + adc ebx,0 + and eax,ecx + and edx,ebx + or eax,edx + jnz .fail + ;get the bit size + bsf eax,ecx + jnz .trailing_zeros_count_okay2 + bsf eax,ebx + add eax,32 + .trailing_zeros_count_okay2: + dec eax ;get length (imms) + pop ecx ;get rotation (immr) + pop ebx ;get replicate bit size + lea edx,[ebx-1] + and eax,edx + and ecx,edx + not edx + shl edx,1 + or eax,edx + and eax,0x3f + shl ecx,6 + or eax,ecx + and ebx,0x40 + shl ebx,12-6 + or eax,ebx + ;success + clc + ret + .fail: + pop eax ;dummy to restore stack + .zero_value: + pop eax ;dummy to restore stack + .cannot_encode: + stc + ret + +ARM64_dz_nz_mz: + ;used by ADC, ADCS, MNEG, SBC, SBCS, SDIV, UDIV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg> ;1=xd,xn,xm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + .do: + mov ebp,[arm64_instruction] ;recover the template + shl eax,31 + or ebp,eax ;set sf + .encode_rd: + movzx eax,[operand_register0] ;rd + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,5 + or ebp,eax + movzx eax,[operand_register2] ;rm + shl eax,16 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_wz_wz_wz: + ;used by CRC32B, CRC32H, CRC32W, CRC32CB, CRC32CH, CRC32CW + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg> ;0=wd,wn,wm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_CRC shr 32 + jz ERROR_requires_cpu64_capability_crc + jmp ARM64_dz_nz_mz.do + +ARM64_wz_wz_xz: + ;used by CRC32X, CRC32CX + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_dword_z_reg> ;0=wd,wn,xm + jmp ARM64_wz_wz_wz.encode + +ARM64_xz_xz_xz: + ;used by SMULH + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg> ;0=xd,xn,xm + jmp ARM64_dz_nz_mz.encode + +ARM64_dz_nz_mz_az: + ;used by MADD, MSUB + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn,wm,wa + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg> ;1=xd,xn,xm,xa + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + shl eax,31 + or ebp,eax ;set sf + .encode_rd: + movzx eax,[operand_register0] ;rd + or ebp,eax + movzx eax,[operand_register1] ;rn + shl eax,5 + or ebp,eax + movzx eax,[operand_register2] ;rm + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;ra + shl eax,10 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_dx_nw_mw_ax: + ;used by SMADDL, SMSUBL, UMADDL, UMSUBL + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_dword_z_reg> ;0=xd,wn,wm,xa + jmp ARM64_dz_nz_mz_az.encode + +ARM64_dx_nw_mw: + ;used by SMNEGL, UMNEGL + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_word_z_reg,TMPL_word_z_reg> ;0=xd,wn,wm + jmp ARM64_dz_nz_mz_az.encode + +ARM64_dz_nw: + ;used by SXTB, SXTH + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn + <TMPL_dword_z_reg,TMPL_word_z_reg> ;1=xd,wn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx ecx,al + shl ecx,22 + shl eax,31 + or ebp,ecx ;set N + or ebp,eax ;set sf + jmp ARM64_dz_nz_mz.encode_rd + +ARM64_dw_nw: + ;used by UXTB, UXTH + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg> ;0=wd,wn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + jmp ARM64_dz_nz_mz.encode + +ARM64_dx_nw: + ;used by SXTW + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_word_z_reg> ;0=xd,wn + jmp ARM64_dz_nz_mz.encode + +ARM64_arithmetic1: + ;used by ADD, ADDS, SUB, SUBS + bt ecx,29 + jnc .non_S + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_sp_reg>,\ ; 0=wd,wn,wm (reversed sp without imm) + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 1=wd,wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op3,TMPL_imm>,\ ; 2=wd,wn,wm,shift imm + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ; 3=wd,wn,wm,extend + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm>,\ ; 4=wd,wn,wm,extend imm + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm>,\ ; 5=wd,wn,wm,lsl imm + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_always>,\ ; 6=wd,wn,wm (catch sp without imm) + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_imm>,\ ; 7=wd,wn,imm + <TMPL_word_z_reg,TMPL_word_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 8=wd,wn,imm,lsl imm2 + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_sp_reg>,\ ; 9=xd,xn,xm (reversed sp without imm) + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;10=xd,xn,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op3,TMPL_imm>,\ ;11=xd,xn,xm,shift imm + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend>,\ ;12=xd,xn,xm,extend + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm>,\ ;13=xd,xn,xm,extend imm + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm>,\ ;14=xd,xn,xm,lsl imm + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_always>,\ ;15=xd,xn,xm (catch sp without imm) + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_imm>,\ ;16=xd,xn,imm + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;17=xd,xn,imm,lsl imm2 + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ;18=xd,xn,wm,extend + <TMPL_dword_z_reg,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm> ;19=xd,xn,wm,extend imm + jmp .encode + .non_S_adjust_table: + db 1,2,3,4,5,6,7,8,0 + db 10,11,12,13,14,15,16,17,18,19,9 + db 20,21,22,23,24,25,26,27 + .non_S: + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 0=wd,wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op3,TMPL_imm>,\ ; 1=wd,wn,wm,shift imm + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ; 2=wd,wn,wm,extend + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm>,\ ; 3=wd,wn,wm,extend imm + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm>,\ ; 4=wd,wn,wm,lsl imm + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_word_z_reg,TMPL_always>,\ ; 5=wd,wn,wm (catch sp without imm) + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_imm>,\ ; 6=wd,wn,imm + <TMPL_word_s_reg,TMPL_word_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 7=wd,wn,imm,lsl imm2 + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_word_sp_reg>,\ ; 8=wd,wn,wm (reversed sp without imm) + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ; 9=xd,xn,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op3,TMPL_imm>,\ ;10=xd,xn,xm,shift imm + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend>,\ ;11=xd,xn,xm,extend + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm>,\ ;12=xd,xn,xm,extend imm + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm>,\ ;13=xd,xn,xm,lsl imm + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_always>,\ ;14=xd,xn,xm (catch sp without imm) + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_imm>,\ ;15=xd,xn,imm + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;16=xd,xn,imm,lsl imm2 + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ;17=xd,xn,wm,extend + <TMPL_dword_s_reg,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm>,\ ;18=xd,xn,wm,extend imm + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_dword_sp_reg>,\ ;19=xd,xn,xm (reversed sp without imm) + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;20=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;21=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;22=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;23=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;24=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;25=vd,vn,vm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\ ;26=dd,dn,dm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d> ;27=vd,vn,vm + movzx eax,al + mov al,[.non_S_adjust_table+eax] + .encode: + mov ebp,[arm64_instruction] ;recover the template + cmp al,20 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + cmp al,9 + cmc + sbb ecx,ecx + and cl,9 + sub al,cl + mov cl,ch + shl ecx,31 + or ebp,ecx ;set sf + cmp al,0 + jnz .swap_okay + bt ebp,30 ;sub? + jc ERROR_parameter_n_not_valid.third ;can't swap r,r,sp with sub + mov cl,[operand_register1] + mov ch,[operand_register2] + mov [operand_register1],ch + mov [operand_register2],cl + add al,6 + .swap_okay: + cmp al,9 + jae .extended_register_xxw + cmp al,2 + jbe .shifted_register + cmp al,6 + ja .immediate + jmp .extended_register + .extended_register_xxw: + mov cl,[instruction_shift_op] + and cl,0x3 + cmp cl,0x3 + jz ERROR_parameter_n_not_valid.third ;can't have w with [su]xtx + sub al,7 + .extended_register: + or ebp,0x59 shl 21 + ;set lsl + cmp al,5 + jz .set_lsl + cmp al,6 + jnz .lsl_okay + .set_lsl: + test ebp,ebp + sets cl + add cl,2 + mov [instruction_shift_op],cl + .lsl_okay: + movzx ecx,[instruction_shift_op] + shl ecx,13 + or ebp,ecx + mov edx,[immediate_value] + cmp edx,4 + ja ERROR_shift_value_out_of_range.0_4 + jmp .encode_immediate + .shifted_register: + or ebp,0xb shl 24 + .encode_shifted_register: + movzx eax,[instruction_shift_op] + shl eax,22 + or ebp,eax + mov ecx,ERROR_shift_value_out_of_range.0_63 + mov edx,ERROR_shift_value_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + mov edx,[immediate_value] + cmp edx,eax + jae ARM_store_instruction_with_error + .encode_immediate: + shl edx,10 + or ebp,edx + .encode_rm: + movzx eax,[operand_register2] + shl eax,16 + or ebp,eax + .encode_rn: + movzx eax,[operand_register1] + shl eax,5 + or ebp,eax + .encode_rd: + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + .immediate: + or ebp,0x11 shl 24 + mov edx,[immediate_value] + test edx,edx + jz .encode_immediate + jns .immediate_positive + neg edx + xor ebp,1 shl 30 ;invert the operation ADD<-->SUB + .immediate_positive: + mov ecx,[immediate_value2] + cmp ecx,32 + jae .immediate_out_of_range + xor eax,eax + shld eax,edx,cl + test eax,eax + jnz .immediate_out_of_range + shl edx,cl + cmp edx,0xfff + jbe .encode_immediate + or ebp,1 shl 22 ;enable lsl 12 + test edx,0xfff + jnz .immediate_out_of_range + shr edx,12 + cmp edx,0xfff + jbe .encode_immediate + .immediate_out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_0xfff_lsl_12 + jmp ARM_store_instruction_with_error + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + and ebp,1 shl 30 ;isolate the add/sub bit + shr ebp,1 + or ebp,0x0e208400 + sub al,18+2 + .vector_encode: + cmp al,6 ;scalar? + setz dl + shr al,1 + setc cl + shl ecx,30 + or ebp,ecx ;set Q + mov ah,0 + shl eax,22 + or ebp,eax ;set size + neg dl + and dl,5 + shl edx,28 + or ebp,edx ;set for scalar + jmp .encode_rm + +ARM64_arithmetic1_zr: + ;used by CMN, CMP + call decode_template + TEMPLATE \ + <TMPL_never>,\ ; 0=sp swap not valid + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 1=wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op3,TMPL_imm>,\ ; 2=wn,wm,shift imm + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ; 3=wn,wm,extend + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm>,\ ; 4=wn,wm,extend imm + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm>,\ ; 5=wn,wm,lsl imm + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_always>,\ ; 6=wn,wm (catch sp without imm) + <TMPL_word_s_reg,TMPL_imm>,\ ; 7=wn,imm + <TMPL_word_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 8=wn,imm,lsl imm2 + <TMPL_never>,\ ; 9=sp swap not valid + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;10=xn,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op3,TMPL_imm>,\ ;11=xn,xm,shift imm + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend>,\ ;12=xn,xm,extend + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm>,\ ;13=xn,xm,extend imm + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm>,\ ;14=xn,xm,lsl imm + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_always>,\ ;15=xn,xm (catch sp without imm) + <TMPL_dword_s_reg,TMPL_imm>,\ ;16=xn,imm + <TMPL_dword_s_reg,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;17=xn,imm,lsl imm2 + <TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend>,\ ;18=xn,wm,extend + <TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm> ;19=xd,xn,wm,extend imm + mov edx,[operand_registers] + shl edx,8 + or edx,0x1f + mov [operand_registers],edx + jmp ARM64_arithmetic1.encode + +ARM64_arithmetic2: + ;used by AND, ANDS, BIC, BICS, EOR, EON, ORN, ORR + test al,FLAG_CONDITION_SET + setnz bl + shl ebx,30 + or ecx,ebx + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 0=wd,wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op,TMPL_imm>,\ ; 1=wd,wn,wm,shift imm + <TMPL_word_s_reg,TMPL_word_z_reg,TMPL_imm>,\ ; 2=wd,wn,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ; 3=xd,xn,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op,TMPL_imm>,\ ; 4=xd,xn,xm,shift imm + <TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_imm64>,\ ; 5=xd,xn,imm + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 6=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 7=vd,vn,vm + <TMPL_vect_v4h,TMPL_imm>,\ ; 8=vd,imm + <TMPL_vect_v4h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 9=vd,imm,lsl imm + <TMPL_vect_v8h,TMPL_imm>,\ ;10=vd,imm + <TMPL_vect_v8h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;11=vd,imm,lsl imm + <TMPL_vect_v2s,TMPL_imm>,\ ;12=vd,imm + <TMPL_vect_v2s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;13=vd,imm,lsl imm + <TMPL_vect_v4s,TMPL_imm>,\ ;14=vd,imm + <TMPL_vect_v4s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2> ;15=vd,imm,lsl imm + mov ebp,[arm64_instruction] ;recover the template + .encode: + cmp al,6 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + cmp al,3 + cmc + sbb ecx,ecx + and cl,3 + sub al,cl + mov cl,ch + shl ecx,31 + or ebp,ecx ;set sf + cmp al,2 + je .immediate + .shifted_register: + or ebp,0xa shl 24 + jmp ARM64_arithmetic1.encode_shifted_register + .immediate: + btr ebp,21 + jnc .inversion_okay + .invert: + ;for BIC, BICS, EON and ORN the immediate is inverted + mov ecx,[immediate_value] + mov edx,[immediate_value_high] + not ecx + not edx + mov [immediate_value],ecx + mov [immediate_value_high],edx + .inversion_okay: + or ebp,0x12 shl 24 + js .immediate_prepared + mov eax,[immediate_value] + mov [immediate_value_high],eax + .immediate_prepared: + call ARM64_encode_bitmask + mov ecx,ERROR_immediate_cannot_be_encoded + jc ARM_store_instruction_with_error + mov edx,eax + jmp ARM64_arithmetic1.encode_immediate + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + ;S forms are invalid + test [instruction_condition],FLAG_CONDITION_SET + jnz ERROR_parameter_n_not_valid.first + ;EON is invalid + mov ecx,ebp + and ecx,3 shl 29 + 1 shl 21 + cmp ecx,2 shl 29 + 1 shl 21 + jz ERROR_parameter_n_not_valid.first + cmp al,8 + jae .vector_immediate + mov ecx,ebp + mov edx,ebp + and ebp,1 shl 30 + and ecx,1 shl 29 + and edx,1 shl 21 + shr ebp,30-29 + shr ecx,29-23 + shl edx,22-21 + or ebp,ecx + or ebp,edx + or ebp,0x0e201c00 + sub al,6 + jmp ARM64_arithmetic1.vector_encode + .vector_immediate: + ;EOR is invalid + test ebp,1 shl 30 + jnz ERROR_parameter_n_not_valid.first + mov edx,[immediate_value] + test al,4 + setz bl + mov bh,0 + shl ebx,16 + neg ebx + test edx,ebx + jz .primary_range_okay + xor edx,ebx + test edx,ebx + jnz .out_of_range + .primary_range_okay: + not ebx + ;invert AND + test ebp,ebp + jz .vector_invert + ;invert ORN + cmp ebp,1 shl 29 + 1 shl 21 + jnz .vector_invert_okay + .vector_invert: + ;for AND and ORN the immediate is inverted + xor edx,ebx + ;convert AND to BIC and ORN to ORR + xor ebp,1 shl 21 + .vector_invert_okay: + ;build the number + test edx,edx + jz .immediate_built + mov ecx,[immediate_value2] + cmp cl,32 + jae .out_of_range + push ebx + xor ebx,ebx + shld ebx,edx,cl + test ebx,ebx + pop ebx + jnz .out_of_range + shl edx,cl + not ebx + test edx,ebx + jnz .out_of_range + .immediate_built: + and ebp,1 shl 21 + shl ebp,29-21 + or ebp,0x0f001400 + sub al,8 + test al,2 + setnz cl + shl ecx,30 + or ebp,ecx ;set Q + test al,4 + setz cl + shl ecx,15 + or ebp,ecx ;set cmode = x001b + shr ecx,14 + sub ecx,4 + neg ecx + xor ebx,ebx + .try_immediate: + cmp edx,0xff + jbe .immediate_ready + test edx,0xff + jnz .out_of_range + shr edx,8 + inc bl + cmp bl,cl + jae .out_of_range + jmp .try_immediate + .immediate_ready: + shl ebx,13 + or ebp,ebx + mov eax,edx + and edx,0x1f + and eax,0xe0 + shl edx,5 + shl eax,16-5 + or ebp,edx + or ebp,eax + jmp ARM64_arithmetic1.encode_rd + .out_of_range: + test ebp,1 shl 15 + mov ecx,ERROR_immediate_value_out_of_range.0_0xff_lsl_8 + mov edx,ERROR_immediate_value_out_of_range.0_0xff_lsl_24 + cmovz ecx,edx + jmp ARM_store_instruction_with_error + +ARM64_arithmetic3: + ;used by ASR, LSL, LSR, ROR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm>,\ ;1=wd,wn,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;2=wd,wn,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm> ;3=wd,wn,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + cmp al,2 + setae cl + shl ecx,31 + or ebp,ecx ;set sf + and al,1 + jz ARM64_arithmetic1.encode_rm + ;immediate + test ebp,ebp + mov ecx,ERROR_shift_value_out_of_range.0_63 + mov edx,ERROR_shift_value_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + sets bl + movzx ebx,bl + shl ebx,22 + cmp eax,[immediate_value] + jbe ARM_store_instruction_with_error + test ebp,3 shl 10 + jnz .asr_lsr_ror + .lsl: + dec eax + mov edx,[immediate_value] + and ebp,1 shl 31 + or ebp,ebx ;set N + or ebp,0x53000000 + mov ecx,edx + neg edx + and edx,eax + sub eax,ecx + shl edx,16 + or ebp,edx + shl eax,10 + or ebp,eax + jmp ARM64_arithmetic1.encode_rm + .asr_lsr_ror: + mov edx,ebp + shl edx,30-10 + cmp edx,0xc0000000 + jae .ror + and edx,1 shl 30 + and ebp,1 shl 31 + or ebp,edx + or ebp,ebx ;set N + shr ebx,22-15 + or ebp,0x13007c00 + mov edx,[immediate_value] + shl edx,16 + .set_shift_and_N: + or ebp,edx + or ebp,ebx + jmp ARM64_arithmetic1.encode_rm + .ror: + and ebp,1 shl 31 + or ebp,0x13800000 + mov cl,[operand_register1] + mov [operand_register2],cl + mov edx,[immediate_value] + shl edx,10 + jmp .set_shift_and_N + +ARM64_arithmetic4: + ;used by CLS, CLZ + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;1=xd,xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;2=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ;3=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ;4=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h>,\ ;5=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;6=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s> ;7=vd,vn + mov ebp,[arm64_instruction] ;recover the template + cmp al,2 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + shl eax,31 + or ebp,eax ;set sf + jmp ARM64_arithmetic1.encode_rn + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + not ebp + and ebp,1 shl 10 + shl ebp,29-10 + or ebp,0x0e204800 + sub al,2 + jmp ARM64_arithmetic1.vector_encode + +ARM64_arithmetic5: + ;used by EXTR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm>,\ ;0=wd,wn,wm,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm> ;1=xd,xn,xm,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + shl eax,31 + or ebp,eax ;set sf + shr eax,31-22 + or ebp,eax ;set N + mov ecx,ERROR_shift_value_out_of_range.0_63 + mov edx,ERROR_shift_value_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + mov edx,[immediate_value] + cmp edx,eax + jae ARM_store_instruction_with_error + jmp ARM64_arithmetic1.encode_immediate + +ARM64_register_rotate: + ;used by ASRV, LSLV, LSRV, RORV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg> ;1=xd,xn,xm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + shl eax,31 + or ebp,eax ;set sf + jmp ARM64_arithmetic1.encode_rm + +ARM64_adr: + ;used by ADR, ADRP + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_address64> ;0=xd,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ecx,[addressing_space] + add eax,[ecx+0] + adc edx,[ecx+4] + sub eax,edi + sbb edx,0 + test ebp,ebp ;ADRP? + jns .offset_okay + shrd eax,edx,12 + sar edx,12 + .offset_okay: + mov ecx,edx + cdq + cmp ecx,edx + mov ecx,ERROR_branch_too_far + jnz ARM_store_instruction_with_error + cmp eax,0xfffff + jg ARM_store_instruction_with_error + cmp eax,-0x100000 + jl ARM_store_instruction_with_error + mov ecx,eax + and eax,0x1ffffc + and ecx,0x000003 + shl eax,5-2 + shl ecx,29 + or eax,ecx + or ebp,eax + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + +ARM64_sys_predefined_at: + ;used by AT + call decode_template + TEMPLATE \ + <TMPL_at_op,TMPL_dword_z_reg> ;0=at,xd + mov edx,sys_encode_table_at + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + mov eax,[immediate_value] + movzx ecx,word[edx+eax*2] + shl ecx,5 + or ebp,ecx + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + +ARM64_sys_predefined_dc: + ;used by DC + call decode_template + TEMPLATE \ + <TMPL_dc_op,TMPL_dword_z_reg> ;0=dc,xd + mov edx,sys_encode_table_dc + jmp ARM64_sys_predefined_at.encode + +ARM64_sys_predefined_ic: + ;used by IC + call decode_template + TEMPLATE \ + <TMPL_ic_op>,\ ;0=ic + <TMPL_ic_op,TMPL_dword_z_reg> ;1=ic,xd + mov edx,sys_encode_table_ic + .do: + mov cl,[operand_register0] + mov bl,0x1f ;defailt to xzr + test al,al + cmovz ecx,ebx + mov [operand_register0],cl + jmp ARM64_sys_predefined_at.encode + +ARM64_sys_predefined_tlbi: + ;used by TLBI + call decode_template + TEMPLATE \ + <TMPL_tlbi_op>,\ ;0=tlbi + <TMPL_tlbi_op,TMPL_dword_z_reg> ;1=tlbi,xd + mov edx,sys_encode_table_tlbi + jmp ARM64_sys_predefined_ic.do + +ARM64_sys_predefined_mrs: + ;used by MRS + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_msr_reg>,\ ;0=xd,sysreg (predefined) + <TMPL_dword_z_reg,TMPL_sysreg_dynamic> ;1=xd,sysreg (implementation defined) + test al,al + mov edx,sys_encode_table_msr + jz ARM64_sys_predefined_at.encode + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + .dynamic_reg: + mov ebp,[arm64_instruction] + mov ecx,[immediate_value] + shl ecx,5 + or ebp,ecx + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + +ARM64_sys_predefined_msr: + ;used by MSR + call decode_template + TEMPLATE \ + <TMPL_msr_reg,TMPL_dword_z_reg>,\ ;0=sysreg,xd + <TMPL_msr_reg,TMPL_imm2>,\ ;1=sysreg,imm (catch spsel) + <TMPL_pstate_reg,TMPL_imm2>,\ ;2=sysreg,imm + <TMPL_sysreg_dynamic,TMPL_dword_z_reg> ;3=sysreg,xd + test al,al + mov edx,sys_encode_table_msr + jz ARM64_sys_predefined_at.encode + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + cmp al,2 + jz .pstate + cmp al,3 + jz ARM64_sys_predefined_mrs.dynamic_reg + cmp [immediate_value],(sys_encode_spsel-sys_encode_table_msr) shr 1 + jnz ERROR_parameter_n_not_valid.first + mov [immediate_value],(sys_pencode_spsel-sys_encode_table_pstate) shr 1 + mov edx,[immediate_value2] + cmp edx,1 + mov ecx,ERROR_immediate_value_out_of_range.0_1 + ja ARM_store_instruction_with_error + .pstate: + mov ebp,[arm64_instruction] + mov edx,[immediate_value2] + cmp edx,15 + mov ecx,ERROR_immediate_value_out_of_range.0_15 + ja ARM_store_instruction_with_error + shl edx,8 + or ebp,edx + or ebp,0x1f + mov [arm64_instruction],ebp + mov edx,sys_encode_table_pstate + jmp ARM64_sys_predefined_at.encode + +ARM64_b_cond: + ;used by B.<cond> + call decode_template + TEMPLATE \ + <TMPL_address64> ;0=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + .encode: + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ecx,[addressing_space] + add eax,[ecx+0] + adc edx,[ecx+4] + sub eax,edi + sbb edx,0 + test eax,3 + mov ecx,ERROR_branch_misaligned + jnz ARM_store_instruction_with_error + mov ebx,edx + cdq + cmp ebx,edx + mov ecx,ERROR_branch_too_far + jnz ARM_store_instruction_with_error + cmp eax,0xfffff + jg ARM_store_instruction_with_error + cmp eax,-0x100000 + jl ARM_store_instruction_with_error + and eax,0x1ffffc + shl eax,(5-2) + or ebp,eax + jmp ARM64_store_instruction + +ARM64_b_reg: + ;used by CBNZ, CBZ + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_address64>,\ ;0=wt,imm + <TMPL_dword_z_reg,TMPL_address64> ;1=xt,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + shl eax,31 + or ebp,eax ;set sf + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_b_cond.encode + +ARM64_b: + call decode_template + ;used by B, BL + TEMPLATE \ + <TMPL_address64> ;0=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ecx,[addressing_space] + add eax,[ecx+0] + adc edx,[ecx+4] + sub eax,edi + sbb edx,0 + test eax,3 + mov ecx,ERROR_branch_misaligned + jnz ARM_store_instruction_with_error + mov ecx,edx + cdq + cmp ecx,edx + mov ecx,ERROR_branch_too_far + jnz ARM_store_instruction_with_error + cmp eax,0x7ffffff + jg ARM_store_instruction_with_error + cmp eax,-0x8000000 + jl ARM_store_instruction_with_error + and eax,0xffffffc + shr eax,2 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_bfi: + ;used by BFI, SBFIZ, UBFIZ + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;0=wd,wn,imm,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;1=wd,wn,imm,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,al + shl eax,22 + or ebp,eax ;set N + shl eax,(31-22) + or ebp,eax ;set sf + ;if BFI then check that rn <> 0x1f + test ebp,1 shl 29 + jz .rn_okay + cmp [operand_register1],0x1f + jz ERROR_zr_not_valid.second + .rn_okay: + test ebp,ebp + mov ecx,ERROR_lsb_out_of_range.0_63 + mov edx,ERROR_lsb_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + cmp eax,[immediate_value] + jbe ARM_store_instruction_with_error + test ebp,ebp + mov ecx,ERROR_width_out_of_range.1_64 + mov edx,ERROR_width_out_of_range.1_32 + cmovns ecx,edx + mov ebx,[immediate_value2] + cmp eax,ebx + jb ARM_store_instruction_with_error + test ebx,ebx + jz ARM_store_instruction_with_error + ;encode the immediate + mov edx,[immediate_value] + dec eax + neg edx + and edx,eax + dec ebx + test ebp,ebp + mov ecx,ERROR_width_out_of_range.64 + mov eax,ERROR_width_out_of_range + cmovns ecx,eax + cmp ebx,edx + jae ARM_store_instruction_with_error + shl edx,6 + or edx,ebx + jmp ARM64_arithmetic1.encode_immediate + +ARM64_bfm: + ;used by BFM, SBFM, UBFM + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;0=wd,wn,imm,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;1=wd,wn,imm,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,al + shl eax,22 + or ebp,eax ;set N + shl eax,(31-22) + or ebp,eax ;set sf + test ebp,ebp + mov ecx,ERROR_immr_out_of_range.0_63 + mov edx,ERROR_immr_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + cmp eax,[immediate_value] + jbe ARM_store_instruction_with_error + test ebp,ebp + mov ecx,ERROR_imms_out_of_range.0_63 + mov edx,ERROR_imms_out_of_range.0_31 + cmovns ecx,edx + mov ebx,[immediate_value2] + cmp eax,ebx + jbe ARM_store_instruction_with_error + ;encode the immediate + mov edx,[immediate_value] + shl edx,6 + or edx,ebx + jmp ARM64_arithmetic1.encode_immediate + +ARM64_bfxil: + ;used by BFXIL, SBFX, UBFX + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2>,\ ;0=wd,wn,imm,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm,TMPL_comma,TMPL_imm2> ;1=wd,wn,imm,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,al + shl eax,22 + or ebp,eax ;set N + shl eax,(31-22) + or ebp,eax ;set sf + test ebp,ebp + mov ecx,ERROR_lsb_out_of_range.0_63 + mov edx,ERROR_lsb_out_of_range.0_31 + cmovns ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovns eax,edx + cmp eax,[immediate_value] + jbe ARM_store_instruction_with_error + test ebp,ebp + mov ecx,ERROR_width_out_of_range.1_64 + mov edx,ERROR_width_out_of_range.1_32 + cmovns ecx,edx + mov ebx,[immediate_value2] + cmp eax,ebx + jb ARM_store_instruction_with_error + test ebx,ebx + jz ARM_store_instruction_with_error + ;encode the immediate + test ebp,ebp + mov ecx,ERROR_width_out_of_range.64 + mov edx,ERROR_width_out_of_range + cmovns ecx,edx + mov edx,[immediate_value] + lea ebx,[edx+ebx-1] + cmp ebx,eax + jae ARM_store_instruction_with_error + shl edx,6 + or edx,ebx + jmp ARM64_arithmetic1.encode_immediate + +ARM64_br: + ;used by BLR, BR + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg> ;0=xd + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,[operand_register0] + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_debug: + ;used by BRK, HLT, HVC, SMC, SVC + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + mov eax,[immediate_value] + cmp eax,0x10000 + jae ERROR_immediate_value_out_of_range.0_0xffff + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_debug2: + ;used by DCPS1, DCPS2, DCPS3 + call decode_template + TEMPLATE \ + <TMPL_EOL>,\ ;0=empty + <TMPL_imm> ;1=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + mov eax,[immediate_value] + cmp eax,0xffff + ja ERROR_immediate_value_out_of_range.0_0xffff + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_hint: + ;used by HINT + call decode_template + TEMPLATE \ + <TMPL_imm> ;0=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + mov eax,[immediate_value] + cmp eax,0x7f + ja ERROR_immediate_value_out_of_range.0_0x7f + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_debug3: + ;used by DRPS, ERET, NOP, SEV, SEVL, WFE, WFI, YIELD + call decode_template + TEMPLATE \ + <TMPL_EOL> ;0=empty + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + jmp ARM64_store_instruction + +ARM64_conditional_compare: + ;used by CCMN, CCMP + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_imm,TMPL_comma,TMPL_condition_nv>,\ ;0=wn,wm,imm,cond + <TMPL_word_z_reg,TMPL_imm2,TMPL_comma,TMPL_imm,TMPL_comma,TMPL_condition_nv>,\ ;1=wn,imm,imm,cond + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_imm,TMPL_comma,TMPL_condition_nv>,\ ;2=xn,xm,imm,cond + <TMPL_dword_z_reg,TMPL_imm2,TMPL_comma,TMPL_imm,TMPL_comma,TMPL_condition_nv> ;3=xn,imm,imm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + cmp al,2 + setae cl + shl ecx,31 + or ebp,ecx ;set sf + and eax,1 + shl eax,11 + or ebp,eax ;set immediate bit + .encode: + mov ecx,ERROR_condition_value_out_of_range + mov edx,[immediate_value] + cmp edx,15 + ja ARM_store_instruction_with_error + or ebp,edx + movzx edx,[operand_register0] + shl edx,5 + or ebp,edx + test eax,eax + jnz .immediate + movzx eax,[operand_register1] + shl eax,16 + or ebp,eax + movzx eax,[operand_register2] + .store_condition: + shl eax,12 + or ebp,eax + jmp ARM64_store_instruction + .immediate: + mov edx,[immediate_value2] + test edx,edx + jns .positive + neg edx + xor ebp,1 shl 30 + .positive: + mov ecx,ERROR_immediate_value_out_of_range.0_31 + cmp edx,31 + ja ARM_store_instruction_with_error + shl edx,16 + or ebp,edx + movzx eax,[operand_register1] + jmp .store_condition + +ARM64_conditional_modify: + ;used by CINC, CINV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_condition_nv>,\ ;0=wn,wm,cond + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_condition_nv> ;1=xn,xm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + movzx edx,[operand_register1] + cmp edx,31 + jz ERROR_zr_not_valid.second + .encode: + shl edx,5 + or ebp,edx + shl edx,16-5 + or ebp,edx + shl eax,31 + or ebp,eax ;set sf + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[operand_register2] ;get condition + .check_condition: + cmp eax,14 + jae ERROR_al_nv_not_valid + xor al,1 + shl eax,12 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_conditional_modify_zr: + ;used by CNEG + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_condition_nv>,\ ;0=wn,wm,cond + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_condition_nv> ;1=xn,xm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + movzx edx,[operand_register1] + jmp ARM64_conditional_modify.encode + +ARM64_conditional_select: + ;used by CSEL, CSINC, CSINV, CSNEG + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_condition_nv>,\ ;0=wd,wn,wm,cond + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_condition_nv> ;1=xd,xn,xm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + shl eax,31 + .encode: + or ebp,eax ;set sf + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[operand_register1] + shl eax,5 + or ebp,eax + movzx eax,[operand_register2] + shl eax,16 + or ebp,eax + movzx eax,[operand_register3] ;get condition + shl eax,12 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_conditional_set: + ;used by CSET, CSETM + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_condition_nv>,\ ;0=wd,cond + <TMPL_dword_z_reg,TMPL_condition_nv> ;1=xd,cond + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + shl eax,31 + or ebp,eax ;set sf + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[operand_register1] ;get condition + jmp ARM64_conditional_modify.check_condition + +ARM64_clrex: + ;used by CLREX + call decode_template + TEMPLATE \ + <TMPL_EOL>,\ ;0=empty + <TMPL_imm> ;1=imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + test al,al + mov eax,[immediate_value] + mov ecx,0xf + cmovz eax,ecx + cmp eax,0xf + ja ERROR_immediate_value_out_of_range.0_15 + shl eax,8 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_data_barrier: + ;used by DMB, DSB + call decode_template + TEMPLATE \ + <TMPL_barrier>,\ ;0=barrier + <TMPL_imm> ;1=imm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + test al,al + mov eax,[immediate_value] + movzx ecx,[operand_register0] + cmovz eax,ecx + cmp eax,0xf + ja ERROR_immediate_value_out_of_range.0_15 + shl eax,8 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_instruction_barrier: + ;used by ISB + call decode_template + TEMPLATE \ + <TMPL_barrier>,\ ;0=barrier + <TMPL_imm>,\ ;1=imm + <TMPL_EOL> ;2=empty + cmp al,2 + mov edx,[immediate_value] + mov ecx,0xf + cmovz edx,ecx + mov [immediate_value],edx + jmp ARM64_data_barrier.encode + +ARM64_memory_single_fixed: + ;used by LDAR, LDAXR, LDXR, STLR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=wt,[xn] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=wt,[address] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=xt,[xn] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=xt,[address] + .encode: + mov ebp,[arm64_instruction] + .encode2: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov edx,[immediate_value] + mov ecx,ERROR_immediate_offset_out_of_range.0 + test edx,edx + jnz ARM_store_instruction_with_error + cmp al,3 + setae al + shl eax,30 + or ebp,eax + jmp ARM64_arithmetic1.encode_rn + +ARM64_memory_word_single_fixed: + ;used by LDARB, LDARH, LDAXRB, LDAXRH, LDXRB, LDXRH, STLRB, STLRH + test ecx,1 shl 30 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=wt,[xn] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=wt,[address] + jmp ARM64_memory_single_fixed.encode + +ARM64_memory_double_fixed: + ;used by LDAXP, LDXP + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=wt1,wt2,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=wt1,wt2,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=wt1,wt2,[address] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=xt1,xt2,[xn] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=xt1,xt2,[xn,imm] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=xt1,xt2,[address] + mov ebp,[arm64_instruction] + .encode: + mov edx,[operand_registers] + cmp dh,dl + jz ERROR_destination_registers_must_differ + shr edx,8 + mov [operand_register1],dh + movzx edx,dl + shl edx,10 + or ebp,edx + jmp ARM64_memory_single_fixed.encode2 + +ARM64_memory_word_double_release_fixed: + ;used by STLXRB, STLRXH, STXRB, STRRH + test ecx,1 shl 30 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=ws,wt,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=ws,wt,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=ws,wt,[address] + .encode: + mov ebp,[arm64_instruction] + mov ecx,[operand_registers] + movzx edx,cl + shr ecx,8 + mov [operand_registers],ecx + cmp dl,cl + jz ERROR_dest_cannot_be_source_or_memory_address + cmp ch,31 + jz .regs_okay + cmp dl,ch + jz ERROR_dest_cannot_be_source_or_memory_address + .regs_okay: + shl edx,16 + or ebp,edx + jmp ARM64_memory_single_fixed.encode2 + +ARM64_memory_double_release_fixed: + ;used by STLXR, STXR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=ws,wt,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=ws,wt,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=ws,wt,[address] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=ws,xt,[xn] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=ws,xt,[xn,imm] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=ws,xt,[address] + jmp ARM64_memory_word_double_release_fixed.encode + +ARM64_memory_triple_fixed: + ;used by STLXP, STXP + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=ws,wt1,wt2,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=ws,wt1,wt2,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=ws,wt1,wt2,[address] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=ws,xt1,xt2,[xn] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=ws,xt1,xt2,[xn,imm] + <TMPL_word_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=ws,xt1,xt2,[address] + mov ebp,[arm64_instruction] + mov ecx,[operand_registers] ;n,t2,t1,s + movzx ebx,cl ;Ws + shl ebx,16 + or ebp,ebx + shr ebx,16 + shr ecx,8 ;n,t2,t1 + cmp bl,cl ;t1 + jz .bad_regs + cmp bl,ch ;t2 + jz .bad_regs + xchg ch,cl ;n,t1,t2 + movzx edx,cl + shl edx,10 + or ebp,edx + shr ecx,8 ;n,t1 + mov [operand_registers],ecx + cmp ch,31 + jz ARM64_memory_single_fixed.encode2 + cmp bl,ch + jnz ARM64_memory_single_fixed.encode2 + .bad_regs: + jmp ERROR_dest_cannot_be_source_or_memory_address + +ARM64_memory_double_imm7_post_pre_offset: + ;used by LDP, STP + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=wt1,wt2,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=wt1,wt2,[xn],imm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=wt1,wt2,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=wt1,wt2,[xn,imm]! + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 4=wt1,wt2,[address] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 5=wt1,wt2,[address]! + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 6=xt1,xt2,[xn] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 7=xt1,xt2,[xn],imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 8=xt1,xt2,[xn,imm] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 9=xt1,xt2,[xn,imm]! + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;10=xt1,xt2,[address] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;11=xt1,xt2,[address]! + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;12=st1,st2,[xn] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;13=st1,st2,[xn],imm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;14=st1,st2,[xn,imm] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;15=st1,st2,[xn,imm]! + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;16=st1,st2,[address] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;17=st1,st2,[address]! + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;18=dt1,dt2,[xn] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;19=dt1,dt2,[xn],imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;20=dt1,dt2,[xn,imm] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;21=dt1,dt2,[xn,imm]! + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;22=dt1,dt2,[address] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;23=dt1,dt2,[address]! + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;24=qt1,qt2,[xn] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;25=qt1,qt2,[xn],imm + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;26=qt1,qt2,[xn,imm] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;27=qt1,qt2,[xn,imm]! + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;28=qt1,qt2,[address] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;29=qt1,qt2,[address]! + .do: + mov ebp,[arm64_instruction] + mov ah,0 + mov cl,6 + div cl + cmp ah,4 + setae cl + add cl,cl + sub ah,cl + movzx ecx,ah + setz dl + add dl,dl + or cl,dl + shl ecx,23 + or ebp,ecx + .encode: + mov dx,word[operand_register0] + test ebp,1 shl 22 + jz .reg_pair_okay + cmp dh,dl + jz ERROR_destination_registers_must_differ + .reg_pair_okay: + cmp al,2 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + test ah,1 + jz .writeback_okay + cmp [operand_register2],31 + jz .writeback_okay + cmp dl,[operand_register2] + jz ERROR_base_and_dest_must_differ_with_writeback + cmp dh,[operand_register2] + jz ERROR_base_and_dest_must_differ_with_writeback + .writeback_okay: + shl eax,31 + or ebp,eax + shr eax,31 + jmp .set_multiplier + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + or ebp,1 shl 26 + sub al,2 + shl eax,30 + or ebp,eax + shr eax,30 + .set_multiplier: + lea ecx,[eax+2] + mov eax,ERROR_immediate_offset_out_of_range.m256_252 + mov edx,ERROR_immediate_offset_out_of_range.m512_504 + mov ebx,ERROR_immediate_offset_out_of_range.m1024_1008 + cmp ecx,3 + cmovz eax,edx + cmova eax,ebx + mov ebx,[immediate_value] + or edx,-1 + shl edx,cl + not edx + test ebx,edx + cmovnz ecx,eax + jnz ARM_store_instruction_with_error + sar ebx,cl + mov ecx,eax + cmp ebx,-64 + jl ARM_store_instruction_with_error + cmp ebx,+64 + jge ARM_store_instruction_with_error + and ebx,0x7f + shl ebx,15 + or ebp,ebx + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[operand_register1] + shl eax,10 + or ebp,eax + movzx eax,[operand_register2] + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_memory_double_imm7: + ;used by LDNP, STNP + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=wt1,wt2,[xn] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 1=wt1,wt2,[xn,imm] + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 2=wt1,wt2,[address] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 3=xt1,xt2,[xn] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 4=xt1,xt2,[xn,imm] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 5=xt1,xt2,[address] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 6=st1,st2,[xn] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 7=st1,st2,[xn,imm] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 8=st1,st2,[address] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 9=dt1,dt2,[xn] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;10=dt1,dt2,[xn,imm] + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;11=dt1,dt2,[address] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;12=qt1,qt2,[xn] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;13=qt1,qt2,[xn,imm] + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_size_32,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;14=qt1,qt2,[address] + mov ebp,[arm64_instruction] + mov ah,0 + mov cl,3 + div cl + add ah,ah + jmp ARM64_memory_double_imm7_post_pre_offset.encode + +ARM64_memory_double_imm7_signed: + ;used by LDPSW + mov [operand_size],8 + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=xt1,xt2,[xn] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;1=xt1,xt2,[xn],imm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;2=xt1,xt2,[xn,imm] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;3=xt1,xt2,[xn,imm]! + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;4=wt1,wt2,[address] + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;5=wt1,wt2,[address]! + mov ebp,[arm64_instruction] + jmp ARM64_memory_double_imm7_post_pre_offset.do + +ARM64_memory: + ;used by LDR, STR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=wt,[xn] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=wt,[xn],imm + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=wt,[xn,imm]! + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 4=wt,[xn,wm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 5=wt,[xn,wm,extend] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 6=wt,[xn,wm,extend imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 7=wt,[xn,wm,lsl imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 8=wt,[xn,xm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 9=wt,[xn,xm,extend] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 10=wt,[xn,xm,extend imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 11=wt,[xn,xm,lsl imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 12=wt,[address] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 13=wt,[address]! + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ; 14=wt,[address] + <TMPL_word_z_reg,TMPL_size_4,TMPL_address64>,\ ; 15=wt,address + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 16=xt,[xn] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 17=xt,[xn],imm + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 18=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 19=xt,[xn,imm]! + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 20=xt,[xn,wm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 21=xt,[xn,wm,extend] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 22=xt,[xn,wm,extend imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 23=xt,[xn,wm,lsl imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 24=xt,[xn,xm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 25=xt,[xn,xm,extend] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 26=xt,[xn,xm,extend imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 27=xt,[xn,xm,lsl imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 28=xt,[address] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 29=xt,[address]! + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ; 30=xt,[address] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_address64>,\ ; 31=xt,address + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 32=bt,[xn] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 33=bt,[xn],imm + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 34=bt,[xn,imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 35=bt,[xn,imm]! + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 36=bt,[xn,wm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 37=bt,[xn,wm,extend] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 38=bt,[xn,wm,extend imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 39=bt,[xn,wm,lsl imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 40=bt,[xn,xm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 41=bt,[xn,xm,extend] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 42=bt,[xn,xm,extend imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 43=bt,[xn,xm,lsl imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 44=bt,[address] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 45=bt,[address]! + <TMPL_never>,\ ; 46=- + <TMPL_never>,\ ; 47=- + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 48=ht,[xn] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 49=ht,[xn],imm + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 50=ht,[xn,imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 51=ht,[xn,imm]! + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 52=ht,[xn,wm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 53=ht,[xn,wm,extend] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 54=ht,[xn,wm,extend imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 55=ht,[xn,wm,lsl imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 56=ht,[xn,xm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 57=ht,[xn,xm,extend] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 58=ht,[xn,xm,extend imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 59=ht,[xn,xm,lsl imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 60=ht,[address] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 61=ht,[address]! + <TMPL_never>,\ ; 62=- + <TMPL_never>,\ ; 63=- + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 64=st,[xn] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 65=st,[xn],imm + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 66=st,[xn,imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 67=st,[xn,imm]! + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 68=st,[xn,wm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 69=st,[xn,wm,extend] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 70=st,[xn,wm,extend imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 71=st,[xn,wm,lsl imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 72=st,[xn,xm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 73=st,[xn,xm,extend] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 74=st,[xn,xm,extend imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 75=st,[xn,xm,lsl imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 76=st,[address] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 77=st,[address]! + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ; 78=st,[address] + <TMPL_vect_sreg,TMPL_size_4,TMPL_address64>,\ ; 79=st,address + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 80=dt,[xn] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 81=dt,[xn],imm + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 82=dt,[xn,imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 83=dt,[xn,imm]! + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 84=dt,[xn,wm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 85=dt,[xn,wm,extend] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 86=dt,[xn,wm,extend imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 87=dt,[xn,wm,lsl imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 88=dt,[xn,xm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 89=dt,[xn,xm,extend] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 90=dt,[xn,xm,extend imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 91=dt,[xn,xm,lsl imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 92=dt,[address] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 93=dt,[address]! + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ; 94=dt,[address] + <TMPL_vect_dreg,TMPL_size_8,TMPL_address64>,\ ; 95=dt,address + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 96=qt,[xn] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 97=qt,[xn],imm + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 98=qt,[xn,imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 99=qt,[xn,imm]! + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ;100=qt,[xn,wm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;101=qt,[xn,wm,extend] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;102=qt,[xn,wm,extend imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;103=qt,[xn,wm,lsl imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ;104=qt,[xn,xm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;105=qt,[xn,xm,extend] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;106=qt,[xn,xm,extend imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;107=qt,[xn,xm,lsl imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;108=qt,[address] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;109=qt,[address]! + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ;110=qt,[address] + <TMPL_vect_qreg,TMPL_size_16,TMPL_address64> ;111=qt,address + ; + ;W&X + ;unscaled off AB11-1000-CD0i-iiii-iiii-00nn-nnnt-tttt + ;immediate post AB11-1000-CD0i-iiii-iiii-01nn-nnnt-tttt + ;unprivileged AB11-1000-010i-iiii-iiii-10nn-nnnt-tttt + ;immediate pre AB11-1000-CD0i-iiii-iiii-11nn-nnnt-tttt + ;register AB11-1000-CD1m-mmmm-xxxx-10nn-nnnt-tttt + ;immediate off AB11-1001-CDii-iiii-iiii-iinn-nnnt-tttt + ;literal JK01-1000-iiii-iiii-iiii-iiii-iiit-tttt + ; + ;ABCD=0000 ---> strb W B(st) sttrb W + ;ABCD=0001 ---> ldrb W B(ld) ldtrb W + ;ABCD=0010 ---> ldrsb X Q(st) ldtrsb X + ;ABCD=0011 ---> ldrsb W Q(ld) ldtrsb W + ;ABCD=0100 ---> strh W H(st) sttrh W + ;ABCD=0101 ---> ldrh W H(ld) ldtrh W + ;ABCD=0110 ---> ldrsh X ldtrsh X + ;ABCD=0111 ---> ldrsh W ldtrsh W + ;ABCD=1000 ---> str W S(st) sttr W + ;ABCD=1001 ---> ldr W S(ld) ldtr W + ;ABCD=1010 ---> ldrsw X ldtrsw X + ;ABCD=1011 ---> ---- + ;ABCD=1100 ---> str X D(st) sttr X + ;ABCD=1101 ---> ldr X D(ld) ldtr X + ;ABCD=1110 ---> prfm i + ;ABCD=1111 ---> ---- + ; + ;JK=00 ---> W + ;JK=01 ---> X + ;JK=10 ---> SW + ;JK=11 ---> PRFM + ; + ;BHSD&Q + ;immediate post EF11-1100-G10i-iiii-iiii-01nn-nnnt-tttt + ;immediate pre EF11-1100-G10i-iiii-iiii-11nn-nnnt-tttt + ;immediate off EF11-1101-G1ii-iiii-iiii-iinn-nnnt-tttt + ;register EF11-1100-G11m-mmmm-xxxx-10nn-nnnt-tttt + ;literal KL01-1100-iiii-iiii-iiii-iiii-iiit-tttt + ;EFG=000 ---> B + ;EFG=010 ---> H + ;EFG=100 ---> S + ;EFG=110 ---> D + ;EFG=001 ---> Q + ; + ;KL=00 ---> S + ;KL=01 ---> D + ;KL=10 ---> Q + .decode: + mov ch,2 ;set register offset for Wt and Xt + .do: + mov ebp,[arm64_instruction] + mov ah,al + shr al,4 + and ah,0xf ;al=target reg index, ah=parameters + ;set target register + cmp al,1 + ja .set_vector_reg + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + cmp ah,1 ;t,[n],imm + jz .check_writeback + cmp ah,3 ;t,[n,imm]! + jz .check_writeback + cmp ah,13 ;t,[exp]! + jnz .writeback_okay + .check_writeback: + mov dx,word[operand_register0] + cmp dh,31 + jz .writeback_okay + cmp dl,dh + jz ERROR_base_and_dest_must_differ_with_writeback + .writeback_okay: + cmp al,1 + ja .set_vector_reg + setz cl + add cl,ch ;cl=log register size + mov edx,ecx + shl edx,30 + or ebp,edx + jmp .set_paramters + .set_vector_reg: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + or ebp,1 shl 26 + lea ecx,[eax-2] ;cl=log register size + mov ebx,ecx + shl ebx,30 + setc dl + mov dh,0 + or ebp,ebx + shl edx,23 + or ebp,edx + cmp al,2 ;b? + jnz .set_paramters + mov dl,ah + and dl,0xe + cmp dl,6 + setz dh + cmp dl,10 + setz dl + or dl,dh + shl dx,12 + or bp,dx ;set S + .set_paramters: + cmp ah,14 + jae .literal + cmp ah,12 + jae .expression + cmp ah,3 + ja .register + .indexed: + test ah,1 + jnz .pre_post + ;offset + or ebp,1 shl 24 + mov eax,ERROR_immediate_offset_out_of_range.0_0xfff.m256_255 + mov edx,ERROR_immediate_offset_out_of_range.0_0x1ffe.m256_255 + mov ebx,ERROR_immediate_offset_out_of_range.0_0x3ffc.m256_255 + cmp cl,1 + cmovz eax,edx + cmp cl,2 + cmovz eax,ebx + mov edx,ERROR_immediate_offset_out_of_range.0_0x7ff8.m256_255 + mov ebx,ERROR_immediate_offset_out_of_range.0_0xfff0.m256_255 + cmp cl,3 + cmovz eax,edx + cmova eax,ebx + mov ebx,[immediate_value] + or edx,-1 + shl edx,cl + not edx + test ebx,edx + jnz .try_unscaled + sar ebx,cl + cmp ebx,0xfff + ja .try_unscaled + shl ebx,10 + .encode_imm: + or ebp,ebx + .encode_rt: + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[operand_register1] + shl eax,5 + or ebp,eax + movzx eax,[operand_register2] + shl eax,16 + or ebp,eax + jmp ARM64_store_instruction + .expression: + sub ah,10 + jmp .indexed + .try_unscaled: + xor ebp,1 shl 24 + mov ecx,eax + xor eax,eax + jmp .pre_post.do + .pre_post: + mov ecx,ERROR_immediate_offset_out_of_range.m256_255 + .pre_post.do: + and eax,3 shl 8 + shl eax,10-8 + xor ebp,eax + mov ebx,[immediate_value] + cmp ebx,-0x100 + jl ARM_store_instruction_with_error + cmp ebx,0xff + jg ARM_store_instruction_with_error + and ebx,0x1ff + shl ebx,12 + jmp .encode_imm + .register: + or ebp,1 shl 11 + 1 shl 21 + movzx edx,[instruction_shift_op] + xchg ch,cl + mov cl,3 + mov al,ah + and al,3 + cmovz dx,cx ;set default to LSL + cmp al,3 ;LSL specified? + cmovz dx,cx + mov dh,0 + xchg ch,cl + test dl,010b + jz ERROR_extend_type + test ah,8 + jnz .extend_reg_okay + test dl,1 + jnz ERROR_parameter_n_not_valid.third ;can't have w with [su]xtx + .extend_reg_okay: + mov eax,[immediate_value] + test eax,eax + jz .extend_amount_okay + or ebp,1 shl 12 + cmp cl,al + jz .extend_amount_okay + mov eax,ERROR_shift_value_out_of_range.0 + mov edx,ERROR_shift_value_out_of_range.0or1 + mov ebx,ERROR_shift_value_out_of_range.0or2 + cmp cl,1 + cmovz eax,edx + cmp cl,2 + cmovz eax,ebx + mov edx,ERROR_shift_value_out_of_range.0or3 + mov ebx,ERROR_shift_value_out_of_range.0or4 + cmp cl,3 + cmovz eax,edx + cmova eax,ebx + mov ecx,eax + jmp ARM_store_instruction_with_error + .extend_amount_okay: + shl edx,13 + or ebp,edx + jmp .encode_rt + .literal: + cmp [arm64_instruction],0x38000000 ;STR? + jz ERROR_parameter_n_not_valid.second + and ebp,not (7 shl 29 + 3 shl 22) + sub cl,2 + shl ecx,30 + or ebp,ecx + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ecx,[addressing_space] + add eax,[ecx+0] + adc edx,[ecx+4] + sub eax,edi + sbb edx,0 + test eax,3 + mov ecx,ERROR_branch_misaligned + jnz ARM_store_instruction_with_error + mov ebx,edx + cdq + cmp ebx,edx + mov ecx,ERROR_branch_too_far + jnz ARM_store_instruction_with_error + cmp eax,0xfffff + jg ARM_store_instruction_with_error + cmp eax,-0x100000 + jl ARM_store_instruction_with_error + and eax,0x1ffffc + shl eax,(5-2) + or ebp,eax + jmp .encode_rt + +ARM64_memory_byte_hword: + ;used by LDRB, LDRH, STRB, STRH + test cl,1 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=wt,[xn] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=wt,[xn],imm + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=wt,[xn,imm]! + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 4=wt,[xn,wm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 5=wt,[xn,wm,extend] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 6=wt,[xn,wm,extend imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 7=wt,[xn,wm,lsl imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 8=wt,[xn,xm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 9=wt,[xn,xm,extend] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;10=wt,[xn,xm,extend imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;11=wt,[xn,xm,lsl imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=wt,[address] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;13=wt,[address]! + <TMPL_never>,\ ;Note: the following template section is non standard to allow both Xt and Wt syntax ;14=- + <TMPL_never>,\ ;they encode to the same instructions ;15=- + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;16=xt,[xn] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;17=xt,[xn],imm + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;18=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;19=xt,[xn,imm]! + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ;20=xt,[xn,wm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;21=xt,[xn,wm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;22=xt,[xn,wm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;23=xt,[xn,wm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ;24=xt,[xn,xm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;25=xt,[xn,xm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\;26=xt,[xn,xm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;27=xt,[xn,xm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;28=xt,[address] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;29=xt,[address]! + mov edx,[arm64_instruction] + and al,0xf ;X and W forms are the same instruction + test dl,1 + jnz .byte_imm_done + mov cl,al + and cl,0xe + cmp cl,6 + setz ch + cmp cl,10 + setz cl + or cl,ch + shl cx,12 + or dx,cx ;set S + .byte_imm_done: + btr edx,0 + setc ch ;set register offset for Wt + mov [arm64_instruction],edx + jmp ARM64_memory.do + +ARM64_memory_signed_byte_hword: + ;used by LDRSB, LDRSH + test cl,1 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=xt,[xn] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=xt,[xn],imm + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=xt,[xn,imm]! + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 4=xt,[xn,wm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 5=xt,[xn,wm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 6=xt,[xn,wm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 7=xt,[xn,wm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 8=xt,[xn,xm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 9=xt,[xn,xm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\;10=xt,[xn,xm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;11=xt,[xn,xm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=xt,[address] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;13=xt,[address]! + <TMPL_never>,\ ;14=- + <TMPL_never>,\ ;15=- + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;16=wt,[xn] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ;17=wt,[xn],imm + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;18=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;19=wt,[xn,imm]! + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ;20=wt,[xn,wm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;21=wt,[xn,wm,extend] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;22=wt,[xn,wm,extend imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;23=wt,[xn,wm,lsl imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ;24=wt,[xn,xm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;25=wt,[xn,xm,extend] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;26=wt,[xn,xm,extend imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;27=wt,[xn,xm,lsl imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;28=wt,[address] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim> ;29=wt,[address]! + mov edx,[arm64_instruction] + test dl,1 + jnz .byte_imm_done + mov cl,al + and cl,0xe + cmp cl,6 + setz ch + cmp cl,10 + setz cl + or cl,ch + shl cx,12 + or dx,cx ;set S + .byte_imm_done: + btr edx,0 + setc ch ;set register offset for Wt/Xt + mov [arm64_instruction],edx + cmp al,15 + jbe ARM64_memory.do + sub al,16 + or edx,1 shl 22 + mov [arm64_instruction],edx + jmp ARM64_memory.do + +ARM64_memory_signed_word: + ;used by LDRSW + mov [operand_size],4 + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=xt,[xn] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm>,\ ; 1=xt,[xn],imm + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ; 3=xt,[xn,imm]! + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 4=xt,[xn,wm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 5=xt,[xn,wm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 6=xt,[xn,wm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 7=xt,[xn,wm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 8=xt,[xn,xm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 9=xt,[xn,xm,extend] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\;10=xt,[xn,xm,extend imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;11=xt,[xn,xm,lsl imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=xt,[address] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right,TMPL_modifier_exclaim>,\ ;13=xt,[address]! + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ;14=xt,[address] + <TMPL_dword_z_reg,TMPL_address64> ;15=xt,address + cmp al,13 + jbe ARM64_memory.decode + mov ch,4 ;set literal size for Xt + jmp ARM64_memory.do + +ARM64_memory_unprivileged: + ;used by LDTR, STTR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=wt,[xn] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=wt,[address] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=xt,[xn] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=xt,[address] + .decode_v8: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + .decode: + mov ebp,[arm64_instruction] + mov cl,3 + xor ah,ah + div cl + mov ah,1 + mov ch,2 ;set register offset for Wt and Xt + jmp ARM64_memory.writeback_okay + +ARM64_memory_unscaled: + ;used by LDUR, STUR + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=wt,[xn] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 1=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 2=wt,[address] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 3=xt,[xn] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 4=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 5=xt,[address] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 6=bt,[xn] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 7=bt,[xn,imm] + <TMPL_vect_breg,TMPL_size_1,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ; 8=bt,[address] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 9=ht,[xn] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;10=ht,[xn,imm] + <TMPL_vect_hreg,TMPL_size_2,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;11=ht,[address] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;12=st,[xn] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;13=st,[xn,imm] + <TMPL_vect_sreg,TMPL_size_4,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;14=st,[address] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;15=dt,[xn] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;16=dt,[xn,imm] + <TMPL_vect_dreg,TMPL_size_8,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;17=dt,[address] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;18=qt,[xn] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;19=qt,[xn,imm] + <TMPL_vect_qreg,TMPL_size_16,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;20=qt,[address] + cmp al,6 + jb ARM64_memory_unprivileged.decode_v8 + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + jmp ARM64_memory_unprivileged.decode + +ARM64_memory_unprivileged_byte_hword: + ;used by LDTRB, LDTRH, LDURB, LDURH, STTRB, STTRH, STURB, STURH + test cl,1 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=wt,[xn] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=wt,[address] + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + btr ebp,0 + setc ch ;set register offset for Wt + mov ax,0x100 + jmp ARM64_memory.writeback_okay + +ARM64_memory_unprivileged_signed_byte_hword: + ;used by LDTRSB, LDTRSH, LDURSB, LDURSH + test cl,1 + setnz dl + add dl,1 + mov [operand_size],dl + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=xt,[xn] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;2=xt,[address] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;3=wt,[xn] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;4=wt,[xn,imm] + <TMPL_word_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;5=wt,[address] + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + btr ebp,0 + setc ch ;set register offset for Wt/Xt + cmp al,3 + setae al + movzx eax,al + shl eax,22 + or ebp,eax + mov ax,0x100 + jmp ARM64_memory.writeback_okay + +ARM64_memory_unprivileged_signed_word: + ;used by LDTRSW, LDURSW + mov [operand_size],4 + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;0=xt,[xn] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;1=xt,[xn,imm] + <TMPL_dword_z_reg,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right> ;2=xt,[address] + jmp ARM64_memory_unprivileged.decode_v8 + +ARM64_mov_aliases: + ;used by MOV + call decode_template + TEMPLATE \ + <TMPL_word_sp_reg,TMPL_word_s_reg>,\ ; 0=wd,wn + <TMPL_word_sp_reg,TMPL_imm>,\ ; 1=wd,imm + <TMPL_word_zr_reg,TMPL_word_z_reg>,\ ; 2=wd,wn + <TMPL_word_zr_reg,TMPL_imm>,\ ; 3=wd,imm + <TMPL_word_zr_reg,TMPL_vect_element_s>,\ ; 4=wd,vn.s[] + <TMPL_word_gen_reg,TMPL_word_sp_reg>,\ ; 5=wd,wn + <TMPL_word_gen_reg,TMPL_word_zr_reg>,\ ; 6=wd,wn + <TMPL_word_gen_reg,TMPL_word_gen_reg>,\ ; 7=wd,wn + <TMPL_word_gen_reg,TMPL_imm>,\ ; 8=wd,imm + <TMPL_word_gen_reg,TMPL_vect_element_s>,\ ; 9=wd,vn.s[] + <TMPL_dword_sp_reg,TMPL_dword_s_reg>,\ ;10=xd,xn + <TMPL_dword_sp_reg,TMPL_imm64>,\ ;11=xd,imm + <TMPL_dword_zr_reg,TMPL_dword_z_reg>,\ ;12=xd,xn + <TMPL_dword_zr_reg,TMPL_imm64>,\ ;13=xd,imm + <TMPL_dword_zr_reg,TMPL_vect_element_d>,\ ;14=xd,vn.d[] + <TMPL_dword_gen_reg,TMPL_dword_sp_reg>,\ ;15=xd,wn + <TMPL_dword_gen_reg,TMPL_dword_zr_reg>,\ ;16=xd,wn + <TMPL_dword_gen_reg,TMPL_dword_gen_reg>,\ ;17=xd,wn + <TMPL_dword_gen_reg,TMPL_imm64>,\ ;18=xd,imm + <TMPL_dword_gen_reg,TMPL_vect_element_d>,\ ;19=xd,vn.d[] + <TMPL_vect_breg,TMPL_vect_element_b>,\ ;20=bd,vn.b[] + <TMPL_vect_hreg,TMPL_vect_element_h>,\ ;21=hd,vn.h[] + <TMPL_vect_sreg,TMPL_vect_element_s>,\ ;22=sd,vn.s[] + <TMPL_vect_dreg,TMPL_vect_element_d>,\ ;23=dd,vn.d[] + <TMPL_vect_element_b,TMPL_vect_element_b>,\ ;24=vd.b[],vn.b[] + <TMPL_vect_element_b,TMPL_word_z_reg>,\ ;25=vd.b[],wn + <TMPL_vect_element_h,TMPL_vect_element_h>,\ ;26=vd.h[],vn.h[] + <TMPL_vect_element_h,TMPL_word_z_reg>,\ ;27=vd.h[],wn + <TMPL_vect_element_s,TMPL_vect_element_s>,\ ;28=vd.s[],vn.s[] + <TMPL_vect_element_s,TMPL_word_z_reg>,\ ;29=vd.s[],wn + <TMPL_vect_element_d,TMPL_vect_element_d>,\ ;30=vd.d[],vn.d[] + <TMPL_vect_element_d,TMPL_dword_z_reg>,\ ;31=vd.d[],xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;32=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b> ;33=vd,vn + .encode: + cmp al,20 + jae .vector + cmp al,10 + setae cl + shl ecx,31 + mov ebp,ecx + sets cl + neg cl + and cl,10 + sub al,cl + cmp al,4 + jz .gen_vect + cmp al,9 + jz .gen_vect + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + cmp al,0 + jz .reg_sp + cmp al,1 + jz .imm_sp + cmp al,3 + jz .imm_gen + cmp al,8 + jz .imm_gen + cmp al,5 + jz .reg_sp + .reg_gen: + mov cl,[operand_register1] + mov [operand_register2],cl + or ebp,0x2a0003e0 + jmp ARM64_dz_nz_mz.encode_rd + .reg_sp: + or ebp,0x11000000 + jmp ARM64_dz_nz_mz.encode_rd + .imm_gen: + or ebp,0x52800000 + mov eax,[immediate_value] + mov edx,[immediate_value_high] + .try_wide_immediate: + mov cl,0 + test ebp,ebp + js .check_wide_loop + xor edx,edx + .check_wide_loop: + test edx,edx + setz bh + test eax,0xffff0000 + setz bl + and bl,bh + jnz .put_wide_immediate + mov ebx,eax + shrd eax,edx,16 + shrd edx,ebx,16 + inc cl + cmp cl,4 + jb .check_wide_loop + not edx + not eax + btr ebp,30 ;try inverted + jc .try_wide_immediate + cmp [operand_register0],0x1f ;ZR? + mov ecx,ERROR_immediate_cannot_be_encoded + jz ARM_store_instruction_with_error + and ebp,1 shl 31 + .imm_sp: + or ebp,0x320003e0 + js .immediate_prepared + mov eax,[immediate_value] + mov [immediate_value_high],eax + .immediate_prepared: + call ARM64_encode_bitmask + mov ecx,ERROR_immediate_cannot_be_encoded + jc ARM_store_instruction_with_error + mov edx,eax + jmp ARM64_arithmetic1.encode_immediate + .put_wide_immediate: + shl eax,5 + or ebp,eax + movzx ecx,cl + shl ecx,21 + or ebp,ecx + jmp ARM64_dz_nz_mz.encode_rd + .gen_vect: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + shr ebp,1 ;set Q + setnz cl + add cl,18 + or ebp,0x0e003c00 + mov eax,[immediate_value2] + .encode_imm5: + add eax,eax + inc eax + shl eax,cl + or ebp,eax + jmp ARM64_dz_nz_mz.encode_rd + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + cmp al,24 + jb .scalar + cmp al,32 + jae .vect_vect + shr al,1 + jc .vect_gen + ;vector element to vector element + lea ecx,[eax-12+11] + mov eax,[immediate_value2] + shl eax,cl + lea ebp,[eax+0x6e000400] + add cl,5 + mov eax,[immediate_value] + jmp .encode_imm5 + .scalar: + lea ecx,[eax-20+16] + mov ebp,0x5e000400 + mov eax,[immediate_value2] + jmp .encode_imm5 + .vect_vect: + shr al,1 + setc al + shl eax,30 + lea ebp,[eax+0x0ea01c00] + mov al,[operand_register1] + mov [operand_register2],al + jmp ARM64_dz_nz_mz.encode_rd + .vect_gen: + lea ecx,[eax-12+16] + mov ebp,0x4e001c00 + mov eax,[immediate_value] + jmp .encode_imm5 + +ARM64_mov_wide: + ;used by MOVK, MOVN, MOVZ + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_imm64>,\ ;0=wd,imm + <TMPL_word_z_reg,TMPL_imm64,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;1=wd,imm,lsl imm + <TMPL_dword_z_reg,TMPL_imm64>,\ ;2=xd,imm + <TMPL_dword_z_reg,TMPL_imm64,TMPL_comma,TMPL_lsl,TMPL_imm2> ;3=xd,imm,lsl imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] + shr al,1 + shl eax,31 + or ebp,eax + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ebx,eax + or ebx,edx + jz .check_immediate_zero + mov ecx,[immediate_value2] + cmp ecx,64 + jae .out_of_range + cmp ecx,32 + jb .do_shift + mov edx,eax + xor eax,eax + sub ecx,32 + .do_shift: + xor ebx,ebx + shld ebx,edx,cl + test ebx,ebx + jnz .out_of_range + shld edx,eax,cl + test edx,edx + jz .imm32_okay + test ebp,ebp + jns .out_of_range + .imm32_okay: + shl eax,cl + .check_immediate: + test edx,edx + jnz .try_next_shift + test eax,0xffff0000 + jz .immediate_okay + .try_next_shift: + test eax,0xffff + jnz .out_of_range + shrd eax,edx,16 + shr edx,16 + inc bl + cmp bl,4 + jb .check_immediate + jmp .out_of_range + .check_immediate_zero: + mov ebx,[immediate_value2] + bt ebp,29 ;MOVK? + jnc .scale_shift + ;for MOVK we have to honour the shift value + .encode_shift: + test ebx,not 3 shl 4 + jnz .out_of_range + .scale_shift: + ;otherwise use floor(value/16) + shr ebx,4 + .immediate_okay: + shl ebx,21 + shl eax,5 + or ebp,ebx + or ebp,eax + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + .out_of_range: + test ebp,ebp + mov ecx,ERROR_immediate_value_out_of_range.0_0xffff_lsl_16 + mov edx,ERROR_immediate_value_out_of_range.0_0xffff_lsl_48 + cmovs ecx,edx + jmp ARM_store_instruction_with_error + +ARM64_arithmetic6: + ;used by MUL + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 0=wd,wn,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ; 1=xd,xn,xm + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 2=vd,vn,vm + <TMPL_never>,\ ; 3 + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 4=vd,vn,vm + <TMPL_never>,\ ; 5 + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 6=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_element_h>,\ ; 7=vd,vn,vm.h[] + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 8=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_element_h>,\ ; 9=vd,vn,vm.h[] + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;10=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_element_s>,\ ;11=vd,vn,vm.s[] + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;12=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_element_s> ;13=vd,vn,vm.s[] + cmp al,1 + ja .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + shl eax,31 + lea ebp,[eax+0x1b007c00] + jmp ARM64_dz_nz_mz.encode_rd + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + sub al,2 + mov ebp,0x0e209c00 ;vector + mov ebx,0x0f008000 ;element + .vector_encode: + shr al,1 + setc dl ;element flag + shr al,1 + setc cl ;Q + shl ecx,30 + movzx eax,al ;size + shl eax,22 + or ecx,eax + test dl,dl + jnz .element + or ebp,ecx + jmp ARM64_dz_nz_mz.encode_rd + .element: + lea ebp,[ecx+ebx] + mov edx,[immediate_value2] + shr eax,22-4 + cmp al,[operand_register2] + jbe ERROR_vector_register_out_of_range + mov cl,al + shr cl,5 + shl edx,cl + mov eax,edx + mov ecx,edx + and edx,100b + and eax,011b + shl edx,11-2 ;H + shl eax,20-0 ;L:M + or ebp,edx + or ebp,eax + jmp ARM64_dz_nz_mz.encode_rd + +ARM64_arithmetic7: + ;used by MVN + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op,TMPL_imm>,\ ;1=wd,wm,shift imm + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;2=xd,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op,TMPL_imm>,\ ;3=xd,xm,shift imm + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;4=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b> ;5=vd,vn + cmp al,4 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + shr al,2 + setc al + shl eax,31 + lea ebp,[eax+0x2a2003e0] + mov al,[operand_register1] + mov [operand_register2],al + jmp ARM64_arithmetic1.encode_shifted_register + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + shl eax,31 + shr eax,1 + lea ebp,[eax+0x2e205800] + jmp ARM64_dz_nz_mz.encode_rd + +ARM64_arithmetic8: + ;used by NEG, NEGS + bt ecx,29 + jnc .non_S + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op3,TMPL_imm>,\ ;1=wd,wm,shift imm + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;2=xd,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op3,TMPL_imm> ;3=xd,xm,shift imm + jmp .encode + .non_S: + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ; 0=wd,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op3,TMPL_imm>,\ ; 1=wd,wm,shift imm + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ; 2=xd,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op3,TMPL_imm>,\ ; 3=xd,xm,shift imm + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 4=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 5=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 6=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 7=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 8=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ; 9=vd,vn + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ;10=dd,dn + <TMPL_vect_v2d,TMPL_vect_v2d> ;11=vd,vn + .encode: + mov ebp,[arm64_instruction] ;recover the template + cmp al,4 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov dl,[operand_register1] + mov [operand_register2],dl + cmp al,2 + setae cl + add al,cl + jmp ARM64_arithmetic2.encode + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,0x2e20b800 + sub al,4 + jmp ARM64_arithmetic1.vector_encode + +ARM64_arithmetic9: + ;used by NGC, NGCS + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg> ;1=xd,xm + mov dl,[operand_register1] + mov [operand_register2],dl + jmp ARM64_dz_nz_mz.encode + +ARM64_prefetch: + ;used by PRFM + call decode_template + TEMPLATE \ + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0=op,[xn] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_never>,\ ; 1 + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ; 2=op,[xn,imm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_never>,\ ; 3 + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ; 4=op,[xn,wm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 5=op,[xn,wm,extend] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ; 6=op,[xn,wm,extend imm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ; 7=op,[xn,wm,lsl imm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ; 8=op,[xn,xm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ; 9=op,[xn,xm,extend] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;10=op,[xn,xm,extend imm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;11=op,[xn,xm,lsl imm] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;12=op,[address] + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_never>,\ ;13= + <TMPL_imm2,TMPL_comma,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ;14=op,[address] + <TMPL_imm2,TMPL_comma,TMPL_address64>,\ ;15=op,address + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;16=op,[xn] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_never>,\ ;17 + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_imm,TMPL_bracket_right>,\ ;18=op,[xn,imm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_never>,\ ;19 + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_bracket_right>,\ ;20=op,[xn,wm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;21=op,[xn,wm,extend] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;22=op,[xn,wm,extend imm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_word_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;23=op,[xn,wm,lsl imm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_bracket_right>,\ ;24=op,[xn,xm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_bracket_right>,\ ;25=op,[xn,xm,extend] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_extend,TMPL_imm,TMPL_bracket_right>,\ ;26=op,[xn,xm,extend imm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_dword_z_reg,TMPL_lsl,TMPL_imm,TMPL_bracket_right>,\ ;27=op,[xn,xm,lsl imm] + <TMPL_prf_op,TMPL_bracket_left,TMPL_expression,TMPL_bracket_right>,\ ;28=op,[address] + <TMPL_prf_op,TMPL_bracket_left,TMPL_never>,\ ;29= + <TMPL_prf_op,TMPL_bracket_left,TMPL_address64,TMPL_bracket_right>,\ ;30=op,[address] + <TMPL_prf_op,TMPL_address64> ;31=op,address + cmp al,16 + jae .check_literal + mov edx,[operand_registers] + mov ecx,[immediate_value2] + shl edx,8 + mov dl,cl + mov [operand_registers],edx + cmp ecx,0x1f + mov ecx,ERROR_immediate_value_out_of_range.0_31 + ja ARM_store_instruction_with_error + add al,16 + .check_literal: + cmp al,30 + jb ARM64_memory.decode + mov ch,4 ;set literal size for Xt + jmp ARM64_memory.do + +ARM64_arithmetic10: + ;used by RBIT + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;1=xd,xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;2=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b> ;3=vd,vn + mov ebp,[arm64_instruction] ;recover the template + cmp al,2 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + shl eax,31 + or ebp,eax ;set sf + jmp ARM64_arithmetic1.encode_rn + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + and al,1 + shl eax,30 ;set Q + lea ebp,[eax+0x2e605800] + jmp ARM64_arithmetic1.encode_rn + +ARM64_ret: + ;used by RET + call decode_template + TEMPLATE \ + <TMPL_EOL>,\ ;0=empty + <TMPL_dword_z_reg> ;1=xn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,[operand_register0] + mov ecx,30 + cmp al,1 + cmovnz eax,ecx + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_arithmetic11: + ;used by REV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wm + <TMPL_dword_z_reg,TMPL_dword_z_reg> ;1=xd,xm + movzx ecx,al + shl ecx,10 + or [arm64_instruction],ecx + jmp ARM64_dz_nz_mz.encode + +ARM64_arithmetic12: + ;used by REV16 + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wd,wn + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;1=xd,xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;2=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b> ;3=vd,vn + mov ebp,[arm64_instruction] ;recover the template + cmp al,2 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + shl eax,31 + or ebp,eax ;set sf + jmp ARM64_arithmetic1.encode_rn + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + and al,1 + shl eax,30 ;set Q + lea ebp,[eax+0x0e201800] + jmp ARM64_arithmetic1.encode_rn + +ARM64_arithmetic13: + ;used by REV32 + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;1=xd,xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;2=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ;3=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ;4=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h> ;5=vd,vn + mov ebx,0x2e200800 + .do: + mov ebp,[arm64_instruction] ;recover the template + cmp al,1 + jae .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + jmp ARM64_arithmetic1.encode_rn + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,ebx + dec al + shr al,1 + setc cl + shl ecx,30 ;set Q + mov ah,0 + shl eax,22 ;set size + or ebp,ecx + or ebp,eax + jmp ARM64_arithmetic1.encode_rn + +ARM64_arithmetic14: + ;used by REV64 + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;1=xd,xn + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;2=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ;3=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ;4=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h>,\ ;5=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;6=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s> ;7=vd,vn + mov ebx,0x0e200800 + jmp ARM64_arithmetic13.do + +ARM64_arithmetic15: + ;used by SMULL, UMULL + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=xd,wn,wm + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;1=vd,vn,vm + <TMPL_never>,\ ;2 + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;3=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_element_h>,\ ;4=vd,vn,vm.h[] + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;5=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_element_s> ;6=vd,vn,vm.s[] + mov ebp,[arm64_instruction] ;recover the template + dec al + jns .vector + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + jmp ARM64_dz_nz_mz_az.encode + .vector: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + shr al,1 + lea eax,[eax+eax] + rcl al,1 + and ebp,1 shl 23 ;isolate U + shl ebp,29-23 + lea ebx,[ebp+0x0f00a000] ;element + or ebp,0x0e20c000 ;vector + jmp ARM64_arithmetic6.vector_encode + +ARM64_sys: + ;used by SYS + call decode_template + TEMPLATE \ + <TMPL_copro_opcode1,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_copro_opcode2>,\ ;0=op1,crn,crm,op2 + <TMPL_copro_opcode1,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_copro_opcode2,TMPL_dword_z_reg> ;1=op1,crn,crm,op2,xt + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + dec al + and al,0x1f ;default register + or al,[operand_register2] + movzx eax,al + or ebp,eax + movzx eax,[copro_opcode1] + cmp eax,7 + mov ecx,ERROR_immediate_value_out_of_range.0_7 + ja ARM_store_instruction_with_error + shl eax,16 + or ebp,eax + movzx eax,[operand_register0] + shl eax,12 + or ebp,eax + movzx eax,[operand_register1] + shl eax,8 + or ebp,eax + movzx eax,[copro_opcode2] + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_sysl: + ;used by SYSL + call decode_template + TEMPLATE \ + <TMPL_dword_z_reg,TMPL_copro_opcode1,TMPL_cpro_reg,TMPL_cpro_reg,TMPL_copro_opcode2> ;0=xt,op1,crn,crm,op2 + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + movzx eax,[operand_register0] + or ebp,eax + movzx eax,[copro_opcode1] + cmp eax,7 + mov ecx,ERROR_immediate_value_out_of_range.0_7 + ja ARM_store_instruction_with_error + shl eax,16 + or ebp,eax + movzx eax,[operand_register1] + shl eax,12 + or ebp,eax + movzx eax,[operand_register2] + shl eax,8 + or ebp,eax + movzx eax,[copro_opcode2] + shl eax,5 + or ebp,eax + jmp ARM64_store_instruction + +ARM64_tb: + ;used by TBNZ + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_imm2,TMPL_comma,TMPL_address64>,\ ;0=wt,imm,address + <TMPL_dword_z_reg,TMPL_imm2,TMPL_comma,TMPL_address64> ;1=xt,imm,address + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_V8 shr 32 + jz ERROR_requires_cpu64_capability_v8 + mov ebp,[arm64_instruction] ;recover the template + test al,al + mov ecx,ERROR_bit_out_of_range.0_63 + mov edx,ERROR_bit_out_of_range.0_31 + cmovz ecx,edx + mov eax,1 shl 6 + mov edx,1 shl 5 + cmovz eax,edx + cmp eax,[immediate_value2] + jbe ARM_store_instruction_with_error + mov eax,[immediate_value2] + mov ecx,eax + and eax,0x1f + shl eax,19 + or ebp,eax + and ecx,0x20 + shl ecx,31-5 + or ebp,ecx + mov eax,[immediate_value] + mov edx,[immediate_value_high] + mov ecx,[addressing_space] + add eax,[ecx+0] + adc edx,[ecx+4] + sub eax,edi + sbb edx,0 + test eax,3 + mov ecx,ERROR_branch_misaligned + jnz ARM_store_instruction_with_error + mov ecx,edx + cdq + cmp ecx,edx + mov ecx,ERROR_branch_too_far + jnz ARM_store_instruction_with_error + cmp eax,0x7fff + jg ARM_store_instruction_with_error + cmp eax,-0x8000 + jl ARM_store_instruction_with_error + and eax,0xfffc + shl eax,5-2 + or ebp,eax + movzx eax,[operand_register0] + or ebp,eax + jmp ARM64_store_instruction + +ARM64_arithmetic16: + ;used by TST + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_word_z_reg>,\ ;0=wn,wm + <TMPL_word_z_reg,TMPL_word_z_reg,TMPL_shift_op,TMPL_imm>,\ ;1=wn,wm,shift imm + <TMPL_word_z_reg,TMPL_imm>,\ ;2=wn,imm + <TMPL_dword_z_reg,TMPL_dword_z_reg>,\ ;3=xn,xm + <TMPL_dword_z_reg,TMPL_dword_z_reg,TMPL_shift_op,TMPL_imm>,\ ;4=xn,xm,shift imm + <TMPL_dword_z_reg,TMPL_imm64> ;5=xn,imm + mov ebp,[arm64_instruction] ;recover the template + mov ecx,[operand_registers] + shl ecx,8 + or ecx,0x1f + mov [operand_registers],ecx + jmp ARM64_arithmetic2.encode + +ARM64_vector_scalar_bhsd_two_reg: + ;used by ABS + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ;1=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h>,\ ;3=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ;5=vd,vn + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ;6=dd,dn + <TMPL_vect_v2d,TMPL_vect_v2d> ;7=vd,vn + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + jmp ARM64_arithmetic1.vector_encode + +ARM64_vector_narrow_low: + ;used by ADDHN, RADDHN, RSUBHN, SUBHN + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;0=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;1=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2d,TMPL_vect_v2d> ;2=vd,vn,vm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + mov ah,0 + shl eax,22 + or ebp,eax + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_narrow_high: + ;used by ADDHN2, RADDHN2, RSUBHN2, SUBHN2 + call decode_template + TEMPLATE \ + <TMPL_vect_v16b,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;0=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;1=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v2d,TMPL_vect_v2d> ;2=vd,vn,vm + jmp ARM64_vector_narrow_low.encode + +ARM64_vector_narrow_3reg_scalar_2reg: + ;used by ADDP + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;1=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;3=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;5=vd,vn,vm + <TMPL_vect_dreg,TMPL_vect_v2d>,\ ;6=dn,vn + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d> ;7=vd,vn,vm + cmp al,6 + jnz ARM64_vector_scalar_bhsd_two_reg.encode + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + xor ebp,0x50110400 + jmp ARM64_arithmetic1.vector_encode + +ARM64_vector_reduce_bhs: + ;used by ADDV, SMAXV, SMINV, UMAXV, UMINV + call decode_template + TEMPLATE \ + <TMPL_vect_breg,TMPL_vect_v8b>,\ ;0=vd,vn + <TMPL_vect_breg,TMPL_vect_v16b>,\ ;1=vd,vn + <TMPL_vect_hreg,TMPL_vect_v4h>,\ ;2=vd,vn + <TMPL_vect_hreg,TMPL_vect_v8h>,\ ;3=vd,vn + <TMPL_never>,\ ;4=- + <TMPL_vect_sreg,TMPL_vect_v4s> ;5=vd,vn + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_crypto_two_reg: + ;used by AESD, AESE, AESIMC, AESMC + call decode_template + TEMPLATE \ + <TMPL_vect_v16b,TMPL_vect_v16b> ;0=vd,vn + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_CRYPTO shr 32 + jz ERROR_requires_cpu64_capability_crypto + mov ebp,[arm64_instruction] ;recover the template + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_scalar_b_three_reg: + ;used by BIF, BIT, BSL, PMUL + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b> ;1=vd,vn,vm + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_scalar_bhsd_three_reg_zero: + ;used by CMEQ, CMGE, CMGT + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 0=vd,vn,vm + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ; 1=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\; 2=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ; 3=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 4=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ; 5=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 6=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ; 7=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 8=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ; 9=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;10=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ;11=vd,vn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\;12=dd,dn,dm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;13=dd,dn,imm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;14=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm> ;15=vd,vn,imm + shr al,1 + jnc ARM64_vector_scalar_bhsd_two_reg.encode + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ecx,ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz ARM_store_instruction_with_error + mov ebp,[arm64_instruction] + mov ebx,1 shl 29 + 0x05 shl 10 ;eq + mov edx,0 shl 29 + 0x2f shl 10 ;gt + mov ecx,1 shl 29 + 0x2d shl 10 ;eq + test ebp,1 shl 11 + cmovz ecx,edx + test ebp,1 shl 13 ;cmeq? + cmovz ecx,ebx + xor ebp,ecx + jmp ARM64_arithmetic1.vector_encode + +ARM64_vector_scalar_bhsd_three_reg: + ;used by CMHI, CMHS, CMTST, SRSHL, SSHL, URSHL, USHL + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\;1=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;3=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;5=vd,vn,vm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\;6=dd,dn,dm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d> ;7=vd,vn,vm + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_scalar_bhsd_two_reg_zero: + ;used by CMLE, CMLT + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ;2=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ;3=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;4=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ;5=vd,vn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;6=dd,dn,imm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm> ;7=vd,vn,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ecx,ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz ARM_store_instruction_with_error + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_b_two_reg: + ;used by CNT, NOT + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b> ;1=vd,vn + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_dup: + ;used by DUP + call decode_template + TEMPLATE \ + <TMPL_vect_breg,TMPL_vect_element_b>,\ ; 0=bd,vn.b[] + <TMPL_vect_hreg,TMPL_vect_element_h>,\ ; 1=hd,vn.h[] + <TMPL_vect_sreg,TMPL_vect_element_s>,\ ; 2=sd,vn.s[] + <TMPL_vect_dreg,TMPL_vect_element_d>,\ ; 3=dd,vn.d[] + <TMPL_vect_v8b,TMPL_vect_element_b>,\ ; 4=bd,vn.b[] + <TMPL_vect_v8b,TMPL_word_z_reg>,\ ; 5=bd,wn + <TMPL_vect_v16b,TMPL_vect_element_b>,\ ; 6=bd,vn.b[] + <TMPL_vect_v16b,TMPL_word_z_reg>,\ ; 7=bd,wn + <TMPL_vect_v4h,TMPL_vect_element_h>,\ ; 8=hd,vn.h[] + <TMPL_vect_v4h,TMPL_word_z_reg>,\ ; 9=hd,wn + <TMPL_vect_v8h,TMPL_vect_element_h>,\ ;10=hd,vn.h[] + <TMPL_vect_v8h,TMPL_word_z_reg>,\ ;11=hd,wn + <TMPL_vect_v2s,TMPL_vect_element_s>,\ ;12=sd,vn.s[] + <TMPL_vect_v2s,TMPL_word_z_reg>,\ ;13=sd,wn + <TMPL_vect_v4s,TMPL_vect_element_s>,\ ;14=sd,vn.s[] + <TMPL_vect_v4s,TMPL_word_z_reg>,\ ;15=sd,wn + <TMPL_never>,\ ;16=- + <TMPL_never>,\ ;17=- + <TMPL_vect_v2d,TMPL_vect_element_d>,\ ;18=dd,vn.d[] + <TMPL_vect_v2d,TMPL_dword_z_reg> ;19=dd,xn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + sub al,4 + jae .reg_element + lea ecx,[eax+4+16] + mov ebp,0x5e000400 + mov eax,[immediate_value2] + jmp ARM64_mov_aliases.encode_imm5 + .reg_element: + mov ebp,0x0e000400 + shr al,1 + setc dl + movzx edx,dl + shl edx,11 + or ebp,edx + shr al,1 + lea ecx,[eax+16] + setc al + shl eax,30 + or ebp,eax + mov eax,[immediate_value2] + jmp ARM64_mov_aliases.encode_imm5 + +ARM64_vector_b_three_reg_imm: + ;used by EXT + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm> ;1=vd,vn,vm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + mov edx,[immediate_value] + mov ecx,ERROR_immediate_value_out_of_range.0_7 + mov ebx,ERROR_immediate_value_out_of_range.0_15 + test al,al + cmovnz ecx,ebx + setnz bl + movzx ebx,bl + lea ebx,[ebx*8+8] + cmp edx,ebx + jae ARM_store_instruction_with_error + shl edx,11 + or ebp,edx + jmp ARM64_arithmetic1.vector_encode + +ARM64_vector_scalar_sd_three_reg: + ;used by FABD, FACGE, FACGT, FADD, FDIV, FMAX, FMAXNM, FMIN, FMINNM, FRECPS, FRSQRTS, FSUB + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\;0=sd,sn,sm sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\;1=dd,dn,dm sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;2=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;3=vd,vn,vm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s> ;4=vd,vn,vm sz=0 q=1 + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + cmp al,2 + cmovb ebp,[arm64_instruction] ;recover the scalar template + cmovae ebp,[arm64_instruction2] ;recover the vector template + cmp al,3 + setae cl + and eax,1 + shl eax,22 + or ebp,eax ;set sz + shl ecx,30 + or ebp,ecx ;set Q + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_scalar_sd_two_reg: + ;used by FABS, FNEG, FRECPE, FRINTA, FRINTI, FRINTM, FRINTN, FRINTP, FRINTX, FRINTZ, FRSQRTE, FSQRT + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ;1=dd,dn sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;2=vd,vn sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d>,\ ;3=vd,vn sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s> ;4=vd,vn sz=0 q=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_scalar_sd_pairs: + ;used by FADDP, FMAXNMP, FMAXP, FMINNMP, FMINP + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_v2s>,\ ;0=sd,vn sz=0 + <TMPL_vect_dreg,TMPL_vect_v2d>,\ ;1=dd,vn sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;2=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;3=vd,vn,vm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s> ;4=vd,vn,vm sz=0 q=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_conditional_compare_float: + ;used by FCCMP, FCCMPE + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm,TMPL_comma,TMPL_condition_nv>,\ ;0=sn,sm,imm,cond + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm,TMPL_comma,TMPL_condition_nv> ;1=dn,dm,imm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + mov ebp,[arm64_instruction] + and eax,1 + shl eax,22 ;set sz + or ebp,eax + xor eax,eax + jmp ARM64_conditional_compare.encode + +ARM64_vector_scalar_sd_compare_mask_eq: + ;used by FCMEQ + push 0x00803c00 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\;0=sd,sn,sm sz=0 + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ;1=sd,sn,imm sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\;2=dd,dn,dm sz=1 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;3=dd,dn,imm sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;5=vd,vn,imm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;6=vd,vn,vm sz=1 q=1 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ;7=vd,vn,imm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;8=vd,vn,vm sz=0 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm> ;9=vd,vn,imm sz=0 q=1 + pop edx + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + shr al,1 + jnc ARM64_vector_scalar_sd_three_reg.do + mov ecx,ERROR_immediate_offset_out_of_range.0 + cmp [immediate_value],0 + jnz ARM_store_instruction_with_error + xor [arm64_instruction],edx + xor [arm64_instruction2],edx + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_scalar_sd_compare_mask_ge: + ;used by FCMGE + push 0x00802c00 + jmp ARM64_vector_scalar_sd_compare_mask_eq.do + +ARM64_vector_scalar_sd_compare_mask_gt: + ;used by FCMGT + push 0x20002c00 + jmp ARM64_vector_scalar_sd_compare_mask_eq.do + +ARM64_vector_scalar_sd_compare_mask_le: + ;used by FCMLE, FCMLT + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ;0=sd,sn,imm sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;1=dd,dn,imm sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;2=vd,vn,imm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ;3=vd,vn,imm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm> ;4=vd,vn,imm sz=0 q=1 + xor edx,edx + lea eax,[eax*2+1] + jmp ARM64_vector_scalar_sd_compare_mask_eq.encode + +ARM64_scalar_sd_compare: + ;used by FCMP, FCMPE + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn sz=0 opc=0 + <TMPL_vect_sreg,TMPL_imm>,\ ;1=sd,imm sz=0 opc=1 + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ;2=dd,dn sz=1 opc=0 + <TMPL_vect_dreg,TMPL_imm> ;3=dd,imm sz=1 opc=1 + mov edx,0x00000008 + mov ecx,[operand_registers] + shl ecx,8 + mov [operand_registers],ecx + jmp ARM64_vector_scalar_sd_compare_mask_eq.encode + +ARM64_scalar_conditional_select: + ;used by FCSEL + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg,TMPL_condition_nv>,\ ;0=sd,sn,sm,cond + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg,TMPL_condition_nv> ;1=dd,dn,dm,cond + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + mov ebp,[arm64_instruction] + and eax,1 + shl eax,22 + jmp ARM64_conditional_select.encode + +ARM64_scalar_hsd_convert: + ;used by FCVT + call decode_template + TEMPLATE \ + <TMPL_vect_hreg,TMPL_never>,\ ;0=- opc=11 type=11 + <TMPL_vect_hreg,TMPL_vect_sreg>,\ ;1=hd,sn opc=11 type=00 + <TMPL_vect_hreg,TMPL_vect_dreg>,\ ;2=hd,dn opc=11 type=01 + <TMPL_vect_sreg,TMPL_vect_hreg>,\ ;3=sd,hn opc=00 type=11 + <TMPL_vect_sreg,TMPL_never>,\ ;4=- opc=00 type=00 + <TMPL_vect_sreg,TMPL_vect_dreg>,\ ;5=sd,dn opc=00 type=01 + <TMPL_vect_dreg,TMPL_vect_hreg>,\ ;6=dd,hn opc=01 type=11 + <TMPL_vect_dreg,TMPL_vect_sreg> ;7=dd,sn opc=01 type=00 + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + mov ebp,[arm64_instruction] + mov ah,0 + mov cl,3 + div cl ;al=opc, ah=type + dec ah + dec al + mov cl,ah + and eax,3 + and ecx,3 + shl eax,15 + shl ecx,22 + or ebp,eax + or ebp,ecx + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_scalar_sdwx_two_reg_as: + ;used by FCVTAS + push 0x1e240000 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ;1=dd,dn sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;2=vd,vn sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d>,\ ;3=vd,vn sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ;4=vd,vn sz=0 q=1 + <TMPL_word_z_reg,TMPL_vect_sreg>,\ ;5=wd,sn + <TMPL_word_z_reg,TMPL_vect_dreg>,\ ;6=wd,dn + <TMPL_dword_z_reg,TMPL_vect_sreg>,\ ;7=xd,sn + <TMPL_dword_z_reg,TMPL_vect_dreg> ;8=xd,dn + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + pop edx + cmp al,4 + jbe ARM64_vector_scalar_sd_three_reg.do + sub al,5 + shr al,1 + setc cl + shl eax,31 + mov ch,0 + shl ecx,22 + lea ebp,[edx+eax] + or ebp,ecx + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_scalar_sdwx_two_reg_au: + ;used by FCVTAU + push 0x1e250000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_ms: + ;used by FCVTMS + push 0x1e300000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_mu: + ;used by FCVTMU + push 0x1e310000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_ns: + ;used by FCVTNS + push 0x1e200000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_nu: + ;used by FCVTNU + push 0x1e210000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_ps: + ;used by FCVTPS + push 0x1e280000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_scalar_sdwx_two_reg_pu: + ;used by FCVTPU + push 0x1e290000 + jmp ARM64_vector_scalar_sdwx_two_reg_as.do + +ARM64_vector_convert_long: + ;used by FCVTL + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v4h>,\ ;0=vd,vn sz=0 + <TMPL_vect_v2d,TMPL_vect_v2s> ;1=vd,vn sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_convert_long2: + ;used by FCVTL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v8h>,\ ;0=vd,vn sz=0 + <TMPL_vect_v2d,TMPL_vect_v4s> ;1=vd,vn sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_convert_narrow: + ;used by FCVTN + call decode_template + TEMPLATE \ + <TMPL_vect_v4h,TMPL_vect_v4s>,\ ;0=vd,vn sz=0 + <TMPL_vect_v2s,TMPL_vect_v2d> ;1=vd,vn sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_convert_narrow2: + ;used by FCVTN2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v4s>,\ ;0=vd,vn sz=0 + <TMPL_vect_v4s,TMPL_vect_v2d> ;1=vd,vn sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_convert_odd_narrow: + ;used by FCVTXN + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_dreg>,\ ;0=sd,dn + <TMPL_vect_v2s,TMPL_vect_v2d> ;1=vd,vn + add al,al + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_convert_odd_narrow2: + ;used by FCVTXN2 + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v2d> ;0=vd,vn + shl al,2 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_scalar_sd_convert_zero_s: + ;used by FCVTZS + push 0x1e380000 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ; 0=sd,sn,sm sz=0 + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ; 1=sd,sn,imm sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ; 2=dd,dn,dm sz=1 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ; 3=dd,dn,imm sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 4=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ; 5=vd,vn,imm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d>,\ ; 6=vd,vn,vm sz=1 q=1 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ; 7=vd,vn,imm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ; 8=vd,vn,vm sz=0 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ; 9=vd,vn,imm sz=0 q=1 + <TMPL_word_z_reg,TMPL_vect_sreg>,\ ;10=wd,sn + <TMPL_word_z_reg,TMPL_vect_sreg,TMPL_imm>,\ ;11=wd,sn,imm + <TMPL_word_z_reg,TMPL_vect_dreg>,\ ;12=wd,dn + <TMPL_word_z_reg,TMPL_vect_dreg,TMPL_imm>,\ ;13=wd,dn,imm + <TMPL_dword_z_reg,TMPL_vect_sreg>,\ ;14=xd,sn + <TMPL_dword_z_reg,TMPL_vect_sreg,TMPL_imm>,\ ;15=xd,sn,imm + <TMPL_dword_z_reg,TMPL_vect_dreg>,\ ;16=xd,dn + <TMPL_dword_z_reg,TMPL_vect_dreg,TMPL_imm> ;17=xd,dn,imm + shr al,1 + jnc ARM64_vector_scalar_sdwx_two_reg_as.encode + ;fixed point + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + xor dword[esp],1 shl 21 + xor [arm64_instruction],0x01a14400 + xor [arm64_instruction2],0x01a14400 + .encode: + cmp al,5 + jae .gp_reg + bt eax,0 + call .test_immediate_size + shl ebx,1 + sub ebx,edx + shl ebx,16 + or [arm64_instruction],ebx + or [arm64_instruction2],ebx + jmp ARM64_vector_scalar_sdwx_two_reg_as.encode + jmp ARM64_vector_scalar_sd_three_reg.do + .gp_reg: + cmp al,7 + cmc + call .test_immediate_size + neg edx + and edx,0x3f + shl edx,10 + or dword[esp],edx + jmp ARM64_vector_scalar_sdwx_two_reg_as.encode + jmp ARM64_vector_scalar_sd_three_reg.do + .test_immediate_size: + mov ecx,ERROR_immediate_value_out_of_range.1_32 + mov edx,ERROR_immediate_value_out_of_range.1_64 + cmovc ecx,edx + mov ebx,32 + mov edx,64 + cmovc ebx,edx + mov edx,[immediate_value] + cmp edx,ebx + jae ARM_store_instruction_with_error + ret + +ARM64_vector_scalar_sd_convert_zero_u: + ;used by FCVTZU + push 0x1e390000 + jmp ARM64_vector_scalar_sd_convert_zero_s.do + +ARM64_scalar_sd_four_reg: + ;used by FMADD, FMSUB, FNMADD, FNMSUB + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn,sm,sa sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg> ;1=dd,dn,dm,sa sz=1 + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + mov ebp,[arm64_instruction] + .encode_size: + mov ah,0 + shl eax,22 + or ebp,eax + jmp ARM64_dz_nz_mz_az.encode_rd + +ARM64_vector_4_to_1: + ;used by FMAXNMV, FMAXV, FMINNMV, FMINV + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_v4s> ;0=sd,vn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + jmp ARM64_dz_nz_mz.do + +ARM64_vector_scalar_sd_two_reg_element_add: + ;used by FMLA + push 0x0e20cc00 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_element_s>,\ ;0=sd,sn,vn.s[] sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_element_d>,\ ;1=dd,dn,vn.d[] sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_element_s>,\ ;2=vd,vn,vn.s[] sz=0 q=0 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;3=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_element_d>,\ ;4=vd,vn,vn.d[] sz=1 q=1 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;5=vd,vn,vm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_element_s>,\ ;6=vd,vn,vn.s[] sz=0 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s> ;7=vd,vn,vm sz=0 q=1 + pop edx + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + cmp al,2 + jb .scalar + shr al,1 + cmovnc edx,[arm64_instruction2] + inc al + mov [arm64_instruction2],edx + .scalar: + mov edx,[immediate_value2] + mov cl,al + and cl,1 + shl edx,cl + mov ecx,edx + and edx,10b + and ecx,01b + shl edx,11-1 ;H + shl ecx,21-0 ;L + or edx,ecx + or [arm64_instruction],edx + or [arm64_instruction2],edx + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_scalar_sd_two_reg_element_sub: + ;used by FMLS + push 0x0ea0cc00 + jmp ARM64_vector_scalar_sd_two_reg_element_add.do + +align 4 +ARM64_fmov_table: + dd 0x1e260000 ;wd,sn + dd 0x9e660000 ;xd,dn + dd 0x9eae0003 ;xd,vn.d[] + dd 0x9eaf0003 ;vd.d[],xn + dd 0x1e270000 ;sd,wn + dd 0x1e204000 ;sd,sn + dd 0x1e201001 ;sd,imm + dd 0x9e670000 ;dd,xn + dd 0x1e604000 ;dd,dn + dd 0x1e601001 ;dd,imm + dd 0x0f00f402 ;vd,imm + dd 0x6f00f402 ;vd,imm + dd 0x4f00f402 ;vd,imm + +ARM64_fmov: + ;used by FMOV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_vect_sreg>,\ ; 0=wd,sn + <TMPL_dword_z_reg,TMPL_vect_dreg>,\ ; 1=xd,dn + <TMPL_dword_z_reg,TMPL_vect_element_d>,\ ; 2=xd,vn.d[] + <TMPL_vect_element_d,TMPL_dword_z_reg>,\ ; 3=vd.d[],xn + <TMPL_vect_sreg,TMPL_word_z_reg>,\ ; 4=sd,wn + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ; 5=sd,sn + <TMPL_vect_sreg,TMPL_imm_float>,\ ; 6=sd,imm + <TMPL_vect_dreg,TMPL_dword_z_reg>,\ ; 7=dd,xn + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ; 8=dd,dn + <TMPL_vect_dreg,TMPL_imm_float>,\ ; 9=dd,imm + <TMPL_vect_v2s,TMPL_imm_float>,\ ;10=vd,imm op=0 q=0 + <TMPL_vect_v2d,TMPL_imm_float>,\ ;11=vd,imm op=1 q=1 + <TMPL_vect_v4s,TMPL_imm_float> ;12=vd,imm op=0 q=1 + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + movzx eax,al + mov ebp,[ARM64_fmov_table+eax*4] + mov edx,ebp + and ebp,not 3 + cmp dl,1 + jb ARM64_arithmetic1.encode_rn + je .scalar_immediate + cmp dl,2 + ja .check_element + ;vector immediate + call VFP_convert_single_to_quarter + mov eax,[immediate_value] + cmp eax,0xff + ja .out_of_range + mov ecx,eax + and eax,0x1f + and ecx,0xe0 + shl eax,5 + shl ecx,16-5 + or ebp,eax + or ebp,ecx + jmp ARM64_arithmetic1.encode_rd + .scalar_immediate: + call VFP_convert_single_to_quarter + mov eax,[immediate_value] + cmp eax,0xff + ja .out_of_range + shl eax,13 + or ebp,eax + jmp ARM64_arithmetic1.encode_rd + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.quarter + jmp ARM_store_instruction_with_error + .check_element: + mov ebx,[immediate_value] + mov edx,[immediate_value2] + test al,1 + cmovz ebx,edx + mov ecx,ERROR_immediate_offset_out_of_range.1 + cmp ebx,1 + jnz ARM_store_instruction_with_error + jmp ARM64_arithmetic1.encode_rn + +ARM64_vector_scalar_sd_three_reg_element: + ;used by FMUL + push 0x5f809000 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn,sm sz=0 + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_element_s>,\ ;1=sd,sn,v.s[] sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\ ;2=dd,dn,dm sz=1 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_element_d>,\ ;3=dd,dn,v.d[] sz=1 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm sz=0 q=0 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_element_s>,\ ;5=vd,vn,v.s[] sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;6=vd,vn,vm sz=1 q=1 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_element_d>,\ ;7=vd,vn,v.d[] sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;8=vd,vn,vm sz=0 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_element_s> ;9=vd,vn,v.s[] sz=0 q=1 + pop edx + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + shr al,1 + jnc ARM64_vector_scalar_sd_three_reg.do + mov ebx,[immediate_value2] + mov cl,al + and cl,1 + shl ebx,cl + mov ecx,ebx + and ebx,10b + and ecx,01b + shl ebx,11-1 ;H + shl ecx,21-0 ;L + or ebx,ecx + or edx,ebx + mov [arm64_instruction],edx + xor edx,5 shl 28 + mov [arm64_instruction2],edx + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_vector_scalar_sd_three_reg_element_x: + ;used by FMULX + push 0x7f809000 + jmp ARM64_vector_scalar_sd_three_reg_element.do + +ARM64_scalar_sd_three_reg: + ;used by FNMUL + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\;0=sd,sn,sm sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg> ;1=dd,dn,dm sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_scalar_sd_rwo_reg: + ;used by FRECPX + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ;0=sd,sn sz=0 + <TMPL_vect_dreg,TMPL_vect_dreg> ;1=dd,dn sz=1 + jmp ARM64_vector_scalar_sd_three_reg.do + +ARM64_ins: + ;used by INS + call decode_template + TEMPLATE \ + <TMPL_vect_element_b,TMPL_vect_element_b>,\ ;0=vd.b[],vn.b[] + <TMPL_vect_element_b,TMPL_word_z_reg>,\ ;1=vd.b[],wn + <TMPL_vect_element_h,TMPL_vect_element_h>,\ ;2=vd.h[],vn.h[] + <TMPL_vect_element_h,TMPL_word_z_reg>,\ ;3=vd.h[],wn + <TMPL_vect_element_s,TMPL_vect_element_s>,\ ;4=vd.s[],vn.s[] + <TMPL_vect_element_s,TMPL_word_z_reg>,\ ;5=vd.s[],wn + <TMPL_vect_element_d,TMPL_vect_element_d>,\ ;6=vd.d[],vn.d[] + <TMPL_vect_element_d,TMPL_dword_z_reg> ;7=vd.d[],xn + add al,24 + jmp ARM64_mov_aliases.encode + +align 4 +ARM64_ld1_error_table1: + dd ERROR_immediate_offset_out_of_range.8 + dd ERROR_immediate_offset_out_of_range.16 + dd ERROR_immediate_offset_out_of_range.24 + dd ERROR_immediate_offset_out_of_range.32 + dd 0 + dd ERROR_immediate_offset_out_of_range.48 + dd 0 + dd ERROR_immediate_offset_out_of_range.64 +ARM64_ld1_opcode_table1: + db 5,8,4,0 +ARM64_ld1_error_table2: + dd ERROR_immediate_offset_out_of_range.1 + dd ERROR_immediate_offset_out_of_range.2 + dd ERROR_immediate_offset_out_of_range.3 + dd ERROR_immediate_offset_out_of_range.4 + dd 0 + dd ERROR_immediate_offset_out_of_range.6 + dd 0 + dd ERROR_immediate_offset_out_of_range.8 + dd 0 + dd 0 + dd 0 + dd ERROR_immediate_offset_out_of_range.12 + dd 0 + dd 0 + dd 0 + dd ERROR_immediate_offset_out_of_range.16 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd ERROR_immediate_offset_out_of_range.24 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd 0 + dd ERROR_immediate_offset_out_of_range.32 +ARM64_ld1_opcode_table2: + db 0,16,32,33 + +ARM64_ld1: + ;used by LD1, ST1 + push 0x00000401 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0={vt.8b},[xn] + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 1={vt.8b},[xn],xm + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 2={vt.8b},[xn],imm + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 3={vt.16b},[xn] + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 4={vt.16b},[xn],xm + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 5={vt.16b},[xn],imm + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 6={vt.4h},[xn] + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 7={vt.4h},[xn],xm + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 8={vt.4h},[xn],imm + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 9={vt.8h},[xn] + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;10={vt.8h},[xn],xm + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;11={vt.8h},[xn],imm + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;12={vt.2s},[xn] + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;13={vt.2s},[xn],xm + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;14={vt.2s},[xn],imm + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;15={vt.4s},[xn] + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;16={vt.4s},[xn],xm + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;17={vt.4s},[xn],imm + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;18={vt.1d},[xn] + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;19={vt.1d},[xn],xm + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;20={vt.1d},[xn],imm + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;21={vt.2d},[xn] + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;22={vt.2d},[xn],xm + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;23={vt.2d},[xn],imm + <TMPL_vect_list_vb,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;24={vt.b}[imm],[xn] + <TMPL_vect_list_vb,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;25={vt.b}[imm],[xn],xm + <TMPL_vect_list_vb,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;26={vt.b}[imm],[xn],imm + <TMPL_vect_list_vh,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;27={vt.h}[imm],[xn] + <TMPL_vect_list_vh,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;28={vt.h}[imm],[xn],xm + <TMPL_vect_list_vh,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;29={vt.h}[imm],[xn],imm + <TMPL_vect_list_vs,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;30={vt.s}[imm],[xn] + <TMPL_vect_list_vs,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;31={vt.s}[imm],[xn],xm + <TMPL_vect_list_vs,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;32={vt.s}[imm],[xn],imm + <TMPL_vect_list_vd,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;33={vt.d}[imm],[xn] + <TMPL_vect_list_vd,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;34={vt.d}[imm],[xn],xm + <TMPL_vect_list_vd,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2> ;35={vt.d}[imm],[xn],imm + pop ebx + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + cmp [simd_reg_list_count],bl + jb ERROR_parameter_n_not_valid.first + cmp [simd_reg_list_count],bh + ja ERROR_parameter_n_not_valid.first + mov ah,0 + mov cl,3 + div cl ;al=reg selection, ah=address mode + cmp bl,bh + jnz .1d_okay + cmp al,6 + jz ERROR_parameter_n_not_valid.first + .1d_okay: + cmp al,8 + jae .single + mov ebp,[arm64_instruction2] + cmp ah,1 + jz .encode_multiple + ;check immediate + btr ebp,23 + test ah,ah + jz .encode_multiple + bts ebp,23 + mov [operand_register2],0x1f + movzx edx,[simd_reg_list_count] + mov cl,al + and cl,1 + shl edx,cl + mov ecx,[ARM64_ld1_error_table1-4+edx*4] + shl edx,3 + cmp edx,[immediate_value2] + jnz ARM_store_instruction_with_error + .encode_multiple: + movzx eax,al + mov edx,eax + and eax,110b + and edx,001b + shl eax,10-1 + shl edx,30-0 + or ebp,eax ;set size + or ebp,edx ;set Q + movzx edx,[simd_reg_list_count] + mov dl,[ARM64_ld1_opcode_table1-1+edx] + shl edx,12 + or ebp,edx + jmp ARM64_arithmetic1.encode_rm + .single: + cmp [simd_reg_list_count],bl + jnz ERROR_parameter_n_not_valid.first + sub al,8 + mov ebp,[arm64_instruction] + cmp ah,1 + jz .encode_single + ;check immediate + btr ebp,23 + test ah,ah + jz .encode_single + bts ebp,23 + mov [operand_register2],0x1f + movzx ecx,al + movzx edx,[simd_reg_list_count] + shl edx,cl + mov ecx,[ARM64_ld1_error_table2-4+edx*4] + cmp edx,[immediate_value2] + jnz ARM_store_instruction_with_error + .encode_single: + movzx eax,al + mov ecx,eax + mov al,[ARM64_ld1_opcode_table2+eax] + shl eax,10 + or ebp,eax ;set size and opcode + mov edx,[immediate_value] + shl edx,cl + mov eax,edx + and edx,1000b + and eax,0111b + shl edx,30-3 + shl eax,10-0 + or ebp,edx ;set Q + or ebp,eax ;set S:size + jmp ARM64_arithmetic1.encode_rm + +ARM64_ld2: + ;used by LD2, ST2 + push 0x00000202 + jmp ARM64_ld1.do + +ARM64_ld3: + ;used by LD3, ST3 + push 0x00000303 + jmp ARM64_ld1.do + +ARM64_ld4: + ;used by LD4, ST4 + push 0x00000404 + jmp ARM64_ld1.do + +ARM64_ld1r: + ;used by LD1R + push 1 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 0={vt.8b},[xn] + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 1={vt.8b},[xn],xm + <TMPL_vect_list_8b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 2={vt.8b},[xn],imm + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 3={vt.16b},[xn] + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 4={vt.16b},[xn],xm + <TMPL_vect_list_16b,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 5={vt.16b},[xn],imm + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 6={vt.4h},[xn] + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ; 7={vt.4h},[xn],xm + <TMPL_vect_list_4h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ; 8={vt.4h},[xn],imm + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ; 9={vt.8h},[xn] + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;10={vt.8h},[xn],xm + <TMPL_vect_list_8h,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;11={vt.8h},[xn],imm + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;12={vt.2s},[xn] + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;13={vt.2s},[xn],xm + <TMPL_vect_list_2s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;14={vt.2s},[xn],imm + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;15={vt.4s},[xn] + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;16={vt.4s},[xn],xm + <TMPL_vect_list_4s,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;17={vt.4s},[xn],imm + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;18={vt.1d},[xn] + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;19={vt.1d},[xn],xm + <TMPL_vect_list_1d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2>,\ ;20={vt.1d},[xn],imm + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right>,\ ;21={vt.2d},[xn] + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_dword_gen_reg>,\ ;22={vt.2d},[xn],xm + <TMPL_vect_list_2d,TMPL_bracket_left,TMPL_dword_s_reg,TMPL_bracket_right,TMPL_imm2> ;23={vt.2d},[xn],imm + pop ebx + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + cmp [simd_reg_list_count],bl + jnz ERROR_parameter_n_not_valid.first + mov ah,0 + mov cl,3 + div cl ;al=reg selection, ah=address mode + mov ebp,[arm64_instruction] + cmp ah,1 + jz .encode + ;check immediate + btr ebp,23 + test ah,ah + jz .encode + bts ebp,23 + mov [operand_register2],0x1f + movzx ecx,al + shr ecx,1 + movzx edx,[simd_reg_list_count] + shl edx,cl + mov ecx,[ARM64_ld1_error_table2-4+edx*4] + cmp edx,[immediate_value2] + jnz ARM_store_instruction_with_error + .encode: + movzx eax,al + mov edx,eax + and eax,110b + and edx,001b + shl eax,10-1 + shl edx,30-0 + or ebp,eax ;set size + or ebp,edx ;set Q + jmp ARM64_arithmetic1.encode_rm + +ARM64_ld2r: + ;used by LD2R + push 2 + jmp ARM64_ld1r.do + +ARM64_ld3r: + ;used by LD3R + push 3 + jmp ARM64_ld1r.do + +ARM64_ld4r: + ;used by LD4R + push 4 + jmp ARM64_ld1r.do + +ARM64_arithmetic17: + ;used by MLA + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 0=vd,vn,vm + <TMPL_never>,\ ; 1 + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 2=vd,vn,vm + <TMPL_never>,\ ; 3 + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 4=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_element_h>,\ ; 5=vd,vn,vm.h[] + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 6=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_element_h>,\ ; 7=vd,vn,vm.h[] + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 8=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_element_s>,\ ; 9=vd,vn,vm.s[] + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;10=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_element_s> ;11=vd,vn,vm.s[] + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;vector + mov ebx,[arm64_instruction2] ;element + jmp ARM64_arithmetic6.vector_encode + +ARM64_movi_table: + ;Q:op,cmode + db 0000b,1110b,0+0 shl 4,12-3+1 ; 0=vd,imm + db 0000b,1110b,0+0 shl 4,12-3+1 ; 1=vd,imm,lsl imm + db 0100b,1110b,0+0 shl 4,12-3+1 ; 2=vd,imm + db 0100b,1110b,0+0 shl 4,12-3+1 ; 3=vd,imm,lsl imm + db 0000b,1000b,0+1 shl 4,12-3+1 ; 4=vd,imm + db 0000b,1000b,0+1 shl 4,12-3+1 ; 5=vd,imm,lsl imm + db 0100b,1000b,0+1 shl 4,12-3+1 ; 6=vd,imm + db 0100b,1000b,0+1 shl 4,12-3+1 ; 7=vd,imm,lsl imm + db 0000b,0000b,0+3 shl 4,12-3+1 ; 8=vd,imm + db 0000b,0000b,0+3 shl 4,12-3+1 ; 9=vd,imm,lsl imm + db 0000b,1100b,1+2 shl 4,12-3+0 ;10=vd,imm,msl imm + db 0100b,0000b,0+3 shl 4,12-3+1 ;11=vd,imm + db 0100b,0000b,0+3 shl 4,12-3+1 ;12=vd,imm,lsl imm + db 0100b,1100b,1+2 shl 4,12-3+0 ;13=vd,imm,msl imm + db 0010b,1110b,0,0 ;14=dd,imm + db 0110b,1110b,0,0 ;15=vd,imm + +ARM64_movi: + ;used by MOVI + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_imm>,\ ; 0=vd,imm + <TMPL_vect_v8b,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 1=vd,imm,lsl imm + <TMPL_vect_v16b,TMPL_imm>,\ ; 2=vd,imm + <TMPL_vect_v16b,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 3=vd,imm,lsl imm + <TMPL_vect_v4h,TMPL_imm>,\ ; 4=vd,imm + <TMPL_vect_v4h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 5=vd,imm,lsl imm + <TMPL_vect_v8h,TMPL_imm>,\ ; 6=vd,imm + <TMPL_vect_v8h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 7=vd,imm,lsl imm + <TMPL_vect_v2s,TMPL_imm>,\ ; 8=vd,imm + <TMPL_vect_v2s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ; 9=vd,imm,lsl imm + <TMPL_vect_v2s,TMPL_imm,TMPL_comma,TMPL_msl,TMPL_imm2>,\ ;10=vd,imm,msl imm + <TMPL_vect_v4s,TMPL_imm>,\ ;11=vd,imm + <TMPL_vect_v4s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;12=vd,imm,lsl imm + <TMPL_vect_v4s,TMPL_imm,TMPL_comma,TMPL_msl,TMPL_imm2>,\ ;13=vd,imm,msl imm + <TMPL_vect_dreg,TMPL_imm64>,\ ;14=dd,imm + <TMPL_vect_v2d,TMPL_imm64> ;15=vd,imm + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] + cmp al,14 + jae .imm64 + xor ah,ah + ;construct the immediate + mov edx,[immediate_value] + mov ecx,[immediate_value2] + xor ebx,ebx + cmp al,10 ;imm,msl imm + jz .msl + cmp al,13 ;imm,msl imm + jz .msl + test edx,edx + jz .immediate_ready + cmp ecx,32 + jae .out_of_range + shld ebx,edx,cl + test ebx,ebx + jnz .out_of_range + shl edx,cl + jmp .immediate_ready + .msl: + sub al,2 + cmp ecx,32 + jae .out_of_range + inc edx + shld ebx,edx,cl + shl edx,cl + sub edx,1 + sbb ebx,0 + jnz .out_of_range + .immediate_ready: + push eax edx + xor ecx,ecx + test edx,edx + jz .immediate_shifted + bsf ecx,edx + and ecx,not 7 + shr edx,cl + cmp edx,0xff + jbe .immediate_shifted + test ecx,ecx + jnz .try_inverse + cmp al,8 + jb .try_inverse + setz cl + cmp al,11 + setz ch + or cl,ch + lea eax,[eax+ecx+1] + cmp dl,0xff + jnz .try_inverse + mov ecx,8 + shr edx,8 + cmp dl,0xff + jnz .immediate_shifted + mov ecx,16 + shr edx,8 + .immediate_shifted: + cmp edx,0xff + ja .try_inverse + mov [immediate_value],edx + mov [immediate_value2],ecx + movzx eax,al + movzx ecx,byte[ARM64_movi_table+eax*4+2] + shl ecx,3 + mov ebx,ecx + and ecx,0x78 + shr ebx,4 + and ebx,0x78 + mov edx,[immediate_value2] + test edx,0x7 + jnz .try_inverse + cmp edx,ecx + jz .imm2_okay + cmp edx,ebx + ja .try_inverse + .imm2_okay: + sub edx,ecx + movzx ecx,byte[ARM64_movi_table+eax*4+3] + shl edx,cl + or ebp,edx + mov edx,[immediate_value] + add esp,8 + .encode_imm: + mov ecx,edx + and edx,00011111b + and ecx,11100000b + shl edx,5 + shl ecx,16-5 + or ebp,edx + or ebp,ecx + movzx eax,al + movzx edx,byte[ARM64_movi_table+eax*4+0] + movzx ecx,byte[ARM64_movi_table+eax*4+1] + shl edx,28 + shl ecx,12 + or ebp,edx + or ebp,ecx + jmp ARM64_arithmetic1.encode_rd + .imm64: + mov ecx,[immediate_value] + mov ebx,[immediate_value_high] + mov edx,1 shl 7 + .check_imm64: + inc cl + cmp cl,1 + ja .cannot_encode + rcr dl,1 + jc .encode_imm + shrd ecx,ebx,8 + shr ebx,8 + jmp .check_imm64 + .cannot_encode: + mov ecx,ERROR_immediate_cannot_be_encoded + jmp ARM_store_instruction_with_error + .try_inverse: + xor ebp,1 shl 29 + pop edx eax + cmp al,4 + jb .out_of_range + mov ecx,0xffff + mov ebx,0xffffffff + cmp al,8 + cmovb ebx,ecx + xor edx,ebx + xor ah,0xff + jnz .immediate_ready + .out_of_range: + mov ecx,ERROR_immediate_value_out_of_range.0_0xff + cmp al,4 + jb ARM_store_instruction_with_error + mov ecx,ERROR_immediate_value_out_of_range.0_0xff_lsl_8 + cmp al,8 + jb ARM_store_instruction_with_error + mov ecx,ERROR_immediate_value_out_of_range.0_0xff_msl + jmp ARM_store_instruction_with_error + +ARM64_mvni: + ;used by MVNI + call decode_template + TEMPLATE \ + <TMPL_vect_v4h,TMPL_imm>,\ ;0=vd,imm + <TMPL_vect_v4h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;1=vd,imm,lsl imm + <TMPL_vect_v8h,TMPL_imm>,\ ;2=vd,imm + <TMPL_vect_v8h,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;3=vd,imm,lsl imm + <TMPL_vect_v2s,TMPL_imm>,\ ;4=vd,imm + <TMPL_vect_v2s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;5=vd,imm,lsl imm + <TMPL_vect_v2s,TMPL_imm,TMPL_comma,TMPL_msl,TMPL_imm2>,\ ;6=vd,imm,msl imm + <TMPL_vect_v4s,TMPL_imm>,\ ;7=vd,imm + <TMPL_vect_v4s,TMPL_imm,TMPL_comma,TMPL_lsl,TMPL_imm2>,\ ;8=vd,imm,lsl imm + <TMPL_vect_v4s,TMPL_imm,TMPL_comma,TMPL_msl,TMPL_imm2> ;9=vd,imm,msl imm + add al,4 + jmp ARM64_movi.do + +ARM64_polynomial: + ;used by PMULL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v1q,TMPL_vect_v1d,TMPL_vect_v1d> ;1=vd,vn,vm + test al,al + jz ARM64_vector_scalar_bhsd_two_reg.encode + or [arm64_instruction],11b shl 22 + jmp ARM64_crypto_two_reg.do + +ARM64_polynomial2: + ;used by PMULL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;0=vd,vn,vm + <TMPL_vect_v1q,TMPL_vect_v2d,TMPL_vect_v2d> ;1=vd,vn,vm + test al,al + jz ARM64_vector_scalar_bhsd_two_reg.encode + or [arm64_instruction],11b shl 22 + jmp ARM64_crypto_two_reg.do + +ARM64_vector_narrow_shift_low: + ;used by RSHRN, SHRN + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8h,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4s,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2d,TMPL_imm> ;2=vd,vn,imm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + mov cl,al + mov ebx,8 + shl ebx,cl + mov edx,[immediate_value] + cmp edx,ebx + ja .out_of_range + test edx,edx + jz .out_of_range + shl ebx,1 + sub ebx,edx + shl ebx,16 + or ebp,ebx + jmp ARM64_arithmetic1.encode_rn + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.1_8 + mov edx,ERROR_shift_value_out_of_range.1_16 + mov eax,ERROR_shift_value_out_of_range.1_32 + cmp ebx,16 + cmovz ecx,edx + cmova ecx,eax + jmp ARM_store_instruction_with_error + +ARM64_vector_narrow_shift_high: + ;used by RSHRN2, SHRN2, SQRSHRN2, SQRSHRUN2, SQSRHN2, SQSHRUN2, UQRSHRN2, UQSHRN2 + call decode_template + TEMPLATE \ + <TMPL_vect_v16b,TMPL_vect_v8h,TMPL_imm>,\ ;0=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v4s,TMPL_imm>,\ ;1=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v2d,TMPL_imm> ;2=vd,vn,vm + jmp ARM64_vector_narrow_shift_low.encode + +ARM64_vector_bhs_three_reg: + ;used by SABA, SABD, SHADD, SHSUB, SMAX, SMAXP, SMIN, SMINP, SRHADD, + ; UABA, UABD, UHADD, UHSUB, UMAX, UMAXP, UMIN, UMINP, URHADD + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;1=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;3=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s> ;5=vd,vn,vm + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_bhs_three_reg_long: + ;used by SABAL, SABDL, SADDL, SSUBL, UABAL, SABDL, UADDL, USUBL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;1=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_v2s> ;2=vd,vn,vm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_bhs_three_reg_long2: + ;used by SABAL2, SABDL2, SADDL2, SSUBL2, UABAL2, SABDL2, UADDL2, USUBL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;1=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_vect_v4s> ;2=vd,vn,vm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_bhs_two_reg_pair: + ;used by SADALP, SADDLP, UADALP, UADDLP + call decode_template + TEMPLATE \ + <TMPL_vect_v4h,TMPL_vect_v8b>,\ ;0=vd,vn + <TMPL_vect_v8h,TMPL_vect_v16b>,\ ;1=vd,vn + <TMPL_vect_v2s,TMPL_vect_v4h>,\ ;2=vd,vn + <TMPL_vect_v4s,TMPL_vect_v8h>,\ ;3=vd,vn + <TMPL_vect_v1d,TMPL_vect_v2s>,\ ;4=vd,vn + <TMPL_vect_v2d,TMPL_vect_v4s> ;5=vd,vn + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_scalar_vector_bhs_two_reg: + ;used by SADALV, UADDLV + call decode_template + TEMPLATE \ + <TMPL_vect_hreg,TMPL_vect_v8b>,\ ;0=hd,vn + <TMPL_vect_hreg,TMPL_vect_v16b>,\ ;1=hd,vn + <TMPL_vect_sreg,TMPL_vect_v4h>,\ ;2=sd,vn + <TMPL_vect_sreg,TMPL_vect_v8h>,\ ;3=sd,vn + <TMPL_never>,\ ;4=- + <TMPL_vect_dreg,TMPL_vect_v4s> ;5=dd,vn + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_bhs_three_reg_wide: + ;used by SADDW, SSUBW, UADDW, USUBW + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4h>,\ ;1=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2s> ;2=vd,vn,vm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_vector_bhs_three_reg_wide2: + ;used by SADDW2, SSUBW2, UADDW2, USUBW2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v16b>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v8h>,\ ;1=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v4s> ;2=vd,vn,vm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_scalar_vector_sd_convert_zero_s_table: + db 0,1,10,11,14,15,2,3,12,13,16,17,4,5,6,7,8,9 + +ARM64_scalar_vector_sd_convert_zero_s: + ;used by SCVTF + push 0x1e220000 + .do: + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ; 0=sd,sn sz=0 + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ; 1=sd,sn,imm sz=0 + <TMPL_vect_sreg,TMPL_word_z_reg>,\ ; 2=sd,wn + <TMPL_vect_sreg,TMPL_word_z_reg,TMPL_imm>,\ ; 3=sd,wn,imm + <TMPL_vect_sreg,TMPL_dword_z_reg>,\ ; 4=sd,xn + <TMPL_vect_sreg,TMPL_dword_z_reg,TMPL_imm>,\ ; 5=sd,xn,imm + <TMPL_vect_dreg,TMPL_vect_dreg>,\ ; 6=dd,dn sz=1 + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ; 7=dd,dn,imm sz=1 + <TMPL_vect_dreg,TMPL_word_z_reg>,\ ; 8=dd,wn + <TMPL_vect_dreg,TMPL_word_z_reg,TMPL_imm>,\ ; 9=dd,wn,imm + <TMPL_vect_dreg,TMPL_dword_z_reg>,\ ;10=dd,xn + <TMPL_vect_dreg,TMPL_dword_z_reg,TMPL_imm>,\ ;11=dd,xn,imm + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;12=vd,vn sz=0 q=0 + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;13=vd,vn,imm sz=0 q=0 + <TMPL_vect_v2d,TMPL_vect_v2d>,\ ;14=vd,vn sz=1 q=1 + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ;15=vd,vn,imm sz=1 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ;16=vd,vn sz=0 q=1 + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm> ;17=vd,vn,imm sz=0 q=1 + movzx eax,al + mov al,[ARM64_scalar_vector_sd_convert_zero_s_table+eax] + shr al,1 + jnc ARM64_vector_scalar_sdwx_two_reg_as.encode + ;fixed point + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + xor dword[esp],1 shl 21 + xor [arm64_instruction],0x01213c00 + xor [arm64_instruction2],0x01213c00 + jmp ARM64_vector_scalar_sd_convert_zero_s.encode + +ARM64_scalar_vector_sd_convert_zero_u: + ;used by UCVTF + push 0x1e230000 + jmp ARM64_scalar_vector_sd_convert_zero_s.do + +ARM64_sha_qsv: + ;used by SHA1C, SHA1M, SHA1P + call decode_template + TEMPLATE \ + <TMPL_vect_qreg,TMPL_vect_sreg,TMPL_vect_v4s> ;0=qd,sn,vm + jmp ARM64_crypto_two_reg.do + +ARM64_sha_s_two_reg: + ;used by SHA1H + call decode_template + TEMPLATE \ + <TMPL_vect_sreg,TMPL_vect_sreg> ;0=sd,sn + jmp ARM64_crypto_two_reg.do + +ARM64_sha_vs_three_reg: + ;used by SHA1SU0, SHA256SU1 + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s> ;0=vd,vn,vm + jmp ARM64_crypto_two_reg.do + +ARM64_sha_vs_two_reg: + ;used by SHA1SU1, SHA256SU0 + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v4s> ;0=vd,vn + jmp ARM64_crypto_two_reg.do + +ARM64_sha_qqv: + ;used by SHA256H, SHA256H2 + call decode_template + TEMPLATE \ + <TMPL_vect_qreg,TMPL_vect_qreg,TMPL_vect_v4s> ;0=qd,qn,vm + jmp ARM64_crypto_two_reg.do + +ARM64_vector_scalar_bhsd_two_reg_left_imm: + ;used by SHL, SLI + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ;2=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ;3=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;4=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ;5=vd,vn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;6=dd,dn,imm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm> ;7=vd,vn,imm + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + .immediate_encode: + movzx ecx,al + shr ecx,1 + mov edx,8 + shl edx,cl + cmp edx,[immediate_value] + jbe .out_of_range + add edx,[immediate_value] + shl edx,16 + or ebp,edx + .vector_encode: + cmp al,6 ;scalar? + setz dl + shr al,1 + setc cl + shl ecx,30 + or ebp,ecx ;set Q + neg dl + and dl,5 + shl edx,28 + or ebp,edx ;set for scalar + jmp ARM64_arithmetic1.encode_rm + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.0_7 + mov ebx,ERROR_shift_value_out_of_range.0_15 + mov eax,ERROR_shift_value_out_of_range.0_31 + mov ebp,ERROR_shift_value_out_of_range.0_63 + cmp edx,16 + cmovz ecx,ebx + cmp edx,32 + cmovz ecx,eax + cmova ecx,ebp + jmp ARM_store_instruction_with_error + +ARM64_vector_scalar_bhsd_two_reg_right_imm: + ;used by SRI, SRSHR, SRSRA, SSHR, SSRA, URSHR, URSRA, USHR, USRA + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ;2=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ;3=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ;4=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ;5=vd,vn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm>,\ ;6=dd,dn,imm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm> ;7=vd,vn,imm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + .immediate_encode: + movzx ecx,al + shr ecx,1 + mov edx,8 + shl edx,cl + mov ebx,[immediate_value] + test ebx,ebx + je .out_of_range + cmp edx,ebx + jb .out_of_range + add edx,edx + sub edx,ebx + shl edx,16 + or ebp,edx + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.vector_encode + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.1_8 + mov ebx,ERROR_shift_value_out_of_range.1_16 + mov eax,ERROR_shift_value_out_of_range.1_32 + mov ebp,ERROR_shift_value_out_of_range.1_64 + cmp edx,16 + cmovz ecx,ebx + cmp edx,32 + cmovz ecx,eax + cmova ecx,ebp + jmp ARM_store_instruction_with_error + +ARM64_vector_scalar_bhs_long_size: + ;used by SHLL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_imm> ;2=vd,vn,imm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + movzx ecx,al + mov edx,8 + shl edx,cl + cmp edx,[immediate_value] + jne .out_of_range + add al,al + jmp ARM64_arithmetic1.vector_encode + .out_of_range: + mov ecx,ERROR_shift_value_out_of_range.8 + mov ebx,ERROR_shift_value_out_of_range.16 + mov eax,ERROR_shift_value_out_of_range.32 + cmp edx,16 + cmovz ecx,ebx + cmova ecx,eax + jmp ARM_store_instruction_with_error + +ARM64_vector_scalar_bhs_long2_size: + ;used by SHLL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_imm> ;2=vd,vn,imm + jmp ARM64_vector_scalar_bhs_long_size.encode + +ARM64_arithmetic18_long: + ;used by SMLAL, SMLSL, UMLAL, UMLSL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_never>,\ ;1=- + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_element_h>,\ ;3=vd,vn,vm.h[] + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_element_s> ;5=vd,vn,vm.s[] + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;vector + mov ebx,[arm64_instruction2] ;element + shr al,1 + lea eax,[eax+eax] + rcl al,1 + jmp ARM64_arithmetic6.vector_encode + +ARM64_arithmetic18_long2: + ;used by SMLAL2, SMLSL2, SMULL2, UMLAL2, UMLSL2, UMULL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b,TMPL_vect_v16b>,\ ;0=vd,vn,vm + <TMPL_never>,\ ;1=- + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;2=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_vect_element_h>,\ ;3=vd,vn,vm.h[] + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;4=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_vect_element_s> ;5=vd,vn,vm.s[] + jmp ARM64_arithmetic18_long.do + +ARM64_smov: + ;used by SMOV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_vect_element_b>,\ ;0=wd,vn.b[] + <TMPL_word_z_reg,TMPL_vect_element_h>,\ ;1=wd,vn.h[] + <TMPL_never>,\ ;2=- + <TMPL_dword_z_reg,TMPL_vect_element_b>,\ ;3=xd,vn.b[] + <TMPL_dword_z_reg,TMPL_vect_element_h>,\ ;4=xd,vn.h[] + <TMPL_dword_z_reg,TMPL_vect_element_s> ;5=xd,vn.s[] + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + cmp al,3 + jb .Q_okay + or ebp,1 shl 30 + sub al,3 + .Q_okay: + lea ecx,[eax+16] + mov eax,[immediate_value2] + add eax,eax + inc eax + shl eax,cl + or ebp,eax + jmp ARM64_dz_nz_mz.encode_rd + +ARM64_umov: + ;used by UMOV + call decode_template + TEMPLATE \ + <TMPL_word_z_reg,TMPL_vect_element_b>,\ ;0=wd,vn.b[] + <TMPL_word_z_reg,TMPL_vect_element_h>,\ ;1=wd,vn.h[] + <TMPL_word_z_reg,TMPL_vect_element_s>,\ ;2=wd,vn.s[] + <TMPL_dword_z_reg,TMPL_vect_element_d>,\ ;3=xd,vn.d[] + <TMPL_dword_z_reg,TMPL_vect_element_b>,\ ;4=xd,vn.b[] + <TMPL_dword_z_reg,TMPL_vect_element_h>,\ ;5=xd,vn.h[] + <TMPL_dword_z_reg,TMPL_vect_element_s> ;6=xd,vn.s[] + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + and al,3 + cmp al,3 + setae cl + shl ecx,30 + or ebp,ecx + lea ecx,[eax+16] + mov eax,[immediate_value2] + add eax,eax + inc eax + shl eax,cl + or ebp,eax + jmp ARM64_dz_nz_mz.encode_rd + +ARM64_vector_scalar_bhsd_two_reg_q: + ;used by SQABS, SQNEG, SUQADD, USQADD + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 0=vd,vn + <TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 1=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 2=vd,vn + <TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 3=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 4=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s>,\ ; 5=vd,vn + <TMPL_never>,\ ; 6=- + <TMPL_vect_v2d,TMPL_vect_v2d>,\ ; 7=vd,vn + <TMPL_vect_breg,TMPL_vect_breg>,\ ; 8=bd,bn + <TMPL_vect_hreg,TMPL_vect_hreg>,\ ; 9=hd,hn + <TMPL_vect_sreg,TMPL_vect_sreg>,\ ;10=sd,sn + <TMPL_vect_dreg,TMPL_vect_dreg> ;11=dd,dn + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + cmp al,7 + jbe ARM64_arithmetic1.vector_encode + sub al,8 + or ebp,5 shl 28 + jmp ARM64_scalar_sd_four_reg.encode_size + +ARM64_vector_scalar_bhsd_three_reg_q: + ;used by SQADD, SQRSHL, SQSUB, UQADD, UQRSHL, UQSUB + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 1=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 3=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 4=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ; 5=vd,vn,vm + <TMPL_never>,\ ; 6=- + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ; 7=vd,vn,vm + <TMPL_vect_breg,TMPL_vect_breg,TMPL_vect_breg>,\ ; 8=bd,bn,bm + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_vect_hreg>,\ ; 9=hd,hn,hm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\ ;10=sd,sn,sm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg> ;11=dd,dn,dm + .encode: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + cmp al,7 + jbe ARM64_arithmetic1.vector_encode + sub al,8 + or ebp,5 shl 28 + jmp ARM64_scalar_sd_four_reg.encode_size + +ARM64_arithmetic19_long: + ;used by SQDMLAL, SQDMLSL, SQDMULL + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_vect_element_h>,\ ;1=vd,vn,vm.h[] + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;2=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_vect_element_s> ;3=vd,vn,vm.s[] + .do: + add al,2 + jmp ARM64_arithmetic18_long.do + +ARM64_arithmetic19_long2: + ;used by SQDMLAL2, SQDMLSL2, SQDMULL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;0=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_vect_element_h>,\ ;1=vd,vn,vm.h[] + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;2=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_vect_element_s> ;3=vd,vn,vm.s[] + jmp ARM64_arithmetic19_long.do + +ARM64_arithmetic20: + ;used by SQDMULH, SQRDMULH + call decode_template + TEMPLATE \ + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 0=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_element_h>,\ ; 1=vd,vn,vm.h[] + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_element_h>,\ ; 3=vd,vn,vm.h[] + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 4=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_element_s>,\ ; 5=vd,vn,vm.s[] + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ; 6=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_element_s>,\ ; 7=vd,vn,vm.s[] + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_vect_hreg>,\ ; 8=hd,hn,hm + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_vect_element_h>,\ ; 9=hd,hn,vm.h[] + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\ ;10=sd,sn,sm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_element_s> ;11=sd,sn,vm.s[] + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + cmp al,7 + jbe .vector + sub al,8 + shr al,1 + lea eax,[eax+eax] + rcl al,1 + or [arm64_instruction],5 shl 28 + or [arm64_instruction2],5 shl 28 + .vector: + add al,4 + jmp ARM64_arithmetic17.do + +ARM64_vector_scalar_narrow_shift_high: + ;used by SQRSHRN, SQRSHRUN, SQSHRN, SQSHRUN, UQRSHRN, UQSHRN + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8h,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4s,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2d,TMPL_imm>,\ ;2=vd,vn,imm + <TMPL_vect_breg,TMPL_vect_hreg,TMPL_imm>,\ ;3=bd,hn,imm + <TMPL_vect_hreg,TMPL_vect_sreg,TMPL_imm>,\ ;4=hd,sn,imm + <TMPL_vect_sreg,TMPL_vect_dreg,TMPL_imm> ;5=sd,dn,imm + cmp al,3 + jb ARM64_vector_narrow_shift_low.encode + sub al,3 + or [arm64_instruction],0x5 shl 28 + jmp ARM64_vector_narrow_shift_low.encode + +ARM64_vector_scalar_bhsd_shift_reg_imm: + ;used by SQSHL, UQSHL + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ; 0=vd,vn,vm + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ; 1=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\ ; 2=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ; 3=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ; 4=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ; 5=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ; 6=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ; 7=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ; 8=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ; 9=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;10=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ;11=vd,vn,imm + <TMPL_never>,\ ;12=- + <TMPL_never>,\ ;13=- + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d>,\ ;14=vd,vn,vm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ;15=vd,vn,imm + <TMPL_vect_breg,TMPL_vect_breg,TMPL_vect_breg>,\ ;16=bd,bn,bm + <TMPL_vect_breg,TMPL_vect_breg,TMPL_imm>,\ ;17=bd,bn,imm + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_vect_hreg>,\ ;18=hd,hn,hm + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_imm>,\ ;19=hd,hn,imm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_vect_sreg>,\ ;20=sd,sn,sm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ;21=sd,sn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_vect_dreg>,\ ;22=dd,dn,dm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm> ;23=dd,dn,imm + .do: + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + shr al,1 + jc .immediate + mov ebp,[arm64_instruction] ;recover the template + cmp al,7 + jbe ARM64_arithmetic1.vector_encode + sub al,8 + or ebp,5 shl 28 + jmp ARM64_scalar_sd_four_reg.encode_size + .immediate: + mov ebp,[arm64_instruction2] ;recover the other template + cmp al,7 + jbe ARM64_vector_scalar_bhsd_two_reg_left_imm.immediate_encode + sub al,8 + add al,al + or ebp,5 shl 28 + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.immediate_encode + +ARM64_vector_scalar_bhsd_shift_imm: + ;used by SQSHLU + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_imm>,\ ; 0=vd,vn,imm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_imm>,\ ; 1=vd,vn,imm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_imm>,\ ; 2=vd,vn,imm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_imm>,\ ; 3=vd,vn,imm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_imm>,\ ; 4=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_imm>,\ ; 5=vd,vn,imm + <TMPL_never>,\ ; 6=- + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_imm>,\ ; 7=vd,vn,imm + <TMPL_vect_breg,TMPL_vect_breg,TMPL_imm>,\ ; 8=bd,bn,imm + <TMPL_vect_hreg,TMPL_vect_hreg,TMPL_imm>,\ ; 9=hd,hn,imm + <TMPL_vect_sreg,TMPL_vect_sreg,TMPL_imm>,\ ;10=sd,sn,imm + <TMPL_vect_dreg,TMPL_vect_dreg,TMPL_imm> ;11=dd,dn,imm + lea eax,[eax+eax+1] + jmp ARM64_vector_scalar_bhsd_shift_reg_imm.do + +ARM64_vector_scalar_narrow_extract_low: + ;used by SQXTN, SQXTUN, UQXTN + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8h>,\ ;0=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4s>,\ ;1=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2d>,\ ;2=vd,vn + <TMPL_vect_breg,TMPL_vect_hreg>,\ ;3=bd,hn + <TMPL_vect_hreg,TMPL_vect_sreg>,\ ;4=hd,sn + <TMPL_vect_sreg,TMPL_vect_dreg> ;5=sd,dn + cmp al,3 + jb ARM64_vector_narrow_low.encode + sub al,3 + or [arm64_instruction],0x5 shl 28 + jmp ARM64_vector_narrow_low.encode + +ARM64_vector_narrow_extract_low: + ;used by XTN + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8h>,\ ;0=vd,vn + <TMPL_vect_v4h,TMPL_vect_v4s>,\ ;1=vd,vn + <TMPL_vect_v2s,TMPL_vect_v2d> ;2=vd,vn + jmp ARM64_vector_narrow_low.encode + +ARM64_vector_narrow_extract_high: + ;used by SQXTN2, SQXTUN2, UQXTN2, XTN2 + call decode_template + TEMPLATE \ + <TMPL_vect_v16b,TMPL_vect_v8h>,\ ;0=vd,vn + <TMPL_vect_v8h,TMPL_vect_v4s>,\ ;1=vd,vn + <TMPL_vect_v4s,TMPL_vect_v2d> ;2=vd,vn + jmp ARM64_vector_narrow_low.encode + +ARM64_vector_scalar_bhs_long_imm: + ;used by SSHLL, USHLL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v4h,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2d,TMPL_vect_v2s,TMPL_imm> ;2=vd,vn,imm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.do + +ARM64_vector_scalar_bhs_long2_imm: + ;used by SSHLL2, USHLL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b,TMPL_imm>,\ ;0=vd,vn,imm + <TMPL_vect_v4s,TMPL_vect_v8h,TMPL_imm>,\ ;1=vd,vn,imm + <TMPL_vect_v2d,TMPL_vect_v4s,TMPL_imm> ;2=vd,vn,imm + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.do + +ARM64_vector_scalar_bhs_long: + ;used by SXTL, UXTL + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v8b>,\ ;0=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4h>,\ ;1=vd,vn + <TMPL_vect_v2d,TMPL_vect_v2s> ;2=vd,vn + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.do + +ARM64_vector_scalar_bhs_long2: + ;used by SXTL2, UXTL2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8h,TMPL_vect_v16b>,\ ;0=vd,vn + <TMPL_vect_v4s,TMPL_vect_v8h>,\ ;1=vd,vn + <TMPL_vect_v2d,TMPL_vect_v4s> ;2=vd,vn + add al,al + jmp ARM64_vector_scalar_bhsd_two_reg_left_imm.do + +ARM64_tb1: + ;used by TBL, TBX + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_list_16b,TMPL_vect_v8b>,\ ;0=vd,{vn.16b},vm + <TMPL_vect_v16b,TMPL_vect_list_16b,TMPL_vect_v16b> ;1=vd,{vn.16b},vm + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_SIMD shr 32 + jz ERROR_requires_cpu64_capability_SIMD + mov ebp,[arm64_instruction] ;recover the template + movzx edx,[simd_reg_list_count] + shl eax,30 + or ebp,eax ;set Q + dec edx + shl edx,13 + or ebp,edx ;set len + jmp ARM64_arithmetic1.encode_rm + +ARM64_vector_bhsd_three_reg: + ;used by TRN1, TRN2, UZP1, UZP2, ZIP1, ZIP2 + call decode_template + TEMPLATE \ + <TMPL_vect_v8b,TMPL_vect_v8b,TMPL_vect_v8b>,\ ;0=vd,vn,vm + <TMPL_vect_v16b,TMPL_vect_v16b,TMPL_vect_v16b>,\;1=vd,vn,vm + <TMPL_vect_v4h,TMPL_vect_v4h,TMPL_vect_v4h>,\ ;2=vd,vn,vm + <TMPL_vect_v8h,TMPL_vect_v8h,TMPL_vect_v8h>,\ ;3=vd,vn,vm + <TMPL_vect_v2s,TMPL_vect_v2s,TMPL_vect_v2s>,\ ;4=vd,vn,vm + <TMPL_vect_v4s,TMPL_vect_v4s,TMPL_vect_v4s>,\ ;5=vd,vn,vm + <TMPL_never>,\ ;6=dd,dn,dm + <TMPL_vect_v2d,TMPL_vect_v2d,TMPL_vect_v2d> ;7=vd,vn,vm + jmp ARM64_vector_scalar_bhsd_two_reg.encode + +ARM64_arithmetic21: + ;used by URECPE, URSQRTE + call decode_template + TEMPLATE \ + <TMPL_vect_v2s,TMPL_vect_v2s>,\ ;0=vd,vn + <TMPL_vect_v4s,TMPL_vect_v4s> ;1=vd,vn + test [cpu_capability_flags2],1 shl CPU64_CAPABILITY_FP shr 32 + jz ERROR_requires_cpu64_capability_FP + mov ebp,[arm64_instruction] ;recover the template + shl eax,30 + or ebp,eax ;set Q + jmp ARM64_arithmetic1.encode_rn + +;CRC + +CRC32_polynomial_ISO3309 = 0xedb88320 ;x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + x^0 +CRC32_table_length = 256*4*4 ;a constant, don't adjust +CRC32_loop_size = 4 ;an optimising parameter, adjust if you want + +CRC_32: + ;used by CRC32 + ;crc32 dest_var from start,length[,polynomial] + lodsw + cmp ax,0x1128 ;'(' + 0x11 + jne ERROR_parameter_n_not_valid.first + lodsd + push eax ;save dest_var + lodsb + cmp al,')' + jne ERROR_parameter_n_not_valid.first + mov [operand_size],1 + and dword[value],0 + and dword[value+4],0 + lodsb + cmp al,82h ;from? + jne ERROR_parameter_n_not_valid.second + call get_data_point + sbb ecx,ecx + not ecx + and ebx,ecx + lodsb + cmp al,',' + jnz ERROR_parameter_n_not_valid.second + push ebx + call get_value + pop ebx + cmp [value_type],0 + jne ERROR_parameter_n_not_valid.third + test edx,edx + jne ERROR_parameter_n_not_valid.third + lea edx,[eax+ebx] + sub edx,[ds:ebp+0x18] + cmp [ds:ebp+0x1c],edx + sbb ecx,ecx + not ecx + and ebx,ecx + mov ebp,CRC32_polynomial_ISO3309 + push ebx eax + cmp byte[esi],',' ;is the polynomial specified? + jnz .construct + inc esi + call get_value + cmp [value_type],0 + jne ERROR_parameter_n_not_valid.fourth + test edx,edx + jne ERROR_parameter_n_not_valid.fourth + mov ebp,eax + .construct: + call CRC32_construct_table + pop ecx edx + test edx,edx + jz .out_of_range + or eax,-1 ;eax=crc + test ecx,ecx + jz .done + test dl,3 + jne .align + .begin: + sub ecx,CRC32_loop_size*8 + jb .tail + .main_loop: + repeat CRC32_loop_size + xor eax,[edx+(%-1)*8] + movzx ebp,al + mov ebx,[edi+3*256*4+4*ebp] + movzx ebp,ah + xor ebx,[edi+2*256*4+4*ebp] + shr eax,16 + movzx ebp,al + xor ebx,[edi+1*256*4+4*ebp] + shr eax,8 + xor ebx,[edi+0*256*4+4*eax] + xor ebx,[edx+(%-1)*8+4] + movzx ebp,bl + mov eax,[edi+3*256*4+4*ebp] + movzx ebp,bh + xor eax,[edi+2*256*4+4*ebp] + shr ebx,16 + movzx ebp,bl + xor eax,[edi+1*256*4+4*ebp] + shr ebx,8 + xor eax,[edi+0*256*4+4*ebx] + end repeat + add edx,CRC32_loop_size*8 + sub ecx,CRC32_loop_size*8 + jae .main_loop + .tail: + sub ecx,4-CRC32_loop_size*8 + jb .finish + .tail_loop: + xor eax,[edx] + add edx,4 + movzx ebp,al + mov ebx,[edi+3*256*4+4*ebp] + movzx ebp,ah + xor ebx,[edi+2*256*4+4*ebp] + shr eax,16 + movzx ebp,al + xor ebx,[edi+1*256*4+4*ebp] + shr eax,8 + xor ebx,[edi+0*256*4+4*eax] + mov eax,ebx + sub ecx,4 + jae .tail_loop + .finish: + sub ecx,1-4 + jb .done + .prolog: + movzx ebx,byte[edx] + xor bl,al + shr eax,8 + xor eax,[edi+4*ebx] + inc edx + dec ecx + jns .prolog + .done: + mov dword[value],eax + .store_crc: + mov [value_sign],0 + mov eax,dword[value] + mov edx,dword[value+4] + pop ebx + xor cx,cx + jmp make_constant + .align: + movzx ebx,byte[edx] + xor bl,al + shr eax,8 + xor eax,[edi+4*ebx] + inc edx + dec ecx + je .done + test dl,3 + jne .align + jmp .begin + .out_of_range: + call recoverable_overflow + jmp .store_crc + +CRC32_construct_table: + lea eax,[edi+CRC32_table_length] + cmp eax,[tagged_blocks] + jae out_of_memory + xor edx,edx + .a: mov eax,edx + mov ebx,8 + .b: shr eax,1 + sbb ecx,ecx + and ecx,ebp + xor eax,ecx + dec ebx + jnz .b + mov [edi+4*edx],eax + inc dl + jnz .a + xor edx,edx + .c: mov eax,[edi+4*edx] + mov ebx,3 + lea ebp,[edi+4*edx+1*256*4] + .d: movzx ecx,al + mov ecx,[edi+4*ecx] + shr eax,8 + xor eax,ecx + mov [ebp],eax + add ebp,1*256*4 + dec ebx + jnz .d + inc dl + jnz .c + ret + +;shared errors + +ERROR_illegal_instruction =illegal_instruction +ERROR_value_out_of_range =value_out_of_range +ERROR_relative_jump_out_of_range =relative_jump_out_of_range +ERROR_operand_sizes_do_not_match =operand_sizes_do_not_match + +ERROR_code_is_not_in_a_section: + call assembler_error + db 'Code placed before section defined',0 +ERROR_expecting_section_name: + call assembler_error + db 'Section directive must be followed by the section name',0 +ERROR_duplicate_align_setting: + call assembler_error + db 'An alignment setting was specified twice',0 +ERROR_duplicate_flag_setting: + call assembler_error + db 'A flag setting was specified twice',0 +ERROR_invalid_use_of_symbol_in_align: + call assembler_error + db 'Invalid use of symbol for "align" setting',0 +ERROR_invalid_use_of_symbol_in_at: + call assembler_error + db 'Invalid use of symbol for "at" setting',0 +ERROR_section_flags_zero: + call assembler_error + db 'At least one section flag (executable, readable or writeable) must be specified',0 +ERROR_section_align_zero: + call assembler_error + db 'Section alignment must be specified',0 +ERROR_line_processing_error: + call fatal_error + db 'Fatal: Failure when processing line numbers. There is a bug!',0 +ERROR_thumb_recode_error: + call assembler_error + db 'Fatal: Unable to recode instruction for thumb. There is a bug!',0 +ERROR_org_not_allowed: + call assembler_error + db '"ORG" not allowed in DWARF, use "SECTION ... at X" instead',0 +ERROR_section_at_not_aligned: + call assembler_error + db 'Section alignement and "AT" specified are not compatible',0 +ERROR_instruction_not_aligned: + call assembler_error + db 'Instruction origin not aligned',0 +ERROR_relative_jump_not_aligned: + call assembler_error + db 'Relative jump destination not aligned',0 +ERROR_shift_value_out_of_range: + .0: + call assembler_error + db 'Shift value out of range, only 0 allowed',0 + .0or1: + call assembler_error + db 'Shift value out of range (must be 0 or 1)',0 + .0or2: + call assembler_error + db 'Shift value out of range (must be 0 or 2)',0 + .0or3: + call assembler_error + db 'Shift value out of range (must be 0 or 3)',0 + .0or4: + call assembler_error + db 'Shift value out of range (must be 0 or 4)',0 + .0_3: + call assembler_error + db 'Shift value out of range (0-3)',0 + .0_4: + call assembler_error + db 'Shift value out of range (0-4)',0 + .0_7: + call assembler_error + db 'Shift value out of range (0-7)',0 + .0_8: + call assembler_error + db 'Shift value out of range (0-8)',0 + .0_15: + call assembler_error + db 'Shift value out of range (0-15)',0 + .0or16: + call assembler_error + db 'Shift value out of range (0 or 16)',0 + .0_16: + call assembler_error + db 'Shift value out of range (0-16)',0 + .0_24: + call assembler_error + db 'Shift value out of range (0, 8, 16 or 24)',0 + .0_31: + call assembler_error + db 'Shift value out of range (0-31)',0 + .0_32: + call assembler_error + db 'Shift value out of range (0-32)',0 + .0_48: + call assembler_error + db 'Shift value out of range (0, 16, 32 or 48)',0 + .1: + call assembler_error + db 'Shift value out of range (must be 1)',0 + .2: + call assembler_error + db 'Shift value out of range (must be 2)',0 + .8: + call assembler_error + db 'Shift value out of range (must be 8)',0 + .12: + call assembler_error + db 'Shift value out of range (must be 0 or 12)',0 + .16: + call assembler_error + db 'Shift value out of range (must be 16)',0 + .32: + call assembler_error + db 'Shift value out of range (must be 32)',0 + .1_8: + call assembler_error + db 'Shift value out of range (1-8)',0 + .1_16: + call assembler_error + db 'Shift value out of range (1-16)',0 + .1_31: + call assembler_error + db 'Shift value out of range (1-31)',0 + .1_32: + call assembler_error + db 'Shift value out of range (1-32)',0 + .0_63: + call assembler_error + db 'Shift value out of range (0-63)',0 + .1_64: + call assembler_error + db 'Shift value out of range (1-64)',0 +ERROR_immediate_offset_out_of_range: + call assembler_error + db 'Immediate offset out of range',0 + .0: + call assembler_error + db 'Immediate offset out of range (must be 0)',0 + .1: + call assembler_error + db 'Immediate offset out of range (must be 1)',0 + .2: + call assembler_error + db 'Immediate offset out of range (must be 2)',0 + .3: + call assembler_error + db 'Immediate offset out of range (must be 3)',0 + .4: + call assembler_error + db 'Immediate offset out of range (must be 4)',0 + .6: + call assembler_error + db 'Immediate offset out of range (must be 6)',0 + .8: + call assembler_error + db 'Immediate offset out of range (must be 8)',0 + .12: + call assembler_error + db 'Immediate offset out of range (must be 12)',0 + .16: + call assembler_error + db 'Immediate offset out of range (must be 16)',0 + .24: + call assembler_error + db 'Immediate offset out of range (must be 24)',0 + .32: + call assembler_error + db 'Immediate offset out of range (must be 32)',0 + .48: + call assembler_error + db 'Immediate offset out of range (must be 48)',0 + .64: + call assembler_error + db 'Immediate offset out of range (must be 64)',0 + .0xff: + call assembler_error + db 'Immediate offset out of range (-0xff to 0xff)',0 + .0x3fc: + call assembler_error + db 'Immediate offset out of range (-0xff to 0xff)*4',0 + .0xfff: + call assembler_error + db 'Immediate offset out of range (-0xfff to 0xfff)',0 + .0_0xffffff: + call assembler_error + db 'Immediate offset out of range (0 to 0xffffff)',0 + .0_0x3f: + call assembler_error + db 'Immediate offset out of range (0 to 0x3f)',0 + .0_0xff: + call assembler_error + db 'Immediate offset out of range (0 to 0xff)',0 + .0_0xfff: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff)',0 + .0_0xfff.m256_255: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff) and (-0x100 to +0xff)',0 + .0_0x1ffe.m256_255: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff)*2 and (-0x100 to +0xff)',0 + .0_0x3ffc.m256_255: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff)*4 and (-0x100 to +0xff)',0 + .0_0x7ff8.m256_255: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff)*8 and (-0x100 to +0xff)',0 + .0_0xfff0.m256_255: + call assembler_error + db 'Immediate offset out of range (0 to 0xfff)*16 and (-0x100 to +0xff)',0 + .0_0xffff: + call assembler_error + db 'Immediate offset out of range (0 to 0xffff)',0 + .0_0x1f: + call assembler_error + db 'Immediate offset out of range (0 to 0x1f)',0 + .0_0x3e: + call assembler_error + db 'Immediate offset out of range (0 to 0x1f)*2',0 + .0_0x7c: + call assembler_error + db 'Immediate offset out of range (0 to 0x1f)*4',0 + .0_0xfc: + call assembler_error + db 'Immediate offset out of range (0 to 0x3f)*4',0 + .0_0x1fc: + call assembler_error + db 'Immediate offset out of range (0 to 0x7f)*4',0 + .0_0x3fc: + call assembler_error + db 'Immediate offset out of range (0 to 0xff)*4',0 + .m28_0: + call assembler_error + db 'Immediate offset out of range (-7 to 0)*4',0 + .m256_252: + call assembler_error + db 'Immediate offset out of range (-64 to +63)*4, (-256 to +252 in multiples of 4)',0 + .m256_255: + call assembler_error + db 'Immediate offset out of range (-256 to +255)',0 + .m512_504: + call assembler_error + db 'Immediate offset out of range (-64 to +63)*8, (-512 to +504 in multiples of 8)',0 + .m1024_1008: + call assembler_error + db 'Immediate offset out of range (-64 to +63)*16, (-1024 to +1008 in multiples of 16)',0 +ERROR_immediate_value_out_of_range: + .0_1: + call assembler_error + db 'Immediate value out of range (can only be 0 or 1)',0 + .0_7: + call assembler_error + db 'Immediate value out of range (0 to 7)',0 + .0_15: + call assembler_error + db 'Immediate value out of range (0 to 15)',0 + .0_16: + call assembler_error + db 'Immediate value out of range (0 to 16)',0 + .0_31: + call assembler_error + db 'Immediate value out of range (0 to 31)',0 + .0_0x7f: + call assembler_error + db 'Immediate value out of range (0 to 0x7f)',0 + .0_0xff: + call assembler_error + db 'Immediate value out of range (0 to 0xff)',0 + .0_0xff_lsl_8: + call assembler_error + db 'Immediate value out of range (0 to 0xff with optional left shift of 8)',0 + .0_0xff_msl: + call assembler_error + db 'Immediate value out of range (0 to 0xff with optional ones shift of 8 or 16 or left shift of 8, 16 or 24)',0 + .0_0xff_lsl_24: + call assembler_error + db 'Immediate value out of range (0 to 0xff with optional left shift of 8, 16 or 24)',0 + .0_0xfff: + call assembler_error + db 'Immediate value out of range (0 to 0xfff)',0 + .0_0xfff_lsl_12: + call assembler_error + db 'Immediate value out of range (0 to 0xfff with optional left shift of 12)',0 + .0_0xffff: + call assembler_error + db 'Immediate value out of range (0 to 0xffff)',0 + .0_0xffff_lsl_16: + call assembler_error + db 'Immediate value out of range (0 to 0xffff with optional left shift of 16)',0 + .0_0xffff_lsl_48: + call assembler_error + db 'Immediate value out of range (0 to 0xffff with optional left shift of 16, 32 or 48)',0 + .1_16: + call assembler_error + db 'Immediate value out of range (1 to 16)',0 + .1_32: + call assembler_error + db 'Immediate value out of range (1 to 32)',0 + .1_64: + call assembler_error + db 'Immediate value out of range (1 to 64)',0 + .m64_63: + call assembler_error + db 'Immediate value out of range (-64 to 63)',0 + .quarter: + call assembler_error + db 'Immediate value out of range (-31.0 to +31.0)',0 +ERROR_byte_value_out_of_range: + call assembler_error + db 'Byte value out of range (0 to 0xff)',0 +ERROR_rotation_value_out_of_range: + call assembler_error + db 'Rotation value out of range (0 to 0xf)*2',0 +ERROR_byte_rotation_in_thumb: + call assembler_error + db 'Explicit byte and rotation values not valid in THUMB mode',0 +ERROR_count_value_out_of_range: + .1_4: + call assembler_error + db 'Count value out of range (1 to 4)',0 +ERROR_lsb_out_of_range: + .0_31: + call assembler_error + db 'LSB value out of range (0 to 31)',0 + .0_63: + call assembler_error + db 'LSB value out of range (0 to 63)',0 +ERROR_immr_out_of_range: + .0_31: + call assembler_error + db 'IMMR value out of range (0 to 31)',0 + .0_63: + call assembler_error + db 'IMMR value out of range (0 to 63)',0 +ERROR_imms_out_of_range: + .0_31: + call assembler_error + db 'IMMS value out of range (0 to 31)',0 + .0_63: + call assembler_error + db 'IMMS value out of range (0 to 63)',0 +ERROR_bit_out_of_range: + .0_31: + call assembler_error + db 'Bit number out of range (0 to 31)',0 + .0_63: + call assembler_error + db 'Bit number out of range (0 to 63)',0 +ERROR_width_out_of_range: + call assembler_error + db 'Width field + LSB cannot exceed 32',0 + .64: + call assembler_error + db 'Width field + LSB cannot exceed 64',0 + .1_32: + call assembler_error + db 'Width value out of range (1 to 32)',0 + .1_64: + call assembler_error + db 'Width value out of range (1 to 64)',0 +ERROR_constant_cannot_be_encoded: + call assembler_error + db 'Constant cannot be encoded (0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0 or 10.0 only)',0 +ERROR_immediate_cannot_be_encoded: + call assembler_error + db 'Immediate value cannot be encoded',0 +ERROR_must_have_writeback_operator: + call assembler_error + db 'Must have writeback operator "!"',0 +ERROR_option_out_of_range: + call assembler_error + db 'Option out of range (0x00-0xff)',0 +ERROR_opcode4_out_of_range: + call assembler_error + db 'Coprocessor opcode out of range (0-15) in second parameter',0 +ERROR_opcode3_out_of_range: + call assembler_error + db 'Coprocessor opcode out of range (0-7) in sixth parameter',0 +ERROR_expecting_curly_bracket_close: + call assembler_error + db 'Expecting curly bracket "}"',0 +ERROR_expecting_square_bracket_close: + call assembler_error + db 'Expecting square bracket "]"',0 +ERROR_repeated_register_in_list: + call assembler_error + db 'Repeated register in list',0 +ERROR_instruction_not_16bit: + call assembler_error + db 'Instruction not encodable in THUMB',0 +ERROR_instruction_not_t2ee: + call assembler_error + db 'Instruction not encodable in THUMBEE',0 +ERROR_instruction_needs_t2ee: + call assembler_error + db 'Instruction requires THUMBEE mode, use "THUMBEE" to select',0 +ERROR_instruction_not_32bit: + call assembler_error + db 'Instruction not encodable in ARM',0 +ERROR_instruction_not_64bit: + call assembler_error + db 'Instruction not encodable in ARM64',0 +ERROR_register_out_of_range: + .r0_r7: + call assembler_error + db 'Register out of range (R0-R7)',0 + .r0_r7_sp_pc: + call assembler_error + db 'Register out of range (R0-R7, SP or PC)',0 + .must_be_sp: + call assembler_error + db 'Register must be SP',0 + .sp: + call assembler_error + db 'Register cannot be SP',0 + .pc: + call assembler_error + db 'Register cannot be PC',0 + .sp_pc: + call assembler_error + db 'Register cannot be SP or PC',0 + .too_complex: + call assembler_error + db 'Expression can only have one register with no scaling',0 + .only_base: + call assembler_error + db 'Expression can only have an unaligned register (R0-R15)',0 + .only_base64: + call assembler_error + db 'Expression can only have 64-bit register (X0-X30,SP)',0 +ERROR_dest_cannot_be_sp_pc: + call assembler_error + db 'Destination register cannot be SP or PC',0 +ERROR_offset_register_cannot_be_sp_pc: + call assembler_error + db 'Offset register cannot be SP or PC',0 +ERROR_dest_and_source_must_be_the_same: + call assembler_error + db 'Destination register and first source register must be the same',0 +ERROR_r14_not_valid: + .first: + call assembler_error + db 'LR (R14) not valid as first parameter',0 + .second: + call assembler_error + db 'LR (R14) not valid as second parameter',0 +ERROR_r13_not_valid: + call assembler_error + db 'SP (R13) not valid',0 + .second: + call assembler_error + db 'SP (R13) not valid as second parameter',0 +ERROR_r13_r15_not_valid: + call assembler_error + db 'SP (R13) and PC (R15) not valid',0 + .third: + call assembler_error + db 'SP (R13) and PC (R15) not valid as third parameter',0 +ERROR_r15_not_valid: + call assembler_error + db 'PC (R15) not valid',0 + .all: + call assembler_error + db 'PC (R15) not valid for any parameter',0 + .first: + call assembler_error + db 'PC (R15) not valid as first parameter',0 + .second: + call assembler_error + db 'PC (R15) not valid as second parameter',0 + .third: + call assembler_error + db 'PC (R15) not valid as third parameter',0 + .fourth: + call assembler_error + db 'PC (R15) not valid as fourth parameter',0 + .base: + call assembler_error + db 'PC (R15) not valid as base register',0 + .post: + call assembler_error + db 'PC (R15) not valid as base register with post update',0 +ERROR_register_writeback_not_allowed: + call assembler_error + db 'Register writeback not allowed here',0 +ERROR_destination_register_not_allowed_in_list: + call assembler_error + db 'Destination register with writeback not allowed in source list',0 +ERROR_source_and_dest_must_differ: + call assembler_error + db 'Source and destination registers must differ',0 +ERROR_base_and_dest_must_differ_with_writeback: + call assembler_error + db 'Base and destination registers must differ when using writeback',0 +ERROR_offset_and_dest_must_differ_with_LDRD: + call assembler_error + db 'Offset and destination registers must differ with LDRD',0 +ERROR_source_register_must_be_even: + call assembler_error + db 'First source register must be even',0 +ERROR_destination_register_must_be_even: + call assembler_error + db 'First destination register must be even',0 +ERROR_source_registers_must_be_consecutive: + call assembler_error + db 'Source registers must be consecutive',0 +ERROR_destination_registers_must_be_consecutive: + call assembler_error + db 'Destination registers must be consecutive',0 +ERROR_source_rm_and_dest_must_differ: + call assembler_error + db 'Destination and first source must differ',0 +ERROR_base_and_offset_must_differ_with_writeback: + call assembler_error + db 'Base and offset registers must differ when using writeback',0 +ERROR_must_use_full_psr: + call assembler_error + db 'Must use full PSR here, either APSR, CPSR or SPSR',0 +ERROR_must_specify_psr_bit_fields: + call assembler_error + db 'Must specify PSR bit fields here, (APSR_nzcvqg, CPSR_fsxc or SPSR_fsxc)',0 +ERROR_memory_address_cannot_be_source_or_dest: + call assembler_error + db 'Address register cannot be source or destination',0 +ERROR_dest_cannot_be_source_or_memory_address: + call assembler_error + db 'Destination cannot be source or address register',0 +ERROR_destination_registers_must_differ: + call assembler_error + db 'Destination registers must differ',0 +ERROR_empty_set: + call assembler_error + db 'Cannot use empty set',0 +ERROR_sp_in_set: + call assembler_error + db 'SP (R13) not valid in register list',0 +ERROR_pc_in_set: + call assembler_error + db 'PC (R15) not valid in register list',0 +ERROR_invalid_set_with_lr_pc: + call assembler_error + db 'Cannot have LR (R14) and PC (R15) both in the list',0 +ERROR_shift_type_must_be_LSL: + call assembler_error + db 'Shift type must be LSL',0 +ERROR_shift_type_must_be_LSL_or_ASR: + call assembler_error + db 'Shift type must be LSL or ASR',0 +ERROR_shift_type_must_be_ASR: + call assembler_error + db 'Shift type must be ASR',0 +ERROR_shift_type_must_be_ROR: + call assembler_error + db 'Shift type must be ROR',0 +ERROR_extend_type: + call assembler_error + db 'Extend type must be UXTW, UXTX, SXTW, SXTX or LSL',0 +ERROR_requires_cpu_capability_arm_26bit: + call assembler_error + db 'Requires CPU capability 26BIT, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v1: + call assembler_error + db 'Requires CPU capability V1, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v2: + call assembler_error + db 'Requires CPU capability V2, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v2a: + call assembler_error + db 'Requires CPU capability A, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v3: + call assembler_error + db 'Requires CPU capability V3, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_m: + call assembler_error + db 'Requires CPU capability M, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v4: + call assembler_error + db 'Requires CPU capability V4, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v4t: + call assembler_error + db 'Requires CPU capability V4T, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v5: + call assembler_error + db 'Requires CPU capability V5, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v5t: + call assembler_error + db 'Requires CPU capability V5T, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_p: + call assembler_error + db 'Requires CPU capability P, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_e: + call assembler_error + db 'Requires CPU capability E, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_j: + call assembler_error + db 'Requires CPU capability J, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_x: + call assembler_error + db 'Requires CPU capability X, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v6: + call assembler_error + db 'Requires CPU capability V6, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v6t: + call assembler_error + db 'Requires CPU capability V6T, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_align: + call assembler_error + db 'Requires CPU capability ALIGN, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_k: + call assembler_error + db 'Requires CPU capability K, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_z: + call assembler_error + db 'Requires CPU capability Z, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_6m: + call assembler_error + db 'Requires CPU capability 6M, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_7m: + call assembler_error + db 'Requires CPU capability 7M, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_t2: + call assembler_error + db 'Requires CPU capability T2, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v7: + call assembler_error + db 'Requires CPU capability V7, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_sync: + call assembler_error + db 'Requires CPU capability SYNC, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_div: + call assembler_error + db 'Requires CPU capability DIV, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_t2ee: + call assembler_error + db 'Requires CPU capability T2EE, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_mp: + call assembler_error + db 'Requires CPU capability MP, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_ve: + call assembler_error + db 'Requires CPU capability VE, use directive "processor" to select',0 +ERROR_requires_cpu_capability_crc: + call assembler_error + db 'Requires CPU capability CRC, use directive "processor" to select',0 +ERROR_requires_cpu_capability_arm_v8: + call assembler_error + db 'Requires CPU capability V8, use directive "processor" to select',0 +ERROR_requires_cpu64_capability_v8: + call assembler_error + db 'Requires CPU64 capability V8, use directive "processor" to select',0 +ERROR_requires_cpu64_capability_FP: + call assembler_error + db 'Requires CPU64 capability FP, use directive "processor" to select',0 +ERROR_requires_cpu64_capability_SIMD: + call assembler_error + db 'Requires CPU64 capability SIMD, use directive "processor" to select',0 +ERROR_requires_cpu64_capability_crc: + call assembler_error + db 'Requires CPU64 capability CRC, use directive "processor" to select',0 +ERROR_requires_cpu64_capability_crypto: + call assembler_error + db 'Requires CPU64 capability CRYPTO, use directive "processor" to select',0 +ERROR_requires_copro_capability_fpa_v1: + call assembler_error + db 'Requires coprocessor capability FPA V1, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_fpa_v2: + call assembler_error + db 'Requires coprocessor capability FPA V2, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_v1xd: + call assembler_error + db 'Requires coprocessor capability VFP V1xD, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_v1: + call assembler_error + db 'Requires coprocessor capability VFP V1, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_v2: + call assembler_error + db 'Requires coprocessor capability VFP V2, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_v3: + call assembler_error + db 'Requires coprocessor capability VFP V3, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_v4: + call assembler_error + db 'Requires coprocessor capability VFP V4, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_d32: + call assembler_error + db 'Requires coprocessor capability VFP D32, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_vfp_hp: + call assembler_error + db 'Requires coprocessor capability VFP HP, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_xscale: + call assembler_error + db 'Requires coprocessor capability XSCALE, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_iwmmxt_v1: + call assembler_error + db 'Requires coprocessor capability IWMMXT V1, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_iwmmxt_v2: + call assembler_error + db 'Requires coprocessor capability IWMMXT V2, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_maverick: + call assembler_error + db 'Requires coprocessor capability MAVERICK, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_int: + call assembler_error + db 'Requires coprocessor capability SIMD INT, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_float: + call assembler_error + db 'Requires coprocessor capability SIMD FLOAT, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_hp: + call assembler_error + db 'Requires coprocessor capability SIMD HP, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_v2: + call assembler_error + db 'Requires coprocessor capability SIMD V2, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_v8: + call assembler_error + db 'Requires coprocessor capability SIMD V8, use directive "coprocessor" to select',0 +ERROR_requires_copro_capability_simd_crypto: + call assembler_error + db 'Requires coprocessor capability SIMD CRYPTO, use directive "coprocessor" to select',0 +ERROR_narrow_instructions_are_not_encodable_in_arm_mode: + call assembler_error + db 'Narrow instructions are not encodable in ARM mode',0 +ERROR_unexpected_end_of_line: + call assembler_error + db 'Unexpected end of line',0 +ERROR_parameter_n_not_valid: + .all: + call assembler_error + db 'Parameter is invalid',0 + .first: + call assembler_error + db 'First parameter is invalid',0 + .second: + call assembler_error + db 'Second parameter is invalid',0 + .third: + call assembler_error + db 'Third parameter is invalid',0 + .fourth: + call assembler_error + db 'Fourth parameter is invalid',0 + .fifth: + call assembler_error + db 'Fifth parameter is invalid',0 + .sixth: + call assembler_error + db 'Sixth parameter is invalid',0 +ERROR_high_base_registers_not_allowed_in_list: + call assembler_error + db 'High registers (R8-R15) not allowed in list',0 + .not_pc: + call assembler_error + db 'High registers (R8-R14) not allowed in list',0 + .not_lr: + call assembler_error + db 'High registers (R8-R13,R15) not allowed in list',0 +ERROR_instruction_not_conditional: + call assembler_error + db 'Instruction cannot be conditional',0 +ERROR_non_contiguous_set: + call assembler_error + db 'Register set must be contiguous',0 +ERROR_large_set: + call assembler_error + db 'Register set cannot contain more than 16 registers',0 +ERROR_two_registers_required: + call assembler_error + db 'Register list must have two consecutive registers',0 +ERROR_must_be_r15: + .first: + call assembler_error + db 'First parameter must be PC {R15}',0 +ERROR_control_register_only_valid_with_word: + call assembler_error + db 'Control register only valid with word size operations',0 +ERROR_condition_does_not_match_IT_specifier: + call assembler_error + db 'Condition does not match IT specifier',0 +ERROR_instruction_must_be_last_in_IT_block: + call assembler_error + db 'Instruction must be last in IT block',0 +ERROR_al_has_no_inverse: + call assembler_error + db 'No "else" condition available with AL',0 +ERROR_label_inside_IT_block: + call assembler_error + db 'Cannot access labels inside of an IT block',0 +ERROR_mode_change_inside_IT_block: + call assembler_error + db 'Cannot change CPU mode inside of an IT block',0 +ERROR_register_list_invalid: + call assembler_error + db 'The register list cannot be encoded',0 +ERROR_alignment_invalid: + call assembler_error + db 'The alignment cannot be encoded',0 +ERROR_use_fldr_for_single_reg: + call assembler_error + db 'Use VLDR or FLDR to load single 64 bit registers',0 +ERROR_element_value_out_of_range: + .0_1: + call assembler_error + db 'Element value out of range (0 to 1)',0 + .0_3: + call assembler_error + db 'Element value out of range (0 to 3)',0 + .0_7: + call assembler_error + db 'Element value out of range (0 to 7)',0 +ERROR_scalar_register_out_of_range: + .0_7: + call assembler_error + db 'Scalar register out of range (d0 to d7)',0 + .0_15: + call assembler_error + db 'Scalar register out of range (d0 to d15)',0 +ERROR_reg_size_64_not_encodable: + call assembler_error + db 'Register size of 64 bits is not encodable',0 +ERROR_zr_not_valid: + .second: + call assembler_error + db 'Second parameter cannot be the zero register (WZR or XZR)',0 +ERROR_condition_value_out_of_range: + .0_15: + call assembler_error + db 'Condition value out of range (0 to 15)',0 +ERROR_al_nv_not_valid: + call assembler_error + db 'Conditions AL and NV are not valid',0 +ERROR_cannot_set_flags: + call assembler_error + db 'This instruction cannot set the flags in ARM64 mode',0 +ERROR_vector_register_out_of_range: + call assembler_error + db 'Indexed vector register can be v0 to v15 only',0 +ERROR_branch_misaligned: + call assembler_error + db 'Address is not aligned',0 +ERROR_branch_too_far: + call assembler_error + db 'Address cannot be reached',0 +ERROR_expecting_CPU_selection_symbol: + call assembler_error + db 'Expecting a CPU selection symbol after the PROCESSOR operator',0 +ERROR_expecting_COPRO_selection_symbol: + call assembler_error + db 'Expecting a COPRO selection symbol after the COPROCESSOR operator',0 diff --git a/source/ide/fasmw/fasmarm.inc b/source/ide/fasmw/fasmarm.inc new file mode 100644 index 0000000..aa1f919 --- /dev/null +++ b/source/ide/fasmw/fasmarm.inc @@ -0,0 +1,465 @@ + +; flat assembler interface for Win32 IDE +; Copyright (c) 1999-2016, Tomasz Grysztar. +; All rights reserved. + +flat_assembler: + + mov [initial_definitions],0 + mov edx,[esp+4] + mov [input_file],edx + invoke GetFullPathName,edx,1000h,path_buffer,param_buffer + mov edi,[param_buffer] + mov byte [edi-1],0 + mov [symbols_file],0 + test [command_flags],2 + jz symbols_file_name_ok + mov [symbols_file],edi + mov ecx,eax + add ecx,path_buffer + sub ecx,edi + lea edi,[edi+ecx-1] + mov ebx,edi + mov al,'.' + std + repne scasb + cld + je attach_fas_extension + mov edi,ebx + attach_fas_extension: + inc edi + mov eax,'.fas' + stosd + xor al,al + stosb + symbols_file_name_ok: + invoke SetCurrentDirectory,path_buffer + mov [hfile],0 + invoke GlobalAlloc,GMEM_MOVEABLE,1 + mov [hmem_display],eax + invoke GlobalLock,[hmem_display] + mov byte [eax],0 + invoke GlobalUnlock,[hmem_display] + mov [display_size],1 + mov [error_data_size],0 + mov [allocated_memory],0 + mov eax,[compiler_memory] + shl eax,10 + jz out_of_memory + allocate_memory: + mov edx,eax + shr edx,2 + mov ecx,eax + sub ecx,edx + mov [memory_end],ecx + mov [additional_memory_end],edx + invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE + or eax,eax + jnz memory_allocated + mov eax,[additional_memory_end] + shl eax,1 + cmp eax,4000h + jb out_of_memory + jmp allocate_memory + memory_allocated: + mov [allocated_memory],eax + mov [memory_start],eax + mov [code_start],eax + add eax,[memory_end] + mov [memory_end],eax + mov [additional_memory],eax + add [additional_memory_end],eax + mov [tagged_blocks],0 + + mov eax,esp + and eax,not 0FFFh + add eax,1000h-10000h + mov [stack_limit],eax + + invoke PostMessage,[hwnd_progress],PBM_SETPOS,0,0 + invoke SetThreadPriority,[hthread],[compiler_priority] + invoke GetTickCount + mov [start_time],eax + mov [preprocessing_done],0 + call preprocessor + invoke PostMessage,[hwnd_progress],PBM_SETPOS,1,0 + or [preprocessing_done],-1 + call parser + invoke PostMessage,[hwnd_progress],PBM_SETPOS,2,0 + call ARM_label_walker ;this line added for ARM + call assembler + call ARM_close_dwarf ;this line added for ARM + invoke PostMessage,[hwnd_progress],PBM_SETPOS,3,0 + call formatter + invoke PostMessage,[hwnd_progress],PBM_SETPOS,4,0 + call show_display_buffer + invoke GetTickCount + sub eax,[start_time] + mov [total_time],eax + mov esi,[output_file] + mov edi,path_buffer + copy_executable_name: + lodsb + stosb + or al,al + jnz copy_executable_name + xor al,al + +exit_program: + movzx eax,al + push eax + mov eax,[allocated_memory] + or eax,eax + jz memory_ok + invoke VirtualFree,eax,0,MEM_RELEASE + mov [allocated_memory],0 + memory_ok: + mov eax,[hfile] + or eax,eax + jz handle_ok + invoke CloseHandle,eax + handle_ok: + invoke PostMessage,[hwnd_compiler],WM_COMMAND,IDOK,0 + call [ExitThread] + +get_environment_variable: + invoke GetEnvironmentVariable,esi,string_buffer,1000h + mov ecx,[memory_end] + sub ecx,edi + cmp ecx,1000h + jbe get_local_variable + mov ecx,1000h + get_local_variable: + invoke GetPrivateProfileString,_section_environment,esi,string_buffer,edi,ecx,ini_path + add edi,eax + cmp edi,[memory_end] + jae out_of_memory + retn + +open: + mov ebx,edx + invoke WaitForSingleObject,[mutex],-1 + invoke CreateFile,ebx,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0 + cmp eax,-1 + je file_error + mov [hfile],eax + mov ebx,eax + clc + retn + file_error: + stc + retn +create: + mov ebx,edx + invoke WaitForSingleObject,[mutex],-1 + invoke CreateFile,ebx,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0 + cmp eax,-1 + je file_error + mov ebx,eax + clc + retn +write: + invoke WriteFile,ebx,edx,ecx,bytes_count,0 + or eax,eax + jz file_error + clc + retn +read: + mov ebp,ecx + invoke ReadFile,ebx,edx,ecx,bytes_count,0 + or eax,eax + jz file_error + cmp ebp,[bytes_count] + jne file_error + clc + retn +close: + cmp ebx,[hfile] + jne close_handle + mov [hfile],0 + close_handle: + invoke CloseHandle,ebx + invoke ReleaseMutex,[mutex] + retn +lseek: + movzx eax,al + invoke SetFilePointer,ebx,edx,0,eax + cmp eax,-1 + je file_error + retn + +display_block: + push edi + push ecx + add ecx,[display_size] + invoke GlobalReAlloc,[hmem_display],ecx,GMEM_MOVEABLE + or eax,eax + jz out_of_memory + mov [hmem_display],eax + invoke GlobalLock,[hmem_display] + add eax,[display_size] + lea edi,[eax-1] + pop ecx + add [display_size],ecx + rep movsb + xor al,al + stosb + invoke GlobalUnlock,[hmem_display] + pop edi + retn +fatal_error: + cmp [hthread],0 + je error_outside_compiler + pop [error_message] + error_with_no_source: + mov al,0FFh + jmp exit_program +assembler_error: + cmp [hthread],0 + je error_outside_compiler + call show_display_buffer + pop [error_message] + mov ebx,[current_line] + test ebx,ebx + jz error_with_no_source + xor ecx,ecx + get_error_lines: + mov eax,[ebx] + cmp byte [eax],0 + je get_next_error_line + test byte [ebx+7],80h + jz error_lines_ok + inc ecx + mov edx,ebx + find_definition_origin: + mov edx,[edx+12] + test byte [edx+7],80h + jnz find_definition_origin + mov eax,[edx+4] + and eax,7FFFFFFFh + push eax + mov edx,[edx] + push edx + get_next_error_line: + mov ebx,[ebx+8] + jmp get_error_lines + error_lines_ok: + inc ecx + mov eax,[ebx+4] + and eax,7FFFFFFFh + push eax + mov edx,[ebx] + push edx + mov ebx,ecx + inc ecx + shl ecx,3 + mov [error_data_size],ecx + invoke GlobalAlloc,GMEM_MOVEABLE,ecx + mov [hmem_error_data],eax + invoke GlobalLock,[hmem_error_data] + mov [eax],ebx + invoke GlobalUnlock,[hmem_error_data] + xor ebx,ebx + store_error_lines: + pop edx + invoke GetFullPathName,edx,1000h,path_buffer,param_buffer + inc eax + mov esi,eax + add eax,[error_data_size] + invoke GlobalReAlloc,[hmem_error_data],eax,GMEM_MOVEABLE + invoke GlobalLock,[hmem_error_data] + mov edi,eax + add edi,[error_data_size] + mov ecx,esi + mov esi,path_buffer + rep movsb + pop edx + mov [eax+8+ebx*8+4],edx + sub edi,eax + xchg [error_data_size],edi + mov [eax+8+ebx*8],edi + mov esi,[eax] + invoke GlobalUnlock,[hmem_error_data] + inc ebx + cmp ebx,esi + jb store_error_lines + mov edi,[additional_memory] + cmp [preprocessing_done],0 + jne error_in_preprocessed + xor al,al + stosb + jmp instruction_converted + error_in_preprocessed: + mov esi,[current_line] + add esi,16 + xor dl,dl + convert_instruction: + lodsb + cmp al,1Ah + je copy_symbol + cmp al,22h + je copy_symbol + cmp al,3Bh + je ignore_preprocessor_symbols + stosb + or al,al + jz instruction_converted + xor dl,dl + jmp convert_instruction + copy_symbol: + or dl,dl + jz space_ok + mov byte [edi],20h + inc edi + space_ok: + cmp al,22h + je quoted + lodsb + movzx ecx,al + rep movsb + or dl,-1 + jmp convert_instruction + quoted: + mov al,27h + stosb + lodsd + mov ecx,eax + jecxz quoted_copied + copy_quoted: + lodsb + stosb + cmp al,27h + jne quote_ok + stosb + quote_ok: + loop copy_quoted + quoted_copied: + mov al,27h + stosb + or dl,-1 + jmp convert_instruction + ignore_preprocessor_symbols: + xor al,al + stosb + instruction_converted: + sub edi,[additional_memory] + mov ebx,[error_data_size] + lea eax,[ebx+edi] + invoke GlobalReAlloc,[hmem_error_data],eax,GMEM_MOVEABLE + invoke GlobalLock,[hmem_error_data] + mov ecx,edi + mov [eax+4],ebx + lea edi,[eax+ebx] + mov esi,[additional_memory] + rep movsb + invoke GlobalUnlock,[hmem_error_data] + mov al,2 + jmp exit_program + error_outside_compiler: + mov esp,[resume_esp] + jmp [resume_eip] + +make_timestamp: + invoke GetSystemTime,systime + movzx ecx,[systime.wYear] + mov eax,ecx + sub eax,1970 + mov ebx,365 + mul ebx + mov ebp,eax + mov eax,ecx + sub eax,1969 + shr eax,2 + add ebp,eax + mov eax,ecx + sub eax,1901 + mov ebx,100 + div ebx + sub ebp,eax + mov eax,ecx + xor edx,edx + sub eax,1601 + mov ebx,400 + div ebx + add ebp,eax + movzx ecx,[systime.wMonth] + mov eax,ecx + dec eax + mov ebx,30 + mul ebx + add ebp,eax + cmp ecx,8 + jbe months_correction + mov eax,ecx + sub eax,7 + shr eax,1 + add ebp,eax + mov ecx,8 + months_correction: + mov eax,ecx + shr eax,1 + add ebp,eax + cmp ecx,2 + jbe day_correction_ok + sub ebp,2 + movzx ecx,word [systime.wYear] + test ecx,11b + jnz day_correction_ok + xor edx,edx + mov eax,ecx + mov ebx,100 + div ebx + or edx,edx + jnz day_correction + mov eax,ecx + mov ebx,400 + div ebx + or edx,edx + jnz day_correction_ok + day_correction: + inc ebp + day_correction_ok: + movzx eax,[systime.wDay] + dec eax + add eax,ebp + mov ebx,24 + mul ebx + movzx ecx,[systime.wHour] + add eax,ecx + mov ebx,60 + mul ebx + movzx ecx,[systime.wMinute] + add eax,ecx + mov ebx,60 + mul ebx + movzx ecx,[systime.wSecond] + add eax,ecx + adc edx,0 + retn + +include '..\..\errors.inc' +include '..\..\symbdump.inc' +include '..\..\preproce.inc' +include '..\..\parser.inc' +include '..\..\exprpars.inc' +include '..\..\exprcalc.inc' +include '..\..\assemble.inc' +include '..\..\formats.inc' +include '..\..\armv8.inc' + +include '..\..\armtable.inc' +include '..\..\messages.inc' + +_logo db 'flat assembler for ARM version ',ARM_VERSION_STRING,' (built on fasm ',VERSION_STRING,')',0 + +section '.bss' readable writeable + +include '..\..\variable.inc' + +allocated_memory dd ? +start_time dd ? +total_time dd ? +display_size dd ? +error_message dd ? +error_data_size dd ? +preprocessing_done db ? diff --git a/source/ide/fasmw/make_arm.bat b/source/ide/fasmw/make_arm.bat new file mode 100644 index 0000000..a8ff189 --- /dev/null +++ b/source/ide/fasmw/make_arm.bat @@ -0,0 +1,6 @@ +@echo off +ren FASM.INC FASMx86.INC +ren FASMARM.INC FASM.INC +..\..\..\fasm fasmw.asm ..\..\..\FASMWARM.EXE +ren FASM.INC FASMARM.INC +ren FASMx86.INC FASM.INC diff --git a/source/libc/fasmarm.asm b/source/libc/fasmarm.asm new file mode 100644 index 0000000..ec83dd1 --- /dev/null +++ b/source/libc/fasmarm.asm @@ -0,0 +1,356 @@ + +; flat assembler interface for Unix/libc +; Copyright (c) 1999-2016, Tomasz Grysztar. +; All rights reserved. + + format ELF + public main + +macro ccall proc,[arg] + { common + local size + size = 0 + mov ebp,esp + if ~ arg eq + forward + size = size + 4 + common + sub esp,size + end if + and esp,-16 + if ~ arg eq + add esp,size + reverse + pushd arg + common + end if + call proc + mov esp,ebp } + +extrn gettimeofday + +section '.text' executable align 16 + +main: + mov ecx,[esp+4] + mov [argc],ecx + mov ebx,[esp+8] + mov [argv],ebx + push ebp + mov [stack_frame],esp + + mov [con_handle],1 + mov esi,_logo + call display_string + + call get_params + jc information + + call init_memory + + mov esi,_memory_prefix + call display_string + mov eax,[memory_end] + sub eax,[memory_start] + add eax,[additional_memory_end] + sub eax,[additional_memory] + shr eax,10 + call display_number + mov esi,_memory_suffix + call display_string + + ccall gettimeofday,buffer,0 + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + mov [start_time],eax + + and [preprocessing_done],0 + call preprocessor + or [preprocessing_done],-1 + call parser + call ARM_label_walker ;this line added for ARM + call assembler + call ARM_close_dwarf ;this line added for ARM + call formatter + + call display_user_messages + movzx eax,[current_pass] + inc eax + call display_number + mov esi,_passes_suffix + call display_string + ccall gettimeofday,buffer,0 + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + sub eax,[start_time] + jnc time_ok + add eax,3600000 + time_ok: + xor edx,edx + mov ebx,100 + div ebx + or eax,eax + jz display_bytes_count + xor edx,edx + mov ebx,10 + div ebx + push edx + call display_number + mov dl,'.' + call display_character + pop eax + call display_number + mov esi,_seconds_suffix + call display_string + display_bytes_count: + mov eax,[written_size] + call display_number + mov esi,_bytes_suffix + call display_string + xor al,al + jmp exit_program + +information: + mov esi,_usage + call display_string + mov al,1 + jmp exit_program + +get_params: + mov [input_file],0 + mov [output_file],0 + mov [symbols_file],0 + mov [memory_setting],0 + mov [passes_limit],100 + + mov ecx,[argc] + mov ebx,[argv] + add ebx,4 + dec ecx + jz bad_params + mov [definitions_pointer],predefinitions + get_param: + mov esi,[ebx] + mov al,[esi] + cmp al,'-' + je option_param + cmp [input_file],0 + jne get_output_file + mov [input_file],esi + jmp next_param + get_output_file: + cmp [output_file],0 + jne bad_params + mov [output_file],esi + jmp next_param + option_param: + inc esi + lodsb + cmp al,'m' + je memory_option + cmp al,'M' + je memory_option + cmp al,'p' + je passes_option + cmp al,'P' + je passes_option + cmp al,'d' + je definition_option + cmp al,'D' + je definition_option + cmp al,'s' + je symbols_option + cmp al,'S' + je symbols_option + bad_params: + stc + ret + memory_option: + cmp byte [esi],0 + jne get_memory_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_memory_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,1 shl (32-10) + jae bad_params + mov [memory_setting],edx + jmp next_param + passes_option: + cmp byte [esi],0 + jne get_passes_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_passes_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,10000h + ja bad_params + mov [passes_limit],dx + next_param: + add ebx,4 + dec ecx + jnz get_param + cmp [input_file],0 + je bad_params + mov eax,[definitions_pointer] + mov byte [eax],0 + mov [initial_definitions],predefinitions + clc + ret + definition_option: + cmp byte [esi],0 + jne get_definition + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_definition: + push edi + mov edi,[definitions_pointer] + call convert_definition_option + mov [definitions_pointer],edi + pop edi + jc bad_params + jmp next_param + symbols_option: + cmp byte [esi],0 + jne get_symbols_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_symbols_setting: + mov [symbols_file],esi + jmp next_param + get_option_value: + xor eax,eax + mov edx,eax + get_option_digit: + lodsb + cmp al,20h + je option_value_ok + cmp al,0Dh + je option_value_ok + or al,al + jz option_value_ok + sub al,30h + jc invalid_option_value + cmp al,9 + ja invalid_option_value + imul edx,10 + jo invalid_option_value + add edx,eax + jc invalid_option_value + jmp get_option_digit + option_value_ok: + dec esi + clc + ret + invalid_option_value: + stc + ret + convert_definition_option: + mov edx,edi + xor al,al + stosb + copy_definition_name: + lodsb + cmp al,'=' + je copy_definition_value + cmp al,20h + je bad_definition_option + or al,al + jz bad_definition_option + stosb + inc byte [edx] + jnz copy_definition_name + bad_definition_option: + stc + ret + copy_definition_value: + lodsb + cmp al,20h + je definition_value_end + or al,al + jz definition_value_end + stosb + jmp copy_definition_value + definition_value_end: + dec esi + xor al,al + stosb + clc + ret + +include 'system.inc' + +include '..\version.inc' + +include '..\errors.inc' +include '..\symbdump.inc' +include '..\preproce.inc' +include '..\parser.inc' +include '..\exprpars.inc' +include '..\exprcalc.inc' +include '..\assemble.inc' +include '..\formats.inc' +include '..\armv8.inc' + +include '..\armtable.inc' +include '..\messages.inc' + +_copyright db 'Copyright (c) 2005-2023, revolution',0Ah,\ + 'Some portions copyright (c) 1999-2016, Tomasz Grysztar',0Ah,0 + +_logo db 'flat assembler for ARM version ',ARM_VERSION_STRING,' (built on fasm ',VERSION_STRING,')',0 +_usage db 0xA + db 'usage: fasmasm <source> [output]',0xA + db 'optional settings:',0xA + db ' -m <limit> set the limit in kilobytes for the available memory',0Ah + db ' -p <limit> set the maximum allowed number of passes',0Ah + db ' -d <name>=<value> define symbolic variable',0Ah + db ' -s <file> dump symbolic information for debugging',0Ah + db 0 +_memory_prefix db ' (',0 +_memory_suffix db ' kilobytes memory)',0xA,0 +_passes_suffix db ' passes, ',0 +_seconds_suffix db ' seconds, ',0 +_bytes_suffix db ' bytes.',0xA,0 + +section '.bss' writeable align 4 + +include '..\variable.inc' + +argc dd ? +argv dd ? +stack_frame dd ? +memory_setting dd ? +definitions_pointer dd ? +start_time dd ? +timestamp dq ? +con_handle dd ? +displayed_count dd ? +last_displayed db ? +character db ? +preprocessing_done db ? + +predefinitions rb 1000h +buffer rb 1000h diff --git a/source/linux/fasmarm.asm b/source/linux/fasmarm.asm new file mode 100644 index 0000000..78f7992 --- /dev/null +++ b/source/linux/fasmarm.asm @@ -0,0 +1,441 @@ + +; flat assembler interface for Linux +; Copyright (c) 1999-2016, Tomasz Grysztar. +; All rights reserved. + + format ELF executable 3 + entry start + +stdin = 0 +stdout = 1 +stderr = 2 + +segment readable executable + +start: + + mov [con_handle],stdout + mov [command_line],esp + mov ecx,[esp] + lea ebx,[esp+4+ecx*4+4] + mov [environment],ebx + call get_params + pushf + jc show_logo + cmp [con_handle],stdout + jnz logo_done + show_logo: + mov esi,_logo + call display_string + logo_done: + popf + jc information + + call init_memory + + cmp [con_handle],stdout + jnz memory_done + mov esi,_memory_prefix + call display_string + mov eax,[memory_end] + sub eax,[memory_start] + add eax,[additional_memory_end] + sub eax,[additional_memory] + shr eax,10 + call display_number + mov esi,_memory_suffix + call display_string + memory_done: + + mov eax,78 + mov ebx,buffer + xor ecx,ecx + int 0x80 + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + mov [start_time],eax + + and [preprocessing_done],0 + call preprocessor + or [preprocessing_done],-1 + call parser + call ARM_label_walker ;this line added for ARM + call assembler + call ARM_close_dwarf ;this line added for ARM + call formatter + + call display_user_messages + cmp [con_handle],stdout + jnz details_done + movzx eax,[current_pass] + inc eax + call display_number + mov esi,_passes_suffix + call display_string + mov eax,78 + mov ebx,buffer + xor ecx,ecx + int 0x80 + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + sub eax,[start_time] + jnc time_ok + add eax,3600000 + time_ok: + xor edx,edx + mov ebx,100 + div ebx + or eax,eax + jz display_bytes_count + xor edx,edx + mov ebx,10 + div ebx + push edx + call display_number + mov dl,'.' + call display_character + pop eax + call display_number + mov esi,_seconds_suffix + call display_string + display_bytes_count: + mov eax,[written_size] + call display_number + mov esi,_bytes_suffix + call display_string + details_done: + xor al,al + jmp exit_program + +information: + mov esi,_usage + call display_string + mov al,1 + jmp exit_program + +get_params: + mov ebx,[command_line] + mov [input_file],0 + mov [output_file],0 + mov [symbols_file],0 + mov [memory_setting],0 + mov [passes_limit],100 + mov ecx,[ebx] + add ebx,8 + dec ecx + jz bad_params + mov [definitions_pointer],predefinitions + get_param: + mov esi,[ebx] + mov ax,[esi] + cmp ax,'-' + jz stdin_stdout + cmp al,'-' + je option_param + stdin_stdout: + cmp [input_file],0 + jne get_output_file + mov [input_file],esi + jmp next_param + get_output_file: + cmp [output_file],0 + jne bad_params + mov [output_file],esi + jmp next_param + option_param: + inc esi + lodsb + cmp al,'m' + je memory_option + cmp al,'M' + je memory_option + cmp al,'p' + je passes_option + cmp al,'P' + je passes_option + cmp al,'d' + je definition_option + cmp al,'D' + je definition_option + cmp al,'s' + je symbols_option + cmp al,'S' + je symbols_option + bad_params: + stc + ret + memory_option: + cmp byte [esi],0 + jne get_memory_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_memory_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,1 shl (32-10) + jae bad_params + mov [memory_setting],edx + jmp next_param + passes_option: + cmp byte [esi],0 + jne get_passes_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_passes_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,10000h + ja bad_params + mov [passes_limit],dx + next_param: + add ebx,4 + dec ecx + jnz get_param + mov eax,[input_file] + test eax,eax + je bad_params + mov ecx,[output_file] + cmp word[eax],'-' + jnz output_file_okay + test ecx,ecx + jnz check_con_handle + mov [output_file],eax + mov ecx,eax + output_file_okay: + test ecx,ecx + jz con_handle_okay + check_con_handle: + cmp word[ecx],'-' + jnz con_handle_okay + mov [con_handle],stderr + con_handle_okay: + mov eax,[definitions_pointer] + mov byte [eax],0 + mov [initial_definitions],predefinitions + clc + ret + definition_option: + cmp byte [esi],0 + jne get_definition + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_definition: + push edi + mov edi,[definitions_pointer] + call convert_definition_option + mov [definitions_pointer],edi + pop edi + jc bad_params + jmp next_param + symbols_option: + cmp byte [esi],0 + jne get_symbols_setting + dec ecx + jz bad_params + add ebx,4 + mov esi,[ebx] + get_symbols_setting: + mov [symbols_file],esi + jmp next_param + get_option_value: + xor eax,eax + mov edx,eax + get_option_digit: + lodsb + cmp al,20h + je option_value_ok + or al,al + jz option_value_ok + sub al,30h + jc invalid_option_value + cmp al,9 + ja invalid_option_value + imul edx,10 + jo invalid_option_value + add edx,eax + jc invalid_option_value + jmp get_option_digit + option_value_ok: + dec esi + clc + ret + invalid_option_value: + stc + ret + convert_definition_option: + mov edx,edi + cmp edi,predefinitions+1000h + jae bad_definition_option + xor al,al + stosb + copy_definition_name: + lodsb + cmp al,'=' + je copy_definition_value + cmp al,20h + je bad_definition_option + or al,al + jz bad_definition_option + cmp edi,predefinitions+1000h + jae bad_definition_option + stosb + inc byte [edx] + jnz copy_definition_name + bad_definition_option: + stc + ret + copy_definition_value: + lodsb + cmp al,20h + je definition_value_end + or al,al + jz definition_value_end + cmp edi,predefinitions+1000h + jae bad_definition_option + stosb + jmp copy_definition_value + definition_value_end: + dec esi + cmp edi,predefinitions+1000h + jae bad_definition_option + xor al,al + stosb + clc + ret + +open_stdin: + cmp word[edx],'-' + jnz adapt_path + mov ebx,stdin + pop eax ebp edi esi + clc + ret + +open_stdout: + cmp word[edx],'-' + jnz adapt_path + mov ebx,stdout + pop eax edx ebp edi esi + clc + ret + +ARM_preprocess_file: + push [memory_end] + push esi + ;ebx = file handle + ;edi = start of free memory + push edi + mov edx,edi ; destination + keep_reading: + mov ecx,[memory_end] + dec ecx + sub ecx,edx ; memory buffer size + jbe out_of_memory + call read + add edx,eax + test eax,eax + jnz keep_reading + lea esi,[edx-1] + sub edx,edi ; input length + mov ecx,edx + mov edi,[memory_end] + sub edi,2 + mov byte [edi+1],1Ah + std + rep movs byte [edi],[esi] + cld + inc edi + mov [memory_end],edi + mov esi,edi + pop edi + call close + pop edx + xor ecx,ecx + mov ebx,esi + jmp preprocess_source + +include 'system.inc' + +include '..\version.inc' + +include '..\errors.inc' +include '..\symbdump.inc' +include '..\preproce.inc' +include '..\parser.inc' +include '..\exprpars.inc' +include '..\exprcalc.inc' +include '..\assemble.inc' +include '..\formats.inc' +include '..\armv8.inc' + +;patches to enable "-" to read/write using stdin/stdout + +patch open, call adapt_path, call open_stdin, 3 +patch create, call adapt_path, call open_stdout, 4 +patch read, <<cmp eax,ecx>>, <<cmp eax,eax>>, 23 +patch predefinitions_ok, call preprocess_file, call ARM_preprocess_file, 25 +patch copy_preprocessed_path, call preprocess_file, call ARM_preprocess_file, 28 + +;patch to fix bug with lseek error detection + +patch lseek, <<cmp eax,-1>,<je file_error>,<clc>>, <<cmp eax,-4095>,<cmc>>, 13 + +include '..\armtable.inc' +include '..\messages.inc' + +_copyright db 'Copyright (c) 2005-2023, revolution',0Ah,\ + 'Some portions copyright (c) 1999-2016, Tomasz Grysztar',0Ah,0 + +_logo db 'flat assembler for ARM version ',ARM_VERSION_STRING,' (built on fasm ',VERSION_STRING,')',0 +_usage db 0xA + db 'usage: fasmarm <source> [output]',0xA + db 'optional settings:',0xA + db ' -m <limit> set the limit in kilobytes for the available memory',0Ah + db ' -p <limit> set the maximum allowed number of passes',0Ah + db ' -d <name>=<value> define symbolic variable',0Ah + db ' -s <file> dump symbolic information for debugging',0Ah + db 0 +_memory_prefix db ' (',0 +_memory_suffix db ' kilobytes memory)',0xA,0 +_passes_suffix db ' passes, ',0 +_seconds_suffix db ' seconds, ',0 +_bytes_suffix db ' bytes.',0xA,0 + +segment readable writeable + +align 4 + +include '..\variable.inc' + +command_line dd ? +memory_setting dd ? +definitions_pointer dd ? +environment dd ? +timestamp dq ? +start_time dd ? +con_handle dd ? +displayed_count dd ? +last_displayed db ? +character db ? +preprocessing_done db ? + +predefinitions rb 1000h +buffer rb 1000h diff --git a/source/linux/x64/fasmarm.asm b/source/linux/x64/fasmarm.asm new file mode 100644 index 0000000..5dfd274 --- /dev/null +++ b/source/linux/x64/fasmarm.asm @@ -0,0 +1,460 @@ + +; flat assembler interface for Linux x64 +; Copyright (c) 1999-2022, Tomasz Grysztar. +; All rights reserved. + + format ELF64 executable 3 at 400000h + entry start + +stdin = 0 +stdout = 1 +stderr = 2 + + include 'modes.inc' + +segment readable executable + +start: + + mov [con_handle],stdout + + mov [command_line],rsp + mov rcx,[rsp] + lea rbx,[rsp+8+rcx*8+8] + mov [environment],rbx + call get_params + pushf + jc show_logo + cmp [con_handle],stdout + jnz logo_done + show_logo: + mov esi,_logo + call display_string + logo_done: + popf + jc information + call init_memory + + cmp [con_handle],stdout + jnz memory_done + mov esi,_memory_prefix + call display_string + mov eax,[memory_end] + sub eax,[memory_start] + add eax,[additional_memory_end] + sub eax,[additional_memory] + shr eax,10 + call display_number + mov esi,_memory_suffix + call display_string + memory_done: + + mov eax,96 + mov edi,buffer + xor esi,esi + syscall + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + mov [start_time],eax + + and [preprocessing_done],0 + call preprocessor + or [preprocessing_done],-1 + call parser + call ARM_label_walker ;this line added for ARM + call assembler + call ARM_close_dwarf ;this line added for ARM + call formatter + + call display_user_messages + cmp [con_handle],stdout + jnz details_done + movzx eax,[current_pass] + inc eax + call display_number + mov esi,_passes_suffix + call display_string + mov eax,96 + mov edi,buffer + xor esi,esi + syscall + mov eax,dword [buffer] + mov ecx,1000 + mul ecx + mov ebx,eax + mov eax,dword [buffer+4] + div ecx + add eax,ebx + sub eax,[start_time] + jnc time_ok + add eax,3600000 + time_ok: + xor edx,edx + mov ebx,100 + div ebx + or eax,eax + jz display_bytes_count + xor edx,edx + mov ebx,10 + div ebx + push edx + call display_number + mov dl,'.' + call display_character + pop eax + call display_number + mov esi,_seconds_suffix + call display_string + display_bytes_count: + mov eax,[written_size] + call display_number + mov esi,_bytes_suffix + call display_string + details_done: + xor al,al + jmp exit_program + +information: + mov esi,_usage + call display_string + mov al,1 + jmp exit_program + +get_params: + mov rbx,[command_line] + mov [input_file],0 + mov [output_file],0 + mov [symbols_file],0 + mov [memory_setting],0 + mov [passes_limit],100 + mov rcx,[rbx] + add rbx,8*2 + dec rcx + jz bad_params + mov [definitions_pointer],predefinitions + mov [path_pointer],paths + get_param: + mov rsi,[rbx] + mov ax,[rsi] + cmp ax,'-' + jz stdin_stdout + cmp al,'-' + je option_param + stdin_stdout: + cmp [input_file],0 + jne get_output_file + call collect_path + mov [input_file],edx + jmp next_param + get_output_file: + cmp [output_file],0 + jne bad_params + call collect_path + mov [output_file],edx + jmp next_param + option_param: + inc rsi + lodsb + cmp al,'m' + je memory_option + cmp al,'M' + je memory_option + cmp al,'p' + je passes_option + cmp al,'P' + je passes_option + cmp al,'d' + je definition_option + cmp al,'D' + je definition_option + cmp al,'s' + je symbols_option + cmp al,'S' + je symbols_option + bad_params: + stc + ret + memory_option: + cmp byte [rsi],0 + jne get_memory_setting + dec rcx + jz bad_params + add rbx,8 + mov rsi,[rbx] + get_memory_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,1 shl (32-10) + jae bad_params + mov [memory_setting],edx + jmp next_param + passes_option: + cmp byte [rsi],0 + jne get_passes_setting + dec rcx + jz bad_params + add rbx,8 + mov rsi,[rbx] + get_passes_setting: + call get_option_value + or edx,edx + jz bad_params + cmp edx,10000h + ja bad_params + mov [passes_limit],dx + next_param: + add rbx,8 + dec rcx + jnz get_param + mov eax,[input_file] + test eax,eax + je bad_params + mov ecx,[output_file] + cmp word[eax],'-' + jnz output_file_okay + test ecx,ecx + jnz check_con_handle + mov [output_file],eax + mov ecx,eax + output_file_okay: + test ecx,ecx + jz con_handle_okay + check_con_handle: + cmp word[ecx],'-' + jnz con_handle_okay + mov [con_handle],stderr + con_handle_okay: + mov eax,[definitions_pointer] + mov byte [eax],0 + mov [initial_definitions],predefinitions + clc + ret + definition_option: + cmp byte [rsi],0 + jne get_definition + dec rcx + jz bad_params + add rbx,8 + mov rsi,[rbx] + get_definition: + mov r12d,edi + mov edi,[definitions_pointer] + call convert_definition_option + mov [definitions_pointer],edi + mov edi,r12d + jc bad_params + jmp next_param + symbols_option: + cmp byte [rsi],0 + jne get_symbols_setting + dec rcx + jz bad_params + add rbx,8 + mov rsi,[rbx] + get_symbols_setting: + call collect_path + mov [symbols_file],edx + jmp next_param + get_option_value: + xor eax,eax + mov edx,eax + get_option_digit: + lodsb + cmp al,20h + je option_value_ok + or al,al + jz option_value_ok + sub al,30h + jc invalid_option_value + cmp al,9 + ja invalid_option_value + imul edx,10 + jo invalid_option_value + add edx,eax + jc invalid_option_value + jmp get_option_digit + option_value_ok: + dec rsi + clc + ret + invalid_option_value: + stc + ret + convert_definition_option: + mov edx,edi + cmp edi,predefinitions+1000h + jae bad_definition_option + xor al,al + stosb + copy_definition_name: + lodsb + cmp al,'=' + je copy_definition_value + cmp al,20h + je bad_definition_option + or al,al + jz bad_definition_option + cmp edi,predefinitions+1000h + jae bad_definition_option + stosb + inc byte [edx] + jnz copy_definition_name + bad_definition_option: + stc + ret + copy_definition_value: + lodsb + cmp al,20h + je definition_value_end + or al,al + jz definition_value_end + cmp edi,predefinitions+1000h + jae bad_definition_option + stosb + jmp copy_definition_value + definition_value_end: + dec rsi + cmp edi,predefinitions+1000h + jae bad_definition_option + xor al,al + stosb + clc + ret +collect_path: + mov edi,[path_pointer] + mov edx,edi + copy_path_to_low_memory: + lodsb + stosb + test al,al + jnz copy_path_to_low_memory + mov [path_pointer],edi + retn + +open_stdin: + cmp word[edx],'-' + jnz adapt_path + mov ebx,stdin + POP rcx + clc + ret + +open_stdout: + cmp word[edx],'-' + jnz adapt_path + mov ebx,stdout + POP rcx + clc + ret + +ARM_preprocess_file: + push [memory_end] + push esi + ;ebx = file handle + ;edi = start of free memory + push edi + mov edx,edi ; destination + keep_reading: + mov ecx,[memory_end] + dec ecx + sub ecx,edx ; memory buffer size + jbe out_of_memory + call read + add edx,eax + test eax,eax + jnz keep_reading + lea esi,[edx-1] + sub edx,edi ; input length + mov ecx,edx + mov edi,[memory_end] + sub edi,2 + mov byte [edi+1],1Ah + std + rep movs byte [edi],[esi] + cld + inc edi + mov [memory_end],edi + mov esi,edi + pop edi + call close + pop edx + xor ecx,ecx + mov ebx,esi + jmp preprocess_source + +include 'system.inc' + +include '..\..\version.inc' + +include '..\..\errors.inc' +include '..\..\symbdump.inc' +include '..\..\preproce.inc' +include '..\..\parser.inc' +include '..\..\exprpars.inc' +include '..\..\exprcalc.inc' +include '..\..\assemble.inc' +include '..\..\formats.inc' +include '..\..\armv8.inc' + +;patches to enable "-" to read/write using stdin/stdout + +patch open, call adapt_path, call open_stdin, 6 +patch create, call adapt_path, call open_stdout, 9 +patch read, <<cmp eax,ecx>>, <<cmp eax,eax>>, 33 +patch predefinitions_ok, call preprocess_file, call ARM_preprocess_file, 25 +patch copy_preprocessed_path, call preprocess_file, call ARM_preprocess_file, 49 + +;patch to fix bug with lseek error detection + +patch lseek, <<cmp eax,-1>,<je file_error>,<clc>>, <<cmp eax,-4095>,<cmc>>, 27 + +include '..\..\armtable.inc' +include '..\..\messages.inc' + +_copyright db 'Copyright (c) 2005-2023, revolution',0Ah,\ + 'Some portions copyright (c) 1999-2016, Tomasz Grysztar',0Ah,0 + +_logo db 'flat assembler for ARM version ',ARM_VERSION_STRING,' (built on fasm ',VERSION_STRING,')',0 +_usage db 0xA + db 'usage: fasmarm <source> [output]',0xA + db 'optional settings:',0xA + db ' -m <limit> set the limit in kilobytes for the available memory',0xA + db ' -p <limit> set the maximum allowed number of passes',0xA + db ' -d <name>=<value> define symbolic variable',0xA + db ' -s <file> dump symbolic information for debugging',0xA + db 0 +_memory_prefix db ' (',0 +_memory_suffix db ' kilobytes memory, x64)',0xA,0 +_passes_suffix db ' passes, ',0 +_seconds_suffix db ' seconds, ',0 +_bytes_suffix db ' bytes.',0xA,0 +_no_low_memory db 'failed to allocate memory within 32-bit addressing range',0 + +segment readable writeable + +align 4 + +include '..\..\variable.inc' + +command_line dq ? +memory_setting dd ? +path_pointer dd ? +definitions_pointer dd ? +environment dq ? +timestamp dq ? +start_time dd ? +con_handle dd ? +displayed_count dd ? +last_displayed db ? +character db ? +preprocessing_done db ? + +buffer rb 1000h +predefinitions rb 1000h +paths rb 10000h diff --git a/source/win32/fasmarm.asm b/source/win32/fasmarm.asm new file mode 100644 index 0000000..cb42e06 --- /dev/null +++ b/source/win32/fasmarm.asm @@ -0,0 +1,423 @@ + +; flat assembler interface for Win32 +; Copyright (c) 1999-2016, Tomasz Grysztar. +; All rights reserved. + + format PE console large + +section '.text' code readable executable + +start: + + mov [con_handle],STD_OUTPUT_HANDLE + mov esi,_logo + call display_string + + call get_params + jc information + + call init_memory + + mov esi,_memory_prefix + call display_string + mov eax,[memory_end] + sub eax,[memory_start] + add eax,[additional_memory_end] + sub eax,[additional_memory] + shr eax,10 + call display_number + mov esi,_memory_suffix + call display_string + + call [GetTickCount] + mov [start_time],eax + + and [preprocessing_done],0 + call preprocessor + or [preprocessing_done],-1 + call parser + call ARM_label_walker ;this line added for ARM + call assembler + call ARM_close_dwarf ;this line added for ARM + call formatter + + call display_user_messages + movzx eax,[current_pass] + inc eax + call display_number + mov esi,_passes_suffix + call display_string + call [GetTickCount] + sub eax,[start_time] + xor edx,edx + mov ebx,100 + div ebx + or eax,eax + jz display_bytes_count + xor edx,edx + mov ebx,10 + div ebx + push edx + call display_number + mov dl,'.' + call display_character + pop eax + call display_number + mov esi,_seconds_suffix + call display_string + display_bytes_count: + mov eax,[written_size] + call display_number + mov esi,_bytes_suffix + call display_string + xor al,al + jmp exit_program + +information: + mov esi,_usage + call display_string + mov al,1 + jmp exit_program + +get_params: + mov [input_file],0 + mov [output_file],0 + mov [symbols_file],0 + mov [memory_setting],0 + mov [passes_limit],100 + call [GetCommandLine] + mov [definitions_pointer],predefinitions + mov esi,eax + mov edi,params + find_command_start: + lodsb + cmp al,20h + je find_command_start + cmp al,22h + je skip_quoted_name + skip_name: + lodsb + cmp al,20h + je find_param + or al,al + jz all_params + jmp skip_name + skip_quoted_name: + lodsb + cmp al,22h + je find_param + or al,al + jz all_params + jmp skip_quoted_name + find_param: + lodsb + cmp al,20h + je find_param + cmp al,'-' + je option_param + cmp al,0Dh + je all_params + or al,al + jz all_params + cmp [input_file],0 + jne get_output_file + mov [input_file],edi + jmp process_param + get_output_file: + cmp [output_file],0 + jne bad_params + mov [output_file],edi + process_param: + cmp al,22h + je string_param + copy_param: + stosb + lodsb + cmp al,20h + je param_end + cmp al,0Dh + je param_end + or al,al + jz param_end + jmp copy_param + string_param: + lodsb + cmp al,22h + je string_param_end + cmp al,0Dh + je param_end + or al,al + jz param_end + stosb + jmp string_param + option_param: + lodsb + cmp al,'m' + je memory_option + cmp al,'M' + je memory_option + cmp al,'p' + je passes_option + cmp al,'P' + je passes_option + cmp al,'d' + je definition_option + cmp al,'D' + je definition_option + cmp al,'s' + je symbols_option + cmp al,'S' + je symbols_option + bad_params: + stc + ret + get_option_value: + xor eax,eax + mov edx,eax + get_option_digit: + lodsb + cmp al,20h + je option_value_ok + cmp al,0Dh + je option_value_ok + or al,al + jz option_value_ok + sub al,30h + jc invalid_option_value + cmp al,9 + ja invalid_option_value + imul edx,10 + jo invalid_option_value + add edx,eax + jc invalid_option_value + jmp get_option_digit + option_value_ok: + dec esi + clc + ret + invalid_option_value: + stc + ret + memory_option: + lodsb + cmp al,20h + je memory_option + cmp al,0Dh + je bad_params + or al,al + jz bad_params + dec esi + call get_option_value + or edx,edx + jz bad_params + cmp edx,1 shl (32-10) + jae bad_params + mov [memory_setting],edx + jmp find_param + passes_option: + lodsb + cmp al,20h + je passes_option + cmp al,0Dh + je bad_params + or al,al + jz bad_params + dec esi + call get_option_value + or edx,edx + jz bad_params + cmp edx,10000h + ja bad_params + mov [passes_limit],dx + jmp find_param + definition_option: + lodsb + cmp al,20h + je definition_option + cmp al,0Dh + je bad_params + or al,al + jz bad_params + dec esi + push edi + mov edi,[definitions_pointer] + call convert_definition_option + mov [definitions_pointer],edi + pop edi + jc bad_params + jmp find_param + symbols_option: + mov [symbols_file],edi + find_symbols_file_name: + lodsb + cmp al,20h + jne process_param + jmp find_symbols_file_name + param_end: + dec esi + string_param_end: + xor al,al + stosb + jmp find_param + all_params: + cmp [input_file],0 + je bad_params + mov eax,[definitions_pointer] + mov byte [eax],0 + mov [initial_definitions],predefinitions + clc + ret + convert_definition_option: + mov ecx,edi + xor al,al + stosb + copy_definition_name: + lodsb + cmp al,'=' + je copy_definition_value + cmp al,20h + je bad_definition_option + cmp al,0Dh + je bad_definition_option + or al,al + jz bad_definition_option + stosb + inc byte [ecx] + jnz copy_definition_name + bad_definition_option: + stc + ret + copy_definition_value: + lodsb + cmp al,20h + je definition_value_end + cmp al,0Dh + je definition_value_end + or al,al + jz definition_value_end + cmp al,'\' + jne definition_value_character + cmp byte [esi],20h + jne definition_value_character + lodsb + definition_value_character: + stosb + jmp copy_definition_value + definition_value_end: + dec esi + xor al,al + stosb + clc + ret + +include '..\version.inc' +include 'systemarm.inc' + +include '..\errors.inc' +include '..\symbdump.inc' +include '..\preproce.inc' +include '..\parser.inc' +include '..\exprpars.inc' +include '..\exprcalc.inc' +include '..\assemble.inc' +include '..\formats.inc' +include '..\armv8.inc' + +include '..\armtable.inc' +include '..\messages.inc' + +section '.data' data readable writeable + +_copyright db 'Copyright (c) 2005-2023, revolution',0Dh,0Ah,\ + 'Some portions copyright (c) 1999-2016, Tomasz Grysztar',0Dh,0Ah,0 + +_logo db 'flat assembler for ARM version ',ARM_VERSION_STRING,' (built on fasm ',VERSION_STRING,')',0 +_usage db 0Dh,0Ah + db 'usage: fasmarm <source> [output]',0Dh,0Ah + db 'optional settings:',0Dh,0Ah + db ' -m <limit> set the limit in kilobytes for the available memory',0Dh,0Ah + db ' -p <limit> set the maximum allowed number of passes',0Dh,0Ah + db ' -d <name>=<value> define symbolic variable',0Dh,0Ah + db ' -s <file> dump symbolic information for debugging',0Dh,0Ah + db 0 +_memory_prefix db ' (',0 +_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0 +_passes_suffix db ' passes, ',0 +_seconds_suffix db ' seconds, ',0 +_bytes_suffix db ' bytes.',0Dh,0Ah,0 + +align 4 + +include '..\variable.inc' + +con_handle dd ? +memory_setting dd ? +start_time dd ? +definitions_pointer dd ? +bytes_count dd ? +displayed_count dd ? +character db ? +last_displayed rb 2 +preprocessing_done db ? + +params rb 1000h +options rb 1000h +predefinitions rb 1000h +buffer rb 4000h + +stack 10000h + +section '.idata' import data readable writeable + + dd 0,0,0,rva kernel_name,rva kernel_table + dd 0,0,0,0,0 + + kernel_table: + ExitProcess dd rva _ExitProcess + CreateFile dd rva _CreateFileA + ReadFile dd rva _ReadFile + WriteFile dd rva _WriteFile + CloseHandle dd rva _CloseHandle + SetFilePointer dd rva _SetFilePointer + GetCommandLine dd rva _GetCommandLineA + GetEnvironmentVariable dd rva _GetEnvironmentVariable + GetStdHandle dd rva _GetStdHandle + VirtualAlloc dd rva _VirtualAlloc + VirtualFree dd rva _VirtualFree + GetTickCount dd rva _GetTickCount + GetSystemTime dd rva _GetSystemTime + SetUnhandledExceptionFilter dd rva _SetUnhandledExceptionFilter + dd 0 + + kernel_name db 'KERNEL32.DLL',0 + + _ExitProcess dw 0 + db 'ExitProcess',0 + _CreateFileA dw 0 + db 'CreateFileA',0 + _ReadFile dw 0 + db 'ReadFile',0 + _WriteFile dw 0 + db 'WriteFile',0 + _CloseHandle dw 0 + db 'CloseHandle',0 + _SetFilePointer dw 0 + db 'SetFilePointer',0 + _GetCommandLineA dw 0 + db 'GetCommandLineA',0 + _GetEnvironmentVariable dw 0 + db 'GetEnvironmentVariableA',0 + _GetStdHandle dw 0 + db 'GetStdHandle',0 + _VirtualAlloc dw 0 + db 'VirtualAlloc',0 + _VirtualFree dw 0 + db 'VirtualFree',0 + _GetTickCount dw 0 + db 'GetTickCount',0 + _GetSystemTime dw 0 + db 'GetSystemTime',0 + _SetUnhandledExceptionFilter dw 0 + db 'SetUnhandledExceptionFilter',0 + +section '.reloc' fixups data readable discardable diff --git a/source/win32/systemarm.inc b/source/win32/systemarm.inc new file mode 100644 index 0000000..510f489 --- /dev/null +++ b/source/win32/systemarm.inc @@ -0,0 +1,628 @@ +MEMORY_ALLOCATION_BLOCK_SIZE = 1 shl 16 ;64kB. Higher numbers reduce the number of calls to the allocator. A value of 1 will allocate just the page where the memory is accessed +MEMORY_ALLOCATION_MAX_SIZE = 0x7ffc0000 ;Windows fails all calls that try to allocate more than this + +; flat assembler interface for Win32 +; Copyright (c) 1999-2015, Tomasz Grysztar. +; All rights reserved. + +CREATE_NEW = 1 +CREATE_ALWAYS = 2 +OPEN_EXISTING = 3 +OPEN_ALWAYS = 4 +TRUNCATE_EXISTING = 5 + +FILE_SHARE_READ = 1 +FILE_SHARE_WRITE = 2 +FILE_SHARE_DELETE = 4 + +GENERIC_READ = 80000000h +GENERIC_WRITE = 40000000h + +STD_INPUT_HANDLE = 0FFFFFFF6h +STD_OUTPUT_HANDLE = 0FFFFFFF5h +STD_ERROR_HANDLE = 0FFFFFFF4h + +MEM_COMMIT = 1000h +MEM_RESERVE = 2000h +MEM_DECOMMIT = 4000h +MEM_RELEASE = 8000h +MEM_FREE = 10000h +MEM_PRIVATE = 20000h +MEM_MAPPED = 40000h +MEM_RESET = 80000h +MEM_TOP_DOWN = 100000h + +PAGE_NOACCESS = 1 +PAGE_READONLY = 2 +PAGE_READWRITE = 4 +PAGE_WRITECOPY = 8 +PAGE_EXECUTE = 10h +PAGE_EXECUTE_READ = 20h +PAGE_EXECUTE_READWRITE = 40h +PAGE_EXECUTE_WRITECOPY = 80h +PAGE_GUARD = 100h +PAGE_NOCACHE = 200h + +init_memory: + xor eax,eax + mov [memory_start],eax + mov eax,esp + and eax,not 0FFFh + add eax,1000h-10000h + mov [stack_limit],eax + mov ebx,[memory_setting] + shl ebx,10 + jnz allocate_memory + mov ebx,MEMORY_ALLOCATION_MAX_SIZE + allocate_memory: + push PAGE_READWRITE + push MEM_RESERVE + push ebx + push 0 + call [VirtualAlloc] ;allocate the main section + test eax,eax + jz not_enough_memory + mov [memory_start],eax + add eax,ebx + mov [memory_end],eax + cmp [memory_setting],0 + jnz .use_single_section + mov eax,ebx + shr eax,1 + push PAGE_READWRITE + push MEM_RESERVE + push eax + push 0 + call [VirtualAlloc] ;allocate the additional section + test eax,eax + jz .use_single_section + mov [additional_memory],eax + shr ebx,1 + add eax,ebx + mov [additional_memory_end],eax + .memory_okay: + push memory_allocation_handler + call [SetUnhandledExceptionFilter] + ret + .use_single_section: + mov eax,[memory_end] + mov [additional_memory_end],eax + shr ebx,2 + sub eax,ebx + mov [memory_end],eax + mov [additional_memory],eax + jmp .memory_okay + not_enough_memory: + shr ebx,2 + lea ebx,[ebx*3] + cmp ebx,4000h + jae allocate_memory + jmp out_of_memory + +exit_program: + movzx eax,al + push eax + mov eax,[memory_start] + test eax,eax + jz do_exit + push MEM_RELEASE + push 0 + push eax + call [VirtualFree] + push MEM_RELEASE + push 0 + push [additional_memory] + call [VirtualFree] + do_exit: + call [ExitProcess] + +memory_allocation_handler: + mov eax,[esp+4] ;get pointer to exception information + mov ecx,[eax] ;EXCEPTION_POINTERS.ExceptionRecord + mov edx,[ecx] ;EXCEPTION_RECORD.ExceptionCode + cmp edx,0xc0000005 ;EXCEPTION_ACCESS_VIOLATION + jnz .fail + mov edx,[ecx+24] ;EXCEPTION_RECORD.ExceptionAddress + cmp edx,[memory_start] + jb .check_additional + mov eax,[memory_end] + sub eax,edx ;don't allocate more than EAX bytes + ja .allocate + .check_additional: + cmp edx,[additional_memory] + jb .fail + mov eax,[additional_memory_end] + sub eax,edx ;don't allocate more than EAX bytes + jbe .fail + .allocate: + mov ecx,MEMORY_ALLOCATION_BLOCK_SIZE + cmp eax,ecx + jbe .allocation_size_defined + mov eax,ecx ;don't allocate more than ECX bytes + .allocation_size_defined: + push PAGE_READWRITE + push MEM_COMMIT + push eax ;allocate this many bytes + push edx ;at this address + call [VirtualAlloc] + test eax,eax + jz out_of_memory + mov eax,-1 ;EXCEPTION_CONTINUE_EXECUTION + retn 4 + .fail: ;some other exception happened + mov eax,0 ;EXCEPTION_CONTINUE_SEARCH + retn 4 + +get_environment_variable: + mov ecx,[memory_end] + sub ecx,edi + cmp ecx,4000h + jbe buffer_for_variable_ok + mov ecx,4000h + buffer_for_variable_ok: + push ecx + push edi + push esi + call [GetEnvironmentVariable] + add edi,eax + cmp edi,[memory_end] + jae out_of_memory + ret + +open: + push 0 + push 0 + push OPEN_EXISTING + push 0 + push FILE_SHARE_READ + push GENERIC_READ + push edx + call [CreateFile] + cmp eax,-1 + je file_error + mov ebx,eax + clc + ret + file_error: + stc + ret +create: + push 0 + push 0 + push CREATE_ALWAYS + push 0 + push FILE_SHARE_READ + push GENERIC_WRITE + push edx + call [CreateFile] + cmp eax,-1 + je file_error + mov ebx,eax + clc + ret +write: + push 0 + push bytes_count + push ecx + push edx + push ebx + call [WriteFile] + or eax,eax + jz file_error + clc + ret +read: + mov ebp,ecx + test ecx,ecx + jz .zero_length + push edx + push PAGE_READWRITE + push MEM_COMMIT + push ecx ;allocate the required number of bytes + push edx ;at this address + call [VirtualAlloc] + pop edx + test eax,eax + jz out_of_memory + .zero_length: + push 0 + push bytes_count + push ebp + push edx + push ebx + call [ReadFile] + or eax,eax + jz file_error + cmp ebp,[bytes_count] + jne file_error + clc + ret +close: + push ebx + call [CloseHandle] + ret +lseek: + movzx eax,al + push eax + push 0 + push edx + push ebx + call [SetFilePointer] + ret + +display_string: + push [con_handle] + call [GetStdHandle] + mov ebp,eax + mov edi,esi + or ecx,-1 + xor al,al + repne scasb + neg ecx + sub ecx,2 + push 0 + push bytes_count + push ecx + push esi + push ebp + call [WriteFile] + ret +display_character: + push ebx + mov [character],dl + push [con_handle] + call [GetStdHandle] + mov ebx,eax + push 0 + push bytes_count + push 1 + push character + push ebx + call [WriteFile] + pop ebx + ret +display_number: + push ebx + mov ecx,1000000000 + xor edx,edx + xor bl,bl + display_loop: + div ecx + push edx + cmp ecx,1 + je display_digit + or bl,bl + jnz display_digit + or al,al + jz digit_ok + not bl + display_digit: + mov dl,al + add dl,30h + push ecx + call display_character + pop ecx + digit_ok: + mov eax,ecx + xor edx,edx + mov ecx,10 + div ecx + mov ecx,eax + pop eax + or ecx,ecx + jnz display_loop + pop ebx + ret + +display_user_messages: + mov [displayed_count],0 + call show_display_buffer + cmp [displayed_count],1 + jb line_break_ok + je make_line_break + mov ax,word [last_displayed] + cmp ax,0A0Dh + je line_break_ok + cmp ax,0D0Ah + je line_break_ok + make_line_break: + mov word [buffer],0A0Dh + push [con_handle] + call [GetStdHandle] + push 0 + push bytes_count + push 2 + push buffer + push eax + call [WriteFile] + line_break_ok: + ret +display_block: + add [displayed_count],ecx + cmp ecx,1 + ja take_last_two_characters + jb block_displayed + mov al,[last_displayed+1] + mov ah,[esi] + mov word [last_displayed],ax + jmp block_ok + take_last_two_characters: + mov ax,[esi+ecx-2] + mov word [last_displayed],ax + block_ok: + push ecx + push [con_handle] + call [GetStdHandle] + pop ecx + push 0 + push bytes_count + push ecx + push esi + push eax + call [WriteFile] + block_displayed: + ret + +fatal_error: + mov [con_handle],STD_ERROR_HANDLE + mov esi,error_prefix + call display_string + pop esi + call display_string + mov esi,error_suffix + call display_string + mov al,0FFh + jmp exit_program +assembler_error: + mov [con_handle],STD_ERROR_HANDLE + call display_user_messages + mov ebx,[current_line] + test ebx,ebx + jz display_error_message + push dword 0 + get_error_lines: + mov eax,[ebx] + cmp byte [eax],0 + je get_next_error_line + push ebx + test byte [ebx+7],80h + jz display_error_line + mov edx,ebx + find_definition_origin: + mov edx,[edx+12] + test byte [edx+7],80h + jnz find_definition_origin + push edx + get_next_error_line: + mov ebx,[ebx+8] + jmp get_error_lines + display_error_line: + mov esi,[ebx] + call display_string + mov esi,line_number_start + call display_string + mov eax,[ebx+4] + and eax,7FFFFFFFh + call display_number + mov dl,']' + call display_character + pop esi + cmp ebx,esi + je line_number_ok + mov dl,20h + call display_character + push esi + mov esi,[esi] + movzx ecx,byte [esi] + inc esi + call display_block + mov esi,line_number_start + call display_string + pop esi + mov eax,[esi+4] + and eax,7FFFFFFFh + call display_number + mov dl,']' + call display_character + line_number_ok: + mov esi,line_data_start + call display_string + mov esi,ebx + mov edx,[esi] + call open + mov al,2 + xor edx,edx + call lseek + mov edx,[esi+8] + sub eax,edx + jz line_data_displayed + push eax + xor al,al + call lseek + mov ecx,[esp] + mov edx,[additional_memory] + lea eax,[edx+ecx] + cmp eax,[additional_memory_end] + ja out_of_memory + call read + call close + pop ecx + mov esi,[additional_memory] + get_line_data: + mov al,[esi] + cmp al,0Ah + je display_line_data + cmp al,0Dh + je display_line_data + cmp al,1Ah + je display_line_data + or al,al + jz display_line_data + inc esi + loop get_line_data + display_line_data: + mov ecx,esi + mov esi,[additional_memory] + sub ecx,esi + call display_block + line_data_displayed: + mov esi,cr_lf + call display_string + pop ebx + or ebx,ebx + jnz display_error_line + cmp [preprocessing_done],0 + je display_error_message + mov esi,preprocessed_instruction_prefix + call display_string + mov esi,[current_line] + add esi,16 + mov edi,[additional_memory] + xor dl,dl + convert_instruction: + lodsb + cmp al,1Ah + je copy_symbol + cmp al,22h + je copy_symbol + cmp al,3Bh + je instruction_converted + stosb + or al,al + jz instruction_converted + xor dl,dl + jmp convert_instruction + copy_symbol: + or dl,dl + jz space_ok + mov byte [edi],20h + inc edi + space_ok: + cmp al,22h + je quoted + lodsb + movzx ecx,al + rep movsb + or dl,-1 + jmp convert_instruction + quoted: + mov al,27h + stosb + lodsd + mov ecx,eax + jecxz quoted_copied + copy_quoted: + lodsb + stosb + cmp al,27h + jne quote_ok + stosb + quote_ok: + loop copy_quoted + quoted_copied: + mov al,27h + stosb + or dl,-1 + jmp convert_instruction + instruction_converted: + xor al,al + stosb + mov esi,[additional_memory] + call display_string + mov esi,cr_lf + call display_string + display_error_message: + mov esi,error_prefix + call display_string + pop esi + call display_string + mov esi,error_suffix + call display_string + mov al,2 + jmp exit_program + +make_timestamp: + push buffer + call [GetSystemTime] + movzx ecx,word [buffer] + mov eax,ecx + sub eax,1970 + mov ebx,365 + mul ebx + mov ebp,eax + mov eax,ecx + sub eax,1969 + shr eax,2 + add ebp,eax + mov eax,ecx + sub eax,1901 + mov ebx,100 + div ebx + sub ebp,eax + mov eax,ecx + xor edx,edx + sub eax,1601 + mov ebx,400 + div ebx + add ebp,eax + movzx ecx,word [buffer+2] + mov eax,ecx + dec eax + mov ebx,30 + mul ebx + add ebp,eax + cmp ecx,8 + jbe months_correction + mov eax,ecx + sub eax,7 + shr eax,1 + add ebp,eax + mov ecx,8 + months_correction: + mov eax,ecx + shr eax,1 + add ebp,eax + cmp ecx,2 + jbe day_correction_ok + sub ebp,2 + movzx ecx,word [buffer] + test ecx,11b + jnz day_correction_ok + xor edx,edx + mov eax,ecx + mov ebx,100 + div ebx + or edx,edx + jnz day_correction + mov eax,ecx + mov ebx,400 + div ebx + or edx,edx + jnz day_correction_ok + day_correction: + inc ebp + day_correction_ok: + movzx eax,word [buffer+6] + dec eax + add eax,ebp + mov ebx,24 + mul ebx + movzx ecx,word [buffer+8] + add eax,ecx + mov ebx,60 + mul ebx + movzx ecx,word [buffer+10] + add eax,ecx + mov ebx,60 + mul ebx + movzx ecx,word [buffer+12] + add eax,ecx + adc edx,0 + ret + +error_prefix db 'error: ',0 +error_suffix db '.' +cr_lf db 0Dh,0Ah,0 +line_number_start db ' [',0 +line_data_start db ':',0Dh,0Ah,0 +preprocessed_instruction_prefix db 'processed: ',0 -- 2.39.2

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 literal 0 HcmV?d00001 diff --git a/fasmwarm.exe b/fasmwarm.exe new file mode 100644 index 0000000000000000000000000000000000000000..5181324adb0207f8a950fbdb2be4cc4223f17eef GIT binary patch literal 283648 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