"Fossies" - the Fresh Open Source Software Archive

Member "highlight-3.57-x64/langDefs/fasm.lang" (12 May 2020, 38146 Bytes) of package /windows/www/highlight-3.57-x64.zip:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "fasm.lang": 3.53_vs_3.54.

    1 --[[ "fasm.lang"
    2 ********************************************************************************
    3 *                                                                              *
    4 *                            Flat Assembler (FASM)                             *
    5 *                                                                              *
    6 *                             Language Definition                              *
    7 *                                                                              *
    8 *                              v1.1 - 2017/03/14                               *
    9 *                                                                              *
   10 ********************************************************************************
   11 Flat assembler v1.71.60 language definition for Highlight v3.35.
   12 Associated file extensions: ".ASM" | ".INC"
   13 
   14 Written by Tristano Ajmone:
   15     <tajmone@gmail.com>
   16     https://github.com/tajmone
   17 
   18 Released into the public domain according to the Unlicense license:
   19     http://unlicense.org
   20 --------------------------------------------------------------------------------
   21 Project repository:
   22     https://github.com/tajmone/fasm-highlighting
   23 --------------------------------------------------------------------------------
   24 Syntax tokens were extracted directly from FASM source file "SOURCE/TABLES.INC"
   25 of the MS Windows FASM package ('fasmw17160.zip'); thus ensuring that only FASM-
   26 supported token are highlighted. A few tokens were manualy added (see Notes).
   27 
   28 Since the number of keywords is really huge, I've tried to organize them in
   29 categories as best as I could -- the solution is far from perfect, but it should
   30 simplify maintainance of the syntax file, or porting it to other highlighters.
   31 
   32 Many keywords groups could have been condensed into single RegExs (eg: registers
   33 xmm0-31, ymm0-31 and zmm0-31) but this would have impacted parsing performance,
   34 and complicated maintainance, so for now I rather opted to keep a long lists.
   35 
   36 I've tested the syntax file to a good extent, and it seems to work well, but
   37 there might still be edge cases which need fixing (for eg: see #C,D).
   38 --------------------------------------------------------------------------------
   39                                   CREDITS
   40 --------------------------------------------------------------------------------
   41 My gratitude to André Simon and Tomasz Grysztar for their patience and kind
   42 support to all my enquiries.
   43 
   44 I've looked into the following syntax definitions for inspiration:
   45 
   46 "assembler.lang" -- Assembler definition (29k, 68s, 68x, a51, asm, s, x86) that
   47                     ships with Highlight (authors unknown).
   48 
   49 "fasm.vim" -- Flat assembler syntax file for Vim, by Richard «RIscRIpt»:
   50     https://github.com/RIscRIpt/vim-fasm-syntax
   51 
   52 "x86asm.js" -- Intel x86 Assembly NASM syntax for highlight.js, by innocenat:
   53     https://github.com/isagalaev/highlight.js/blob/master/src/languages/x86asm.js
   54 
   55 
   56 "fasm.xml" -- Highlighting-Kate FASM definition, adapted by John MacFarlane and
   57               Geoff Nixon from Nicola Gigante's and Bogdan Drozdowski's
   58               "Intel x86 (NASM)":
   59     https://github.com/jgm/highlighting-kate/blob/master/xml/fasm.xml
   60 
   61 Sublime FASM-x86 -- Sublime Text 2 package, by René Köcher, based on
   62                     Leonardo Gago's" Assembly-x86" package:
   63     https://github.com/Shirk/Sublime-FASM-x86
   64     https://github.com/ljgago/Assembly-x86
   65 --------------------------------------------------------------------------------
   66 FLAT ASSEMBLER -- (C) 1999, Tomasz Grysztar, licensed under simplified BSD
   67                   with a weak copyleft clause:
   68     https://flatassembler.net
   69 --------------------------------------------------------------------------------
   70 HIGHLIGHT      -- (C) 2002, André Simon, licensed under GNU-GPL3:
   71     http://www.andre-simon.de
   72 --------------------------------------------------------------------------------
   73 ]]
   74 
   75 Description="fasm"
   76 
   77 Categories = {"assembler"}
   78 
   79 IgnoreCase=true
   80 
   81 Digits=[[ (?x)
   82         # ============ HEX ============
   83         # C (0xFF) & Pascal ($FF) style:
   84 
   85           (?:(?<!\$)\b0x|\b0X|(?<!\w|\$)\$)[0-9a-fA-F_']+\b(?!\$)
   86 
   87         # h syntax (0FFh) -- req. leading 0:
   88 
   89         | \b0[0-9a-fA-F_']+[hH]\b
   90 
   91         # ============ OCTAL ============
   92         | \b[0-7_']+[oOqQ]\b         # 377o / 377q                        [See: #4]
   93 
   94         # ============ BINARY ============
   95         | \b[01_']+[bB]\b
   96 
   97         # ============ FLOAT ============
   98         | \b[0-9_']+f\b              # 1f  syntax
   99         | \b[0-9_']+\.[0-9_']+\b       # 1E0 syntax (scientific notation)
  100         | \b[0-9_']+[eE][0-9_']+\b     # 1.0 syntax
  101 
  102         # ============ DECIMAL ============
  103         | (?<!\$)\b[0-9_']+[dD]?\b(?!\$)
  104       ]]
  105 
  106 Operators=[=[[+-/*=<>()[\]{}:,|&~#`;\\]]=]
  107 
  108 Comments={
  109   { Block=false,
  110     Nested=false,
  111     Delimiter = { [[ ; ]] }
  112   }
  113 }
  114 
  115 Strings={
  116   Delimiter=[[ (?<!")"(?!")|(?<!')'(?!') ]],                         -- [See: #1]
  117 }
  118 
  119 Keywords={
  120   { Id=1, -- ============================ REGISTERS =============================
  121     List={
  122     -- Pointer Registers                                                [See: #2]
  123     "eip", "rip",               -- Instruction pointers (32, 64 bit)
  124     "spl", "sp", "esp", "rsp",  -- Stack Pointers (8, 16, 32, 64 bit)
  125     "bpl", "bp", "ebp", "rbp",  -- Stack Base Pointers (8, 16, 32, 64 bit)
  126     -- Index Registers
  127     "sil", "si", "esi", "rsi",  -- Source Indexes (8, 16, 32, 64 bit)
  128     "dil", "di", "edi", "rdi",  -- Destination Indexes (8, 16, 32, 64 bit)
  129     -- 8-bit registers
  130     "al",    "ah",   "bl",     "bh",    "cl",    "ch",    "dl",    "dh",
  131     "r8b",   "r9b",  "r10b",   "r11b",  "r12b",  "r13b",  "r14b",  "r15b",
  132     "r8l",   "r9l",  "r10l",   "r11l",  "r12l",  "r13l",  "r14l",  "r15l",
  133     -- 16-bit registers
  134     "ax",    "bx",   "cx",     "dx",
  135     "r8w",   "r9w",  "r10w",   "r11w",  "r12w",  "r13w",  "r14w",  "r15w",
  136     -- 32-bit registers
  137     "r8d",   "r9d",  "r10d",   "r11d",  "r12d",  "r13d",  "r14d",  "r15d",
  138     "eax",   "ebx",  "ecx",    "edx",
  139     -- 64-bit registers
  140     "rax",   "rbx",  "rcx",    "rdx",
  141     "r8",    "r9",   "r10",    "r11",   "r12",   "r13",   "r14",   "r15",
  142     -- Segment registers
  143     "cs",    "ds",    "es",    "fs",    "gs",    "ss",
  144     -- Floating point stack registers
  145     "st",    "st0",   "st1",   "st2",   "st3",   "st4",   "st5",   "st6",   "st7",
  146     -- MMX Registers (64-bit)
  147     "mm0",   "mm1",   "mm2",   "mm3",   "mm4",   "mm5",   "mm6",   "mm7",
  148     -- SSE registers (128-bit)
  149     "xmm0",  "xmm1",  "xmm2",  "xmm3",  "xmm4",  "xmm5",  "xmm6",  "xmm7",  "xmm8",  "xmm9",
  150     "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", "xmm16", "xmm17", "xmm18", "xmm19",
  151     "xmm20", "xmm21", "xmm22", "xmm23", "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29",
  152     "xmm30", "xmm31",
  153     -- AVX registers (256-bit)
  154     "ymm0",  "ymm1",  "ymm2",  "ymm3",  "ymm4",  "ymm5",  "ymm6",  "ymm7",  "ymm8",  "ymm9",
  155     "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15", "ymm16", "ymm17", "ymm18", "ymm19",
  156     "ymm20", "ymm21", "ymm22", "ymm23", "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29",
  157     "ymm30", "ymm31",
  158     -- AVX-512F registers
  159     "zmm0",  "zmm1",  "zmm2",  "zmm3",  "zmm4",  "zmm5",  "zmm6",  "zmm7",  "zmm8",  "zmm9",
  160     "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15", "zmm16", "zmm17", "zmm18", "zmm19",
  161     "zmm20", "zmm21", "zmm22", "zmm23", "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29",
  162     "zmm30", "zmm31",
  163     -- AVX-512F mask registers
  164     "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
  165     -- Bound (MPX) register
  166     "bnd0", "bnd1", "bnd2", "bnd3",
  167     -- Special registers
  168     "cr0",  "cr1",  "cr2",  "cr3",  "cr4",  "cr8",          -- Control registers
  169             "cr5",  "cr6",  "cr7",  "cr9",  "cr10",
  170             "cr11", "cr12", "cr13", "cr14", "cr15",
  171     "dr0",  "dr1",  "dr2",  "dr3", " dr8",                    -- Debug registers
  172             "dr4",  "dr5",  "dr6", " dr7",  "dr9", "dr10",
  173             "dr11", "dr12", "dr13", "dr14", "dr15",
  174     "tr3",  "tr4",  "tr5",  "tr6",  "tr7",                     -- Test registers
  175             "tr0",  "tr1",  "tr2",
  176       },
  177     },
  178   { Id=2, -- =========================== INSTRUCTIONS ===========================
  179     List={
  180     -- Operators
  181       "and", "mod", "or", "shl", "shr", "xor",
  182       "bsf", "bsr", "not", "plt", "rva",       -- Single operand operators
  183 
  184     -- Uncategorized
  185       "aad", "aam", "adc", "adcx", "add", "addsubps", "adox", "align", "and", "andn",
  186       "arpl", "assert", "bextr", "blcfill", "blci", "blcic", "blcmsk", "blcs", "blsfill",
  187       "blsi", "blsic", "blsmsk", "blsr", "bnd", "bndcl", "bndcn", "bndcu", "bndldx",
  188       "bndmk", "bndmov", "bndstx", "bound", "break", "bsf", "bsr", "bswap", "bt", "btc",
  189       "btr", "bts", "bzhi", "call", "clac", "clc", "cld", "clflush", "clflushopt", "clgi",
  190       "cli", "clts", "clwb", "cmc", "cmova", "cmovae", "cmovb", "cmovbe", "cmovc", "cmove",
  191       "cmovg", "cmovge", "cmovl", "cmovle", "cmovna", "cmovnae", "cmovnb", "cmovnbe",
  192       "cmovnc", "cmovne", "cmovng", "cmovnge", "cmovnl", "cmovnle", "cmovno", "cmovnp",
  193       "cmovns", "cmovnz", "cmovo", "cmovp", "cmovpe", "cmovpo", "cmovs", "cmovz", "cmp",
  194       "cmpeqpd", "cmpeqps", "cmpeqsd", "cmpeqss", "cmplepd", "cmpleps", "cmplesd",
  195       "cmpless", "cmpltpd", "cmpltps", "cmpltsd", "cmpltss", "cmpneqpd", "cmpneqps",
  196       "cmpneqsd", "cmpneqss", "cmpnlepd", "cmpnleps", "cmpnlesd", "cmpnless", "cmpnltpd",
  197       "cmpnltps", "cmpnltsd", "cmpnltss", "cmpordpd", "cmpordps", "cmpordsd", "cmpordss",
  198       "cmppd", "cmpps", "cmps", "cmpsb", "cmpsd", "cmpss", "cmpunordpd", "cmpunordps",
  199       "cmpunordsd", "cmpunordss", "cmpxchg", "cmpxchg16b", "cmpxchg8b", "comisd", "comiss",
  200       "cpuid", "crc32", "cvtdq2pd", "cvtpd2dq", "cvtpd2pi", "cvtpi2pd", "cvtpi2ps",
  201       "cvtps2pd", "cvtps2pi", "cvtsd2si", "cvtsi2sd", "cvtsi2ss", "cvtss2si", "cvttpd2pi",
  202       "cvttps2dq", "cvttps2pi", "cvttsd2si", "cvttss2si", "data", "dec", "display", "div",
  203       "else", "emms", "end", "enter", "entry", "err", "extractps", "extrn", "extrq",
  204       "f2xm1", "fabs", "fadd", "faddp", "fbld", "fbstp", "fchs", "fclex", "fcmovb",
  205       "fcmovbe", "fcmove", "fcmovnb", "fcmovnbe", "fcmovne", "fcmovnu", "fcmovu", "fcom",
  206       "fcomi", "fcomip", "fcomp", "fcompp", "fcos", "fdecstp", "fdisi", "fdiv", "fdivp",
  207       "fdivr", "fdivrp", "femms", "feni", "ffree", "ffreep", "fiadd", "ficom", "ficomp",
  208       "fidiv", "fidivr", "fild", "fimul", "fincstp", "finit", "fist", "fistp", "fisttp",
  209       "fisub", "fisubr", "fld", "fld1", "fldcw", "fldenv", "fldl2e", "fldl2t", "fldlg2",
  210       "fldln2", "fldpi", "fldz", "fmul", "fmulp", "fnclex", "fndisi", "fneni", "fninit",
  211       "fnop", "fnsave", "fnstcw", "fnstenv", "fnstsw", "format", "fpatan", "fprem",
  212       "fprem1", "fptan", "frndint", "frstor", "frstpm", "fsave", "fscale", "fsetpm",
  213       "fsin", "fsincos", "fsqrt", "fst", "fstcw", "fstenv", "fstp", "fstsw", "fsub",
  214       "fsubp", "fsubr", "fsubrp", "ftst", "fucom", "fucomi", "fucomip", "fucomp",
  215       "fucompp", "fwait", "fxam", "fxch", "fxrstor", "fxsave", "fxtract", "fyl2x",
  216       "fyl2xp1", "getsec", "haddps", "heap", "hlt", "hsubps", "icebp", "idiv", "if",
  217       "imul", "in", "inc", "ins", "insb", "insertps", "insertq", "int", "int1", "int3",
  218       "invd", "invlpg", "invlpga", "iret", "ja", "jae", "jb", "jbe", "jc", "je", "jg",
  219       "jge", "jl", "jle", "jmp", "jna", "jnae", "jnb", "jnbe", "jnc", "jne", "jng", "jnge",
  220       "jnl", "jnle", "jno", "jnp", "jns", "jnz", "jo", "jp", "jpe", "jpo", "js", "jz",
  221       "kaddb", "kaddd", "kaddq", "kaddw", "kandb", "kandd", "kandnb", "kandnd", "kandnq",
  222       "kandnw", "kandq", "kandw", "kmovb", "kmovd", "kmovq", "kmovw", "knotb", "knotd",
  223       "knotq", "knotw", "korb", "kord", "korq", "kortestb", "kortestd", "kortestq",
  224       "kortestw", "korw", "kshiftlb", "kshiftld", "kshiftlq", "kshiftlw", "kshiftrb",
  225       "kshiftrd", "kshiftrq", "kshiftrw", "ktestb", "ktestd", "ktestq", "ktestw",
  226       "kunpckbw", "kunpckdq", "kunpckwd", "kxnorb", "kxnord", "kxnorq", "kxnorw", "kxorb",
  227       "kxord", "kxorq", "kxorw", "label", "lahf", "lar", "lddqu", "ldmxcsr", "lds", "lea",
  228       "leave", "les", "lfence", "lfs", "lgdt", "lgs", "lidt", "lldt", "llwpcb", "lmsw",
  229       "load", "loadall286", "loadall386", "lock", "lods", "lodsb", "loop", "loope",
  230       "loopne", "loopnz", "loopz", "lsl", "lss", "ltr", "lwpins", "lwpval", "lzcnt",
  231       "maskmovdqu", "maskmovq", "mfence", "monitor", "mov", "movapd", "movaps", "movbe",
  232       "movd", "movdq2q", "movdqa", "movdqu", "movhlps", "movhpd", "movhps", "movlhps",
  233       "movlpd", "movlps", "movmskpd", "movmskps", "movntdq", "movntdqa", "movnti",
  234       "movntpd", "movntps", "movntq", "movntsd", "movntss", "movq", "movq2dq", "movs",
  235       "movsb", "movsd", "movshdup", "movsldup", "movss", "movsx", "movsxd", "movupd",
  236       "movups", "movzx", "mul", "mulx", "mwait", "neg", "nop", "not", "or", "org", "out",
  237       "outs", "outsb", "palignr", "pause", "pclmulhqhdq", "pclmulhqhqdq", "pclmulhqlqdq",
  238       "pclmullqhdq", "pclmullqhqdq", "pclmullqlqdq", "pclmulqdq", "pcommit", "pdep",
  239       "pext", "pextrb", "pextrd", "pextrq", "pextrw", "pinsrb", "pinsrd", "pinsrq",
  240       "pinsrw", "pmovmskb", "pmovsxbd", "pmovsxbq", "pmovsxbw", "pmovsxdq", "pmovsxwd",
  241       "pmovsxwq", "pmovzxbd", "pmovzxbq", "pmovzxbw", "pmovzxdq", "pmovzxwd", "pmovzxwq",
  242       "pop", "popcnt", "popd", "popf", "popq", "popw", "prefetch", "prefetchnta",
  243       "prefetcht0", "prefetcht1", "prefetcht2", "prefetchw", "prefetchwt1", "pshufd",
  244       "pshufhw", "pshuflw", "pshufw", "pslldq", "psrldq", "public", "push", "pushd",
  245       "pushf", "pushq", "pushw", "rcl", "rcr", "rdfsbase", "rdgsbase", "rdmsr", "rdpkru",
  246       "rdpmc", "rdrand", "rdseed", "rdtsc", "rdtscp", "rep", "repe", "repeat", "repne",
  247       "repnz", "repz", "ret", "retf", "retn", "rol", "ror", "rorx", "rsm", "sahf", "sal",
  248       "sar", "sarx", "sbb", "scas", "scasb", "section", "segment", "seta", "setae", "setb",
  249       "setbe", "setc", "sete", "setg", "setge", "setl", "setle", "setna", "setnae",
  250       "setnb", "setnbe", "setnc", "setne", "setng", "setnge", "setnl", "setnle", "setno",
  251       "setnp", "setns", "setnz", "seto", "setp", "setpe", "setpo", "sets", "setz",
  252       "sfence", "sgdt", "shl", "shld", "shlx", "shr", "shrd", "shrx", "sidt", "skinit",
  253       "sldt", "slwpcb", "smsw", "stac", "stack", "stc", "std", "stgi", "sti", "stmxcsr",
  254       "store", "stos", "stosb", "str", "sub", "swapgs", "syscall", "sysenter", "sysexit",
  255       "sysret", "t1mskc", "test", "times", "tzcnt", "tzmsk", "ucomisd", "ucomiss", "ud2",
  256       "useavx256", "useavx512", "verr", "verw", "vgatherdpd", "vgatherdps", "vgatherpf0dpd",
  257       "vgatherpf0dps", "vgatherpf0qpd", "vgatherpf0qps", "vgatherpf1dpd", "vgatherpf1dps",
  258       "vgatherpf1qpd", "vgatherpf1qps", "vgatherqpd", "vgatherqps", "virtual", "vldmxcsr",
  259       "vmcall", "vmfunc", "vmlaunch", "vmload", "vmmcall", "vmresume", "vmrun", "vmsave",
  260       "vmxoff", "vpcmov", "vpermil2pd", "vpermil2ps", "vpermilmo2pd", "vpermilmo2ps",
  261       "vpermilmz2pd", "vpermilmz2ps", "vpermiltd2pd", "vpermiltd2ps", "vpgatherdd",
  262       "vpgatherdq", "vpgatherqd", "vpgatherqq", "vpscatterdd", "vpscatterdq", "vpscatterqd",
  263       "vpscatterqq", "vscatterdpd", "vscatterdps", "vscatterpf0dpd", "vscatterpf0dps",
  264       "vscatterpf0qpd", "vscatterpf0qps", "vscatterpf1dpd", "vscatterpf1dps",
  265       "vscatterpf1qpd", "vscatterpf1qps", "vscatterqpd", "vscatterqps", "vstmxcsr",
  266       "vzeroall", "vzeroupper", "wait", "wbinvd", "while", "wrfsbase", "wrgsbase", "wrmsr",
  267       "wrpkru", "xabort", "xacquire", "xadd", "xbegin", "xchg", "xend", "xgetbv", "xlat",
  268       "xlatb", "xor", "xrelease", "xrstor", "xsave", "xsaveopt", "xsetbv", "xtest",
  269 
  270     -- 16bit
  271       "cbw", "cmpsw", "cwd", "fldenvw", "fnsavew", "fnstenvw", "frstorw", "fsavew",
  272       "fstenvw", "insw", "iretw", "jcxz", "lodsw", "loopew", "loopnew", "loopnzw", "loopw",
  273       "loopzw", "movsw", "outsw", "popfw", "pushfw", "retfw", "retnw", "retw", "scasw",
  274       "stosw",
  275     -- 16bit (except 64)
  276       "popaw", "pushaw",
  277 
  278     -- 32bit
  279       "cdq", "cwde", "fldenvd", "fnsaved", "fnstenvd", "frstord", "fsaved", "fstenvd",
  280       "insd", "iretd", "jecxz", "lodsd", "loopd", "looped", "loopned", "loopnzd", "loopzd",
  281       "outsd", "retfd", "scasd", "stosd",
  282     -- 32bit (except 64)
  283       "popad", "popfd", "pushad", "pushfd", "retd", "retnd",
  284 
  285     -- 64bit
  286       "cdqe", "cmpsq", "cqo", "fxrstor64", "fxsave64", "iretq", "jrcxz", "lodsq", "loopeq",
  287       "loopneq", "loopnzq", "loopq", "loopzq", "movsq", "rdmsrq", "retfq", "scasq",
  288       "stosq", "sysexitq", "sysretq", "wrmsrq", "xrstor64", "xsave64", "xsaveopt64",
  289     -- 64bit only
  290       "popfq", "pushfq", "retnq", "retq",
  291 
  292     -- NOT 64bit
  293       "aaa", "aas", "daa", "das", "into", "popa", "pusha", "salc", "setalc",
  294 
  295     -- FMA Instructions
  296       "vfmadd132pd", "vfmadd132ps", "vfmadd132sd", "vfmadd132ss", "vfmadd213pd",
  297       "vfmadd213ps", "vfmadd213sd", "vfmadd213ss", "vfmadd231pd", "vfmadd231ps",
  298       "vfmadd231sd", "vfmadd231ss", "vfmaddsub132pd", "vfmaddsub132ps", "vfmaddsub213pd",
  299       "vfmaddsub213ps", "vfmaddsub231pd", "vfmaddsub231ps", "vfmsub132pd", "vfmsub132ps",
  300       "vfmsub132sd", "vfmsub132ss", "vfmsub213pd", "vfmsub213ps", "vfmsub213sd",
  301       "vfmsub213ss", "vfmsub231pd", "vfmsub231ps", "vfmsub231sd", "vfmsub231ss",
  302       "vfmsubadd132pd", "vfmsubadd132ps", "vfmsubadd213pd", "vfmsubadd213ps",
  303       "vfmsubadd231pd", "vfmsubadd231ps", "vfnmadd132pd", "vfnmadd132ps", "vfnmadd132sd",
  304       "vfnmadd132ss", "vfnmadd213pd", "vfnmadd213ps", "vfnmadd213sd", "vfnmadd213ss",
  305       "vfnmadd231pd", "vfnmadd231ps", "vfnmadd231sd", "vfnmadd231ss", "vfnmsub132pd",
  306       "vfnmsub132ps", "vfnmsub132sd", "vfnmsub132ss", "vfnmsub213pd", "vfnmsub213ps",
  307       "vfnmsub213sd", "vfnmsub213ss", "vfnmsub231pd", "vfnmsub231ps", "vfnmsub231sd",
  308       "vfnmsub231ss",
  309 
  310     -- FMA4 Instructions
  311       "vfmaddpd", "vfmaddps", "vfmaddsd", "vfmaddss", "vfmaddsubpd", "vfmaddsubps",
  312       "vfmsubaddpd", "vfmsubaddps", "vfmsubpd", "vfmsubps", "vfmsubsd", "vfmsubss",
  313       "vfnmaddpd", "vfnmaddps", "vfnmaddsd", "vfnmaddss", "vfnmsubpd", "vfnmsubps",
  314       "vfnmsubsd", "vfnmsubss",
  315 
  316     -- MMX Instructions
  317       "packssdw", "packsswb", "packuswb", "paddb", "paddd", "paddq", "paddsb", "paddsw",
  318       "paddusb", "paddusw", "paddw", "pand", "pandn", "pavgb", "pavgw", "pcmpeqb",
  319       "pcmpeqd", "pcmpeqw", "pcmpgtb", "pcmpgtd", "pcmpgtw", "pmaddwd", "pmaxsw", "pmaxub",
  320       "pminsw", "pminub", "pmulhuw", "pmulhw", "pmullw", "pmuludq", "por", "psadbw",
  321       "pslld", "psllq", "psllw", "psrad", "psraw", "psrld", "psrlq", "psrlw", "psubb",
  322       "psubd", "psubq", "psubsb", "psubsw", "psubusb", "psubusw", "psubw", "punpckhbw",
  323       "punpckhdq", "punpckhwd", "punpcklbw", "punpckldq", "punpcklwd", "pxor",
  324 
  325     -- SSE Instructions
  326       "addpd", "addps", "addsd", "addss", "addsubpd", "andnpd", "andnps", "andpd", "andps",
  327       "cvtdq2ps", "cvtpd2ps", "cvtps2dq", "cvtsd2ss", "cvtss2sd", "cvttpd2dq", "divpd",
  328       "divps", "divsd", "divss", "haddpd", "hsubpd", "maxpd", "maxps", "maxsd", "maxss",
  329       "minpd", "minps", "minsd", "minss", "movddup", "mulpd", "mulps", "mulsd", "mulss",
  330       "orpd", "orps", "punpckhqdq", "punpcklqdq", "rcpps", "rcpss", "rsqrtps", "rsqrtss",
  331       "shufpd", "shufps", "sqrtpd", "sqrtps", "sqrtsd", "sqrtss", "subpd", "subps",
  332       "subsd", "subss", "unpckhpd", "unpckhps", "unpcklpd", "unpcklps", "xorpd", "xorps",
  333 
  334     -- SSE4 Instructions
  335       "aesdec", "aesdeclast", "aesenc", "aesenclast", "aesimc", "aeskeygenassist",
  336       "blendpd", "blendps", "blendvpd", "blendvps", "dppd", "dpps", "mpsadbw", "packusdw",
  337       "pblendvb", "pblendw", "pcmpeqq", "pcmpestri", "pcmpestrm", "pcmpgtq", "pcmpistri",
  338       "pcmpistrm", "phminposuw", "pmaxsb", "pmaxsd", "pmaxud", "pmaxuw", "pminsb",
  339       "pminsd", "pminud", "pminuw", "pmuldq", "pmulld", "ptest", "roundpd", "roundps",
  340       "roundsd", "roundss", "sha1msg1", "sha1msg2", "sha1nexte", "sha1rnds4", "sha256msg1",
  341       "sha256msg2", "sha256rnds2",
  342 
  343     -- SSSE3 Instructions
  344       "pabsb", "pabsd", "pabsw", "phaddd", "phaddsw", "phaddw", "phsubd", "phsubsw",
  345       "phsubw", "pmaddubsw", "pmulhrsw", "pshufb", "psignb", "psignd", "psignw",
  346 
  347     -- AVX Instructions
  348       "vaddpd", "vaddps", "vaddsd", "vaddss", "vaddsubpd", "vaddsubps", "vaesdec",
  349       "vaesdeclast", "vaesenc", "vaesenclast", "vaesimc", "vaeskeygenassist", "valignd",
  350       "valignq", "vandnpd", "vandnps", "vandpd", "vandps", "vblendmpd", "vblendmps",
  351       "vblendpd", "vblendps", "vblendvpd", "vblendvps", "vbroadcastf128", "vbroadcasti128",
  352       "vbroadcastsd", "vbroadcastss", "vcmpeq_ospd", "vcmpeq_osps", "vcmpeq_ossd",
  353       "vcmpeq_osss", "vcmpeq_uqpd", "vcmpeq_uqps", "vcmpeq_uqsd", "vcmpeq_uqss",
  354       "vcmpeq_uspd", "vcmpeq_usps", "vcmpeq_ussd", "vcmpeq_usss", "vcmpeqpd", "vcmpeqps",
  355       "vcmpeqsd", "vcmpeqss", "vcmpfalse_ospd", "vcmpfalse_osps", "vcmpfalse_ossd",
  356       "vcmpfalse_osss", "vcmpfalsepd", "vcmpfalseps", "vcmpfalsesd", "vcmpfalsess",
  357       "vcmpge_oqpd", "vcmpge_oqps", "vcmpge_oqsd", "vcmpge_oqss", "vcmpgepd", "vcmpgeps",
  358       "vcmpgesd", "vcmpgess", "vcmpgt_oqpd", "vcmpgt_oqps", "vcmpgt_oqsd", "vcmpgt_oqss",
  359       "vcmpgtpd", "vcmpgtps", "vcmpgtsd", "vcmpgtss", "vcmple_oqpd", "vcmple_oqps",
  360       "vcmple_oqsd", "vcmple_oqss", "vcmplepd", "vcmpleps", "vcmplesd", "vcmpless",
  361       "vcmplt_oqpd", "vcmplt_oqps", "vcmplt_oqsd", "vcmplt_oqss", "vcmpltpd", "vcmpltps",
  362       "vcmpltsd", "vcmpltss", "vcmpneq_oqpd", "vcmpneq_oqps", "vcmpneq_oqsd", "vcmpneq_oqss",
  363       "vcmpneq_ospd", "vcmpneq_osps", "vcmpneq_ossd", "vcmpneq_osss", "vcmpneq_uspd",
  364       "vcmpneq_usps", "vcmpneq_ussd", "vcmpneq_usss", "vcmpneqpd", "vcmpneqps",
  365       "vcmpneqsd", "vcmpneqss", "vcmpnge_uqpd", "vcmpnge_uqps", "vcmpnge_uqsd",
  366       "vcmpnge_uqss", "vcmpngepd", "vcmpngeps", "vcmpngesd", "vcmpngess", "vcmpngt_uqpd",
  367       "vcmpngt_uqps", "vcmpngt_uqsd", "vcmpngt_uqss", "vcmpngtpd", "vcmpngtps",
  368       "vcmpngtsd", "vcmpngtss", "vcmpnle_uqpd", "vcmpnle_uqps", "vcmpnle_uqsd",
  369       "vcmpnle_uqss", "vcmpnlepd", "vcmpnleps", "vcmpnlesd", "vcmpnless", "vcmpnlt_uqpd",
  370       "vcmpnlt_uqps", "vcmpnlt_uqsd", "vcmpnlt_uqss", "vcmpnltpd", "vcmpnltps",
  371       "vcmpnltsd", "vcmpnltss", "vcmpord_spd", "vcmpord_sps", "vcmpord_ssd", "vcmpord_sss",
  372       "vcmpordpd", "vcmpordps", "vcmpordsd", "vcmpordss", "vcmppd", "vcmpps", "vcmpsd",
  373       "vcmpss", "vcmptrue_uspd", "vcmptrue_usps", "vcmptrue_ussd", "vcmptrue_usss",
  374       "vcmptruepd", "vcmptrueps", "vcmptruesd", "vcmptruess", "vcmpunord_spd",
  375       "vcmpunord_sps", "vcmpunord_ssd", "vcmpunord_sss", "vcmpunordpd", "vcmpunordps",
  376       "vcmpunordsd", "vcmpunordss", "vcomisd", "vcomiss", "vcompresspd", "vcompressps",
  377       "vcvtdq2pd", "vcvtdq2ps", "vcvtpd2dq", "vcvtpd2ps", "vcvtpd2qq", "vcvtpd2udq",
  378       "vcvtpd2uqq", "vcvtph2ps", "vcvtps2dq", "vcvtps2pd", "vcvtps2ph", "vcvtps2qq",
  379       "vcvtps2udq", "vcvtps2uqq", "vcvtqq2pd", "vcvtqq2ps", "vcvtsd2si", "vcvtsd2ss",
  380       "vcvtsd2usi", "vcvtsi2sd", "vcvtsi2ss", "vcvtss2sd", "vcvtss2si", "vcvtss2usi",
  381       "vcvttpd2dq", "vcvttpd2qq", "vcvttpd2udq", "vcvttpd2uqq", "vcvttps2dq", "vcvttps2qq",
  382       "vcvttps2udq", "vcvttps2uqq", "vcvttsd2si", "vcvttsd2usi", "vcvttss2si", "vcvttss2usi",
  383       "vcvtudq2pd", "vcvtudq2ps", "vcvtuqq2pd", "vcvtuqq2ps", "vcvtusi2sd", "vcvtusi2ss",
  384       "vdbpsadbw", "vdivpd", "vdivps", "vdivsd", "vdivss", "vdppd", "vdpps", "vexpandpd",
  385       "vexpandps", "vextractf128", "vextracti128", "vextractps", "vhaddpd", "vhaddps",
  386       "vhsubpd", "vhsubps", "vinsertf128", "vinserti128", "vinsertps", "vlddqu",
  387       "vmaskmovdqu", "vmaskmovpd", "vmaskmovps", "vmaxpd", "vmaxps", "vmaxsd", "vmaxss",
  388       "vminpd", "vminps", "vminsd", "vminss", "vmovapd", "vmovaps", "vmovd", "vmovddup",
  389       "vmovdqa", "vmovdqu", "vmovhlps", "vmovhpd", "vmovhps", "vmovlhps", "vmovlpd",
  390       "vmovlps", "vmovmskpd", "vmovmskps", "vmovntdq", "vmovntdqa", "vmovntpd", "vmovntps",
  391       "vmovq", "vmovsd", "vmovshdup", "vmovsldup", "vmovss", "vmovupd", "vmovups",
  392       "vmpsadbw", "vmulpd", "vmulps", "vmulsd", "vmulss", "vorpd", "vorps", "vpabsb",
  393       "vpabsd", "vpabsq", "vpabsw", "vpackssdw", "vpacksswb", "vpackusdw", "vpackuswb",
  394       "vpaddb", "vpaddd", "vpaddq", "vpaddsb", "vpaddsw", "vpaddusb", "vpaddusw", "vpaddw",
  395       "vpalignr", "vpand", "vpandd", "vpandn", "vpandnd", "vpandnq", "vpandq", "vpavgb",
  396       "vpavgw", "vpblendd", "vpblendmb", "vpblendmd", "vpblendmq", "vpblendmw",
  397       "vpblendvb", "vpblendw", "vpbroadcastb", "vpbroadcastd", "vpbroadcastq",
  398       "vpbroadcastw", "vpclmulhqhdq", "vpclmulhqlqdq", "vpclmullqhdq", "vpclmullqlqdq",
  399       "vpclmulqdq", "vpcmpeqb", "vpcmpeqd", "vpcmpeqq", "vpcmpeqw", "vpcmpestri",
  400       "vpcmpestrm", "vpcmpgtb", "vpcmpgtd", "vpcmpgtq", "vpcmpgtw", "vpcmpistri",
  401       "vpcmpistrm", "vpcompressd", "vpcompressq", "vpconflictd", "vpconflictq",
  402       "vperm2f128", "vperm2i128", "vpermb", "vpermd", "vpermi2b", "vpermi2d", "vpermi2pd",
  403       "vpermi2ps", "vpermi2q", "vpermi2w", "vpermilpd", "vpermilps", "vpermpd", "vpermps",
  404       "vpermq", "vpermt2b", "vpermt2d", "vpermt2pd", "vpermt2ps", "vpermt2q", "vpermt2w",
  405       "vpermw", "vpexpandd", "vpexpandq", "vpextrb", "vpextrd", "vpextrq", "vpextrw",
  406       "vphaddd", "vphaddsw", "vphaddw", "vphminposuw", "vphsubd", "vphsubsw", "vphsubw",
  407       "vpinsrb", "vpinsrd", "vpinsrq", "vpinsrw", "vplzcntd", "vplzcntq", "vpmadd52huq",
  408       "vpmadd52luq", "vpmaddubsw", "vpmaddwd", "vpmaskmovd", "vpmaskmovq", "vpmaxsb",
  409       "vpmaxsd", "vpmaxsq", "vpmaxsw", "vpmaxub", "vpmaxud", "vpmaxuq", "vpmaxuw",
  410       "vpminsb", "vpminsd", "vpminsq", "vpminsw", "vpminub", "vpminud", "vpminuq",
  411       "vpminuw", "vpmovmskb", "vpmovsxbd", "vpmovsxbq", "vpmovsxbw", "vpmovsxdq",
  412       "vpmovsxwd", "vpmovsxwq", "vpmovzxbd", "vpmovzxbq", "vpmovzxbw", "vpmovzxdq",
  413       "vpmovzxwd", "vpmovzxwq", "vpmuldq", "vpmulhrsw", "vpmulhuw", "vpmulhw", "vpmulld",
  414       "vpmullq", "vpmullw", "vpmultishiftqb", "vpmuludq", "vpor", "vpord", "vporq",
  415       "vprolvd", "vprolvq", "vprorvd", "vprorvq", "vpsadbw", "vpshufb", "vpshufd",
  416       "vpshufhw", "vpshuflw", "vpsignb", "vpsignd", "vpsignw", "vpslld", "vpslldq",
  417       "vpsllq", "vpsllvd", "vpsllvq", "vpsllvw", "vpsllw", "vpsrad", "vpsraq", "vpsravd",
  418       "vpsravq", "vpsravw", "vpsraw", "vpsrld", "vpsrldq", "vpsrlq", "vpsrlvd", "vpsrlvq",
  419       "vpsrlvw", "vpsrlw", "vpsubb", "vpsubd", "vpsubq", "vpsubsb", "vpsubsw", "vpsubusb",
  420       "vpsubusw", "vpsubw", "vpternlogd", "vpternlogq", "vptest", "vpunpckhbw",
  421       "vpunpckhdq", "vpunpckhqdq", "vpunpckhwd", "vpunpcklbw", "vpunpckldq", "vpunpcklqdq",
  422       "vpunpcklwd", "vpxor", "vpxord", "vpxorq", "vrcpps", "vrcpss", "vroundpd",
  423       "vroundps", "vroundsd", "vroundss", "vrsqrtps", "vrsqrtss", "vshufpd", "vshufps",
  424       "vsqrtpd", "vsqrtps", "vsqrtsd", "vsqrtss", "vsubpd", "vsubps", "vsubsd", "vsubss",
  425       "vtestpd", "vtestps", "vucomisd", "vucomiss", "vunpckhpd", "vunpckhps", "vunpcklpd",
  426       "vunpcklps", "vxorpd", "vxorps",
  427 
  428     -- AVX-512 Instructions
  429       "vbroadcastf32x2", "vbroadcastf32x4", "vbroadcastf32x8", "vbroadcastf64x2",
  430       "vbroadcastf64x4", "vbroadcasti32x2", "vbroadcasti32x4", "vbroadcasti32x8",
  431       "vbroadcasti64x2", "vbroadcasti64x4", "vexp2pd", "vexp2ps", "vextractf32x4",
  432       "vextractf32x8", "vextractf64x2", "vextractf64x4", "vextracti32x4", "vextracti32x8",
  433       "vextracti64x2", "vextracti64x4", "vfixupimmpd", "vfixupimmps", "vfixupimmsd",
  434       "vfixupimmss", "vfpclasspd", "vfpclassps", "vfpclasssd", "vfpclassss", "vgetexppd",
  435       "vgetexpps", "vgetexpsd", "vgetexpss", "vgetmantpd", "vgetmantps", "vgetmantsd",
  436       "vgetmantss", "vinsertf32x4", "vinsertf32x8", "vinsertf64x2", "vinsertf64x4",
  437       "vinserti32x4", "vinserti32x8", "vinserti64x2", "vinserti64x4", "vmovdqa32",
  438       "vmovdqa64", "vmovdqu16", "vmovdqu32", "vmovdqu64", "vmovdqu8", "vpbroadcastmb2q",
  439       "vpbroadcastmw2d", "vpcmpb", "vpcmpd", "vpcmpleb", "vpcmpled", "vpcmpleq", "vpcmpleub",
  440       "vpcmpleud", "vpcmpleuq", "vpcmpleuw", "vpcmplew", "vpcmpltb", "vpcmpltd",
  441       "vpcmpltq", "vpcmpltub", "vpcmpltud", "vpcmpltuq", "vpcmpltuw", "vpcmpltw",
  442       "vpcmpneqb", "vpcmpneqd", "vpcmpneqq", "vpcmpnequb", "vpcmpnequd", "vpcmpnequq",
  443       "vpcmpnequw", "vpcmpneqw", "vpcmpnleb", "vpcmpnled", "vpcmpnleq", "vpcmpnleub",
  444       "vpcmpnleud", "vpcmpnleuq", "vpcmpnleuw", "vpcmpnlew", "vpcmpnltb", "vpcmpnltd",
  445       "vpcmpnltq", "vpcmpnltub", "vpcmpnltud", "vpcmpnltuq", "vpcmpnltuw", "vpcmpnltw",
  446       "vpcmpq", "vpcmpub", "vpcmpud", "vpcmpuq", "vpcmpuw", "vpcmpw", "vpmovb2m",
  447       "vpmovd2m", "vpmovdb", "vpmovdw", "vpmovm2b", "vpmovm2d", "vpmovm2q", "vpmovm2w",
  448       "vpmovq2m", "vpmovqb", "vpmovqd", "vpmovqw", "vpmovsdb", "vpmovsdw", "vpmovsqb",
  449       "vpmovsqd", "vpmovsqw", "vpmovswb", "vpmovusdb", "vpmovusdw", "vpmovusqb",
  450       "vpmovusqd", "vpmovusqw", "vpmovuswb", "vpmovw2m", "vpmovwb", "vprold", "vprolq",
  451       "vprord", "vprorq", "vptestmb", "vptestmd", "vptestmq", "vptestmw", "vptestnmb",
  452       "vptestnmd", "vptestnmq", "vptestnmw", "vrangepd", "vrangeps", "vrangesd",
  453       "vrangess", "vrcp14pd", "vrcp14ps", "vrcp14sd", "vrcp14ss", "vrcp28pd", "vrcp28ps",
  454       "vrcp28sd", "vrcp28ss", "vreducepd", "vreduceps", "vreducesd", "vreducess",
  455       "vrndscalepd", "vrndscaleps", "vrndscalesd", "vrndscaless", "vrsqrt14pd",
  456       "vrsqrt14ps", "vrsqrt14sd", "vrsqrt14ss", "vrsqrt28pd", "vrsqrt28ps", "vrsqrt28sd",
  457       "vrsqrt28ss", "vscalefpd", "vscalefps", "vscalefsd", "vscalefss", "vshuff32x4",
  458       "vshuff64x2", "vshufi32x4", "vshufi64x2",
  459 
  460     -- XOP Instructions
  461       "vfrczpd", "vfrczps", "vfrczsd", "vfrczss", "vpcomb", "vpcomd", "vpcomeqb",
  462       "vpcomeqd", "vpcomeqq", "vpcomequb", "vpcomequd", "vpcomequq", "vpcomequw",
  463       "vpcomeqw", "vpcomfalseb", "vpcomfalsed", "vpcomfalseq", "vpcomfalseub",
  464       "vpcomfalseud", "vpcomfalseuq", "vpcomfalseuw", "vpcomfalsew", "vpcomgeb",
  465       "vpcomged", "vpcomgeq", "vpcomgeub", "vpcomgeud", "vpcomgeuq", "vpcomgeuw",
  466       "vpcomgew", "vpcomgtb", "vpcomgtd", "vpcomgtq", "vpcomgtub", "vpcomgtud",
  467       "vpcomgtuq", "vpcomgtuw", "vpcomgtw", "vpcomleb", "vpcomled", "vpcomleq",
  468       "vpcomleub", "vpcomleud", "vpcomleuq", "vpcomleuw", "vpcomlew", "vpcomltb",
  469       "vpcomltd", "vpcomltq", "vpcomltub", "vpcomltud", "vpcomltuq", "vpcomltuw",
  470       "vpcomltw", "vpcomneqb", "vpcomneqd", "vpcomneqq", "vpcomnequb", "vpcomnequd",
  471       "vpcomnequq", "vpcomnequw", "vpcomneqw", "vpcomq", "vpcomtrueb", "vpcomtrued",
  472       "vpcomtrueq", "vpcomtrueub", "vpcomtrueud", "vpcomtrueuq", "vpcomtrueuw",
  473       "vpcomtruew", "vpcomub", "vpcomud", "vpcomuq", "vpcomuw", "vpcomw", "vphaddbd",
  474       "vphaddbq", "vphaddbw", "vphadddq", "vphaddubd", "vphaddubq", "vphaddubw",
  475       "vphaddudq", "vphadduwd", "vphadduwq", "vphaddwd", "vphaddwq", "vphsubbw",
  476       "vphsubdq", "vphsubwd", "vpmacsdd", "vpmacsdqh", "vpmacsdql", "vpmacssdd",
  477       "vpmacssdqh", "vpmacssdql", "vpmacsswd", "vpmacssww", "vpmacswd", "vpmacsww",
  478       "vpmadcsswd", "vpmadcswd", "vpperm", "vprotb", "vprotd", "vprotq", "vprotw",
  479       "vpshab", "vpshad", "vpshaq", "vpshaw", "vpshlb", "vpshld", "vpshlq", "vpshlw",
  480 
  481     -- 3DNow! Instructions
  482       "pavgusb", "pf2id", "pf2iw", "pfacc", "pfadd", "pfcmpeq", "pfcmpge", "pfcmpgt",
  483       "pfmax", "pfmin", "pfmul", "pfnacc", "pfpnacc", "pfrcp", "pfrcpit1", "pfrcpit2",
  484       "pfrsqit1", "pfrsqrt", "pfsub", "pfsubr", "pi2fd", "pi2fw", "pmulhrw", "pswapd",
  485 
  486     -- VMX Instructions
  487       "invept", "invpcid", "invvpid", "vmclear", "vmptrld", "vmptrst", "vmread",
  488       "vmwrite", "vmxon",
  489     },
  490   },
  491   { Id=3, -- ============================= LABELS ==============================
  492     Regex=[[ ^\s*([.]{0,2}[A-Za-z0-9_]+): ]] ----- Labels defined with ":" -----
  493   },
  494   { Id=3, -- ------------------------ Labeled directive -------------- [See: #C]
  495     Regex=[[ ^\s*([.]{0,2}[A-Za-z0-9_]+)[ \t]+(?:d[bdfpqtuw]|r[bdfpqtw]|file) ]]
  496   },
  497   { Id=3, -- ------------------------ Anonymous Labels -------------------------
  498     Regex=[[ (@[@brf]) ]]                                           -- [See: #5]
  499   },
  500   { Id=3, -- ------------------------- The $ Operator- -------------------------
  501     Regex=[[ (?<!\w|\$)\${1,2}(?!\w|\$) ]]                          -- [See: #6]
  502     -- $  = Current offset in an addressing space.
  503     -- $$ = base address of current addressing space.
  504   },
  505   { Id=4, -- ====================== COMPILER DIRECTIVES ========================
  506     List={
  507       "z",       -- ??? undocumented                                   [See: #A]
  508     -- Size operators
  509       "byte", "word", "dword", "fword", "pword", "qword",     -- 8, 16, 32, 48, 48, 64 bit
  510       "tbyte", "tword", "dqword", "xword", "qqword", "yword", -- 80, 80, 128, 128, 256, 256 bit
  511       "zword",   -- ??? undocumented                                   [See: #B]
  512       "dqqword", -- ??? undocumented                                   [See: #B]
  513     -- Data directives
  514       "db", "dd", "df", "dp", "dq", "dt", "du", "dw", -- Define    (initialized data)
  515       "rb", "rd", "rf", "rp", "rq", "rt", "rw",       -- Reserve (uninitialized data)
  516       "file",                                         -- Include from file
  517     -- Jump types
  518       "short", "near", "far",
  519     -- Preprocessor directives
  520       "define", "include", "irp", "irps", "irpv", "macro", "match", "postpone",
  521       "purge", "rept", "restore", "restruc", "struc",
  522     -- Macro directives
  523       "common", "forward", "local", "reverse",
  524     -- Directive operators
  525       "align", "as", "at", "defined", "dup", "eq", "eqtype", "from", "in", "on",
  526       "ptr", "relativeto", "used",
  527     -- AVX-512 rounding modes
  528       "rd", "rn", "ru", "rz", "sae",
  529     -- Memory operand modifiers (unity multiplier)
  530       "1to2", "1to4", "1to8", "1to16", "1to32", "1to64",            -- [See: #3]
  531     -- Format directives
  532       "binary", "use16", "use32", "use64",
  533       -- MS-DOS MZ executable
  534       "mz",
  535       -- PE (Portable Executable)
  536       "pe", "pe64",
  537       "console", "gui", "native", "efi", "efiboot", "efiruntime", "dll", "wdm",
  538       "nx", "large",
  539       -- COFF (Common Object File Format)
  540       "coff",
  541       "ms", "ms64", "static",
  542       -- ELF (Executable and Linkable Format)
  543       "elf", "elf64",
  544       "interpreter", "dynamic", "note", "gnustack", "gnuehframe",
  545     -- Section directives
  546       "code", "data", "readable", "writable", "writeable", "executable",
  547       "shareable", "discardable", "notpageable", "linkremove", "linkinfo",
  548       "export", "import", "resource", "fixups",
  549     },
  550   },
  551 }
  552 
  553 --[[
  554 ================================================================================
  555                                     NOTES
  556 ================================================================================
  557 [ 1]  ESCAPED QUOTES -- Two consecutive single- ('') or double-quotes ("") inside
  558       a string are treated as a single literal quote. The negative lookarounds
  559       in the RegEx ensure that escaped quotes don't cause the current string to
  560       end and immediately start a new one -- as would happen with a simpler
  561       [=["|']=] RegEx, which "seems" to work but actually breaks single strings
  562       into multiple one.
  563 
  564 [ 2]  IP REGISTER -- Omission of the 'ip' register (16-bit) from the keywords
  565       is not a mistake. Even though I've seen in it in most highlighters syntax
  566       files I've looked into, it is not a part of FASM's reserved keywords and
  567       no instruction refers to it, so it shouldn't be highlighted.
  568 
  569 [ 3]  The tokens "1to32" and "1to64" are not present in "TABLE.INC", but they
  570       are mentioned in FASM's (1.71) online documentation. So I've manually
  571       added them to ensure backward compatibility with older code.
  572 [ 4]  OCTAL "Q" -- The alternative "q" syntax for octal numbers was introduced
  573       in Fasm v1.71.56.
  574 [ 5]  "@@" ANONYMOUS LABELS -- The anonymous labels token "@@", "@b"/"@r" and
  575       "@f" were manually added (not in 'TABLE.INC').
  576 [ 6]  "$" AND "$$" -- Manually added (not in 'TABLE.INC'). I've arbitrarily
  577       chosen to highlight them with samle color as labels, for two reasons:
  578       (1) like labels, they define an offset in the memory space; therefore
  579       color-sameness make sense; (2) they usually appear next to arythmetic
  580       operators, so a different coloring is preferable.
  581 ================================================================================
  582                               TODO / KNOWN ISSUES
  583 ================================================================================
  584 [ A] "Z" TOKEN -- I haven't found any references about the "z" token, and I'm
  585       not sure how it should be handled by the highlighter.
  586 [ B] "ZWORD" AND "DQQWORD" -- I couldn't find any references for the "zword"
  587       and "dqqword" tokens, they are undocumented. I assume them to be Size
  588       operators.
  589 [ C]  Labeled directives are matched only if the line is not interrputed by a
  590       "\" character (carry on next line). Catching similar cases would have
  591       been too complex (comments can follow the "\").
  592       So highlighting of this label will fail:
  593 
  594         some_label \   ; <- this edge case is hard to catch!
  595             db 224
  596 [ D]  This file contains only tokens found in FASM v1.71.60, I'm not sure if
  597       older versions of FASM supported tokens which are now deprecated, but if
  598       this was the case it might be worth adding them to the keywords list so
  599       that older source code might be handled properly too.
  600 ================================================================================
  601                                   CHANGELOG
  602 ================================================================================
  603 v1.0 (2017/03/14)
  604   -- First release.
  605   -- Flat Assembler v1.71.60 (2017/03/04).
  606   -- Highlight v3.35 (2017/02/28).
  607 v1.1 (2017/03/14)
  608   -- Implemented some missing features for numbers (thanks to @bitRAKE for
  609     pointing them out):
  610     -- DECIMAL NUMBERS FIX: implemented the (optional) "d" suffix.
  611     -- ALL NUMBER TYPES FIX: implemented single quote (') and underscore (_) for
  612         splitting long numbers (eg: 1'000'000 or 1_000_000).
  613 ]]